Utilizzare Trigger e Stored Procedure in Mysql per eseguire un comando shell
Jump to navigation
Jump to search
Obiettivo
L'obiettivo è creare un link in /home quando si modifica un record in mysql
Installazione Plugin MySQL
- Per fare eseguire un comando shell a MySQL occorre installare un semplice plugin:
sudo apt-get install libmysqlclient-dev cd /tmp git clone https://github.com/mysqludf/lib_mysqludf_sys.git cd lib_mysqludf_sys/
- Modificare il MAkefile per Debian:
vi Makefile
#LIBDIR=/usr/lib LIBDIR=/usr/lib/mysql/plugin/ install: gcc -DMYSQL_DYNAMIC_PLUGIN -fPIC -Wall -I/usr/include/mysql -I. -shared lib_mysqludf_sys.c -o $(LIBDIR)/lib_mysqludf_sys.so #gcc -Wall -I/usr/include/mysql -I. -shared lib_mysqludf_sys.c -o $(LIBDIR)/lib_mysqludf_sys.so
- Installarlo:
sudo ./install.sh [sudo] password for mnt.vvngrl:
Compiling the MySQL UDF gcc -DMYSQL_DYNAMIC_PLUGIN -fPIC -Wall -I/usr/include/mysql -I. -shared lib_mysqludf_sys.c -o /usr/lib/mysql/plugin//lib_mysqludf_sys.so #gcc -Wall -I/usr/include/mysql -I. -shared lib_mysqludf_sys.c -o /usr/lib/mysql/plugin//lib_mysqludf_sys.so MySQL UDF compiled successfully Please provide your MySQL root password
Enter password:
MySQL UDF installed successfully
Creazione link su INSERT
- Creiamo ora la stored procedure che richiama il comando che crea il link:
DROP PROCEDURE IF EXISTS create_ftp_home_link_proc;
DELIMITER $$
CREATE PROCEDURE create_ftp_home_link_proc
(username CHAR(16),
homedir CHAR(255) )
BEGIN
DECLARE cmd CHAR(255);
DECLARE result CHAR(255);
SET cmd = CONCAT('/usr/bin/sudo /usr/local/sbin/create_ftp_home_link ', homedir, ' ' , username);
SET result = sys_eval(cmd);
END$$;
DELIMITER ;
- Creiamo il trigger eseguito all'inserimento:
DROP TRIGGER IF EXISTS create_ftp_home_link_trig; CREATE TRIGGER create_ftp_home_link_trig AFTER INSERT ON accounts FOR EACH ROW CALL create_ftp_home_link_proc(NEW.username, NEW.homedir);
- Creiamo lo script da eseguire:
sudoedit /usr/local/sbin/create_ftp_home_link
#/bin/bash # i comandi vengono eseguiti come user mysql, quindi questo script deve essere richiamato con sudo /bin/ln -s "$1" "/home/vsftpd/$2"
- Rendiamolo eseguibile
sudo chmod +x /usr/local/sbin/create_ftp_home_link
- Impostiamo la regola sudo per far eseguire il comando come root senza richiesta di password:
sudo visudo -f /etc/sudoers.d/create_ftp_home_link
mysql ALL=(root) NOPASSWD: /usr/local/sbin/create_ftp_home_link
- Testare lo script con sudo: deve creare il link senza chiedere la password per mysql
sudo ls sudo -u mysql sudo /usr/local/sbin/create_ftp_home_link /var/www/pippo /home/pippo
- Testare una insert e vedere se crea il link
- Se tutto funziona, creare la stessa procedura per l'eliminazione del link:
Eliminazione Link su DELETE
- Procedura eliminazione link:
- Creiamo ora la stored procedure che richiama il comando che crea il link:
DROP PROCEDURE delete_ftp_home_link_proc;
DELIMITER $$
CREATE PROCEDURE delete_ftp_home_link_proc
(username CHAR(16))
BEGIN
DECLARE cmd CHAR(255);
DECLARE result CHAR(255);
SET cmd = CONCAT('/usr/bin/sudo /usr/local/sbin/delete_ftp_home_link ', username);
SET result = sys_eval(cmd);
END$$;
DELIMITER ;
- Creare il trigger:
DROP TRIGGER IF EXISTS delete_ftp_home_link_trig; CREATE TRIGGER delete_ftp_home_link_trig AFTER DELETE ON accounts FOR EACH ROW CALL delete_ftp_home_link_proc(OLD.username);
- Creiamo lo script da eseguire:
sudoedit /usr/local/sbin/delete_ftp_home_link
#/bin/bash # i comandi vengono eseguiti come user mysql, quindi questo script deve essere richiamato con sudo /bin/rm -f "/home/vsftpd/$1"
- Rendiamolo eseguibile
sudo chmod +x /usr/local/sbin/delete_ftp_home_link
- Impostiamo la regola sudo per far eseguire il comando come root senza richiesta di password:
sudo visudo -f /etc/sudoers.d/delete_ftp_home_link
mysql ALL=(root) NOPASSWD: /usr/local/sbin/delete_ftp_home_link
- Rimuovere la riga e vedere se cancella il link
Modifica Link su UPDATE
- Si crea il trigger e la stored procedure del caso, richiamando gli script precedenti:
DROP PROCEDURE IF EXISTS modify_ftp_home_link_proc;
DELIMITER $$
CREATE PROCEDURE modify_ftp_home_link_proc
(username CHAR(16),
old_username CHAR(16),
homedir CHAR(255),
old_homedir CHAR(255))
BEGIN
DECLARE cmd CHAR(255);
DECLARE result CHAR(255);
SET cmd = CONCAT('/usr/bin/sudo /usr/local/sbin/delete_ftp_home_link ', old_username, ' ; /usr/bin/sudo /usr/local/sbin/create_ftp_home_link ', homedir, ' ' , username );
SET result = sys_eval(cmd);
END$$;
DELIMITER ;
- Creare il trigger:
DROP TRIGGER IF EXISTS modify_ftp_home_link_trig; CREATE TRIGGER modify_ftp_home_link_trig AFTER UPDATE ON accounts FOR EACH ROW CALL modify_ftp_home_link_proc(NEW.username, OLD.username, NEW.homedir, OLD.homedir);
Riferimenti
- MySQL Stored Procedure Tutorial
- MySQL Triggers
- Triggering a shell script from MySQL | Pattern Buffer:
- sql - Invoking a PHP script from a mysql trigger - Stack Overflow
- mysql - How to Edit Trigger in phpmyadmin in XAMPP? - Stack Overflow
- mysql - How can I find all the db trigger in phpMyAdmin? - Stack Overflow