У меня есть следующий код на 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()
Приведенный выше код работает просто отлично, но если мне нужно выполнить системные команды(в соответствии с синтаксисом CLI MySQL), например:
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 (версия 14.14 Distrib 5.7.24 для Linux (x86_64)).
Редактировать: Чтобы уточнить, я очень хорошо осведомлен о os
или subprocess
Python, но я хотел попробовать вышеупомянутую технику через запросы MySQL.Я также пробовал разные драйверы, такие как MySQLdb
, mysql.connector
, но все они с одинаковыми результатами.