Python и pymysql - не могут выполнять системные команды через MySQL - PullRequest
0 голосов
/ 06 декабря 2018

У меня есть следующий код на 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, но все они с одинаковыми результатами.

1 Ответ

0 голосов
/ 06 декабря 2018

Команда system в MySQL CLI - это удобная функция, которая позволяет вам выдавать команды для выполнения на интерпретаторе команд по умолчанию.Это не нужно или использовать соединение с БД.Он доступен только в системах UNIX.
CLI - это инструмент для администраторов или пользователей для работы с БД.Он содержит драйвер БД, но также содержит системную оболочку escape;он пытается охватить все функции, необходимые для управления БД.

pymysql (или любой другой пакет драйверов, совместимый с API БД 2.0) создан для создания соединений с базами данных, получения курсоров из этих соединений и выполненияSQL-операторы на этих курсорах.Он не касается системных оболочек.
Драйвер БД - это программный пакет, который позволяет разработчикам реализовывать функции SQL-запросов в программе.Он не должен делать больше, чем это, потому что, если разработчик нуждается в дополнительных функциях в указанной программе, они реализуют его, используя соответствующий пакет.

Если вы хотите выполнять системные команды из вашего скрипта Pythonsubprocess можно считать стандартным пакетом для этого.

...