Выполнение системных команд из MySQL с помощью UDF(lib_mysqludf_sys)
// 19 апреля, 2011 // MySQL
Сегодня понадобилось выполнить системную команду ОС Linux из MySQL. Оказалось, что сделать это из коробки не получится. Зато с одной замечательной библиотечкой всё вполне срослось.
Компиляция и установка
1. Качаем библиотеку lib_mysqludf_sys
2. Распаковываем архив, удаляем оттуда всё кроме lib_mysqludf_sys.c и lib_mysqludf_sys.sql
3. Компилируем библиотеку из c-файла
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
cp ./lib_mysqludf_sys.so.0.0 /usr/lib/mysql/plugin/lib_mysqludf_sys.so
4. Выполняем дамп lib_mysqludf_sys.sql
mysql -u root -p somedb < ./lib_mysqludf_sys.sql
5. Проверяем результат:
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 или то, как забрать обновления данных из БД
Спасибо!
Если вам помогла статья, или вы хотите поддержать мои исследования и блог - вот лучший способ сделать это: