Выполнение системных команд из MySQL с помощью UDF(lib_mysqludf_sys)

// Апрель 19th, 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 содержит несколько функций, которые позволяют взаимодействовать с операционной системой.

  1. sys_eval — выполняет переданную команду и возвращает её вывод
  2. sys_exec — выполняет переданную команду и возвращает её код возврата
  3. sys_get — получает значение переменной окружения
  4. sys_set — создает переменную окружения и устанавливает/обновляет её значение

Используйте функцию lib_mysqludf_sys_info() для вывода информации о текущей версии библиотекиlib_mysqludf_sys.

Литература

http://www.mysqludf.org/libraries.php
UDF в MySQL, json или то, как забрать обновления данных из БД

Share

Спасибо!


Если вам помогла статья, или вы хотите поддержать мои исследования и блог - вот лучший способ сделать это:


Комментировать