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

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

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
778
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

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

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

Я понимаю вас и полностью осведомлен о subprocess, но цель заключалась в том, чтобы выполнять системные команды через запросы SQL по определенной, но жизнеспособной причине. Однако «это не касается системных оболочек». это то, что мне нужно для подтверждения. Вы хотите сказать, что не существует другого драйвера, предназначенного не только для Разработчики?

bashbin 06.12.2018 17:23

@bashbin Я не могу утверждать, что знаю все драйверы, но я знаю довольно много, и ни один из них не делает то, что вы хотите. MySQL CLI также не выполняет системные команды через запросы SQL. Если вы запустите mysql> system \! ls -la, он откроет, скажем, bash, выполнит команду и вернет результат. Я не понимаю, почему вы не можете сделать это, используя subprocess или, в случае ls, даже os.listdir или os.walk.

shmee 06.12.2018 17:33

Что ж, ls -la был просто случайной командой, которая пришла мне в голову при публикации вопроса. Я разрабатываю на Python, поэтому я, очевидно, знаком с os, subprocess, но это была конкретная задача для конкретного проекта, который я хотел опробовать. Жаль, что на данный момент это невозможно. В любом случае, спасибо за разъяснения. Кстати, при использовании команды system\! избыточен.

bashbin 07.12.2018 08:37

Другие вопросы по теме