У меня есть следующий код на Python, который подключается к локальной корневой базе данных в MySQL с помощью библиотеки pymysql:
#!/usr/bin/python3
import pymysql
db = pymysql.connect("localhost", "root", "redacted", "redacted")
cursor = db.cursor()
query = "INSERT INTO TestTable (text) VALUES ('test');"
cursor.execute(query)
db.commit()
Приведенный выше код работает нормально, но если мне нужно выполнить системные команды (в соответствии с синтаксисом MySQL CLI), такие как:
query = "system ls -lah;"
query = "INSERT INTO TestTable (text) VALUES ('test'); system ls -lah;"
query = "\! ls -lah"
Я получаю следующую сбивающую с толку ошибку:
Traceback (most recent call last):
File "./app.py", line 9, in <module>
cursor.execute(query)
File "/usr/local/lib/python3.6/dist-packages/pymysql/cursors.py", line 170, in execute
result = self._query(query)
File "/usr/local/lib/python3.6/dist-packages/pymysql/cursors.py", line 328, in _query
conn.query(q)
File "/usr/local/lib/python3.6/dist-packages/pymysql/connections.py", line 516, in query
self._affected_rows = self._read_query_result(unbuffered=unbuffered)
File "/usr/local/lib/python3.6/dist-packages/pymysql/connections.py", line 727, in _read_query_result
result.read()
File "/usr/local/lib/python3.6/dist-packages/pymysql/connections.py", line 1066, in read
first_packet = self.connection._read_packet()
File "/usr/local/lib/python3.6/dist-packages/pymysql/connections.py", line 683, in _read_packet
packet.check_error()
File "/usr/local/lib/python3.6/dist-packages/pymysql/protocol.py", line 220, in check_error
err.raise_mysql_exception(self._data)
File "/usr/local/lib/python3.6/dist-packages/pymysql/err.py", line 109, in raise_mysql_exception
raise errorclass(errno, errval)
pymysql.err.ProgrammingError: (1064, "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'system ls -lah' at line 1")
Это может быть потенциально проблема безопасности, реализованная в службе MySQL (поскольку я получил ту же ошибку, используя другие библиотеки баз данных в python), но если да, как я могу настроить эту настройку?
Я использую последнюю версию Ubuntu Server (18.10) и MySQL (Ver 14.14 Distrib 5.7.24, для Linux (x86_64)).
Обновлено: чтобы немного уточнить, я очень хорошо знаю Python os или subprocess, но я хотел попробовать вышеупомянутый метод с помощью запросов MySQL. Я также пробовал разные драйверы, такие как MySQLdb, mysql.connector, но все они дали одинаковые результаты.






Команда system в MySQL CLI - это удобная функция, которая позволяет вам выдавать команды для выполнения в вашем интерпретаторе команд по умолчанию. Он не требует и не использует соединение с БД. Он доступен только в системах UNIX.
CLI - это инструмент для администраторы или пользователи для работы с БД. Он содержит драйвер БД, но также содержит экранирование системной оболочки; он пытается охватить все функции, необходимые для управления БД.
pymysql (или любой другой пакет драйверов, совместимый с DB API 2.0) создан для создания подключений к базам данных, получения курсоров из этих подключений и выполнения операторов SQL для этих курсоров. Это не касается системных оболочек.
Драйвер БД - это программный пакет, который позволяет Разработчики реализовывать функциональные возможности SQL-запросов в программе. Больше этого делать не нужно, потому что, если разработчику нужны дополнительные функции в указанной программе, они будут реализовывать их с помощью соответствующего пакета.
Если вы хотите запускать системные команды из своего скрипта Python, subprocess можно считать стандартным пакетом для этого.
@bashbin Я не могу утверждать, что знаю все драйверы, но я знаю довольно много, и ни один из них не делает то, что вы хотите. MySQL CLI также не выполняет системные команды через запросы SQL. Если вы запустите mysql> system \! ls -la, он откроет, скажем, bash, выполнит команду и вернет результат. Я не понимаю, почему вы не можете сделать это, используя subprocess или, в случае ls, даже os.listdir или os.walk.
Что ж, ls -la был просто случайной командой, которая пришла мне в голову при публикации вопроса. Я разрабатываю на Python, поэтому я, очевидно, знаком с os, subprocess, но это была конкретная задача для конкретного проекта, который я хотел опробовать. Жаль, что на данный момент это невозможно. В любом случае, спасибо за разъяснения. Кстати, при использовании команды system\! избыточен.
Я понимаю вас и полностью осведомлен о
subprocess, но цель заключалась в том, чтобы выполнять системные команды через запросы SQL по определенной, но жизнеспособной причине. Однако «это не касается системных оболочек». это то, что мне нужно для подтверждения. Вы хотите сказать, что не существует другого драйвера, предназначенного не только для Разработчики?