Выполнение системных команд из MySQL с помощью UDF(lib_mysqludf_sys)
Сегодня понадобилось выполнить системную команду ОС Linux из MySQL. Оказалось, что сделать это из коробки не получится. Зато с одной замечательной библиотечкой всё вполне срослось.
Компиляция и установка
1. Качаем библиотеку lib_mysqludf_sys
2. Распаковываем архив, удаляем оттуда всё кроме lib_mysqludf_sys.c и lib_mysqludf_sys.sql
3. Компилируем библиотеку из c-файла
1 2 |
gcc -fPIC -Wall -g -c ./lib_mysqludf_sys.c gcc -g -fPIC -shared -Wl,-soname,lib_mysqludf_sys.so.0 -o lib_mysqludf_sys.so.0.0 lib_mysqludf_sys.c -lc |
3. Копируем .so файл в /usr/lib/mysql/plugins
1 |
cp ./lib_mysqludf_sys.so.0.0 /usr/lib/mysql/plugin/lib_mysqludf_sys.so |
4. Выполняем дамп lib_mysqludf_sys.sql
1 |
mysql -u root -p somedb < ./lib_mysqludf_sys.sql |
5. Проверяем результат:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
mysql> select sys_eval('uname -a'); +--------------------------------------------------------------------------------+ | sys_eval('uname -a') | +--------------------------------------------------------------------------------+ | Linux z11 2.6.36-0-vaioz #1 SMP Wed Oct 13 10:37:45 BST 2010 x86_64 GNU/Linux | +--------------------------------------------------------------------------------+ 1 row in set (0.00 sec) mysql> select sys_eval('whoami'); +--------------------+ | sys_eval('whoami') | +--------------------+ | mysql | +--------------------+ 1 row in set (0.00 sec) mysql> |
Теперь можно исполнять системные команды из mysql. Даже не буду говорить, что это опасно и является потенциальной дырой в безопасности. Думаю, сами знаете. Но именно таким образом можно построить мостик из MySQL во внешнее приложение.
Список добавляемых функций.
Библиоетка lib_mysqludf_sys
содержит несколько функций, которые позволяют взаимодействовать с операционной системой.
sys_eval
– выполняет переданную команду и возвращает её выводsys_exec
– выполняет переданную команду и возвращает её код возвратаsys_get
– получает значение переменной окруженияsys_set
– создает переменную окружения и устанавливает/обновляет её значение
Используйте функцию lib_mysqludf_sys_info()
для вывода информации о текущей версии библиотекиlib_mysqludf_sys
.
Литература
– http://www.mysqludf.org/libraries.php
– UDF в MySQL, json или то, как забрать обновления данных из БД