Я хочу выполнить определенную команду над S SH, и она не работает, но другие команды есть. Как так? - PullRequest
0 голосов
/ 15 апреля 2020

Я пытаюсь выполнить команду над S SH. У меня есть код на удаленном ноутбуке (машина 1), и я хочу S SH на linux машину (машина 2), чтобы выполнить команду, которая компилирует все данные на машине 2 в csv файл.

Мой код выглядит следующим образом:

import subprocess

ipaddress = "123.45.678.90"
cmd1 = """mysql --batch -u redacted -p"redacted" -h 789.01.234.567 -D redacted -e " SELECT redacted WHERE redacted > '2020-04-13 10:39:42' AND redacted < '2020-04-13 12:46:27' AND redacted AND redacted AND redacted;" > file_name.csv"""
cmd2 = "touch test.txt"
subprocess.Popen("ssh {ip} {cmd}".format(ip=ipaddress, cmd=cmd2), shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate()

В приведенном выше коде, когда я использую cmd2 для тестирования, я могу запустить код, а затем вручную S SH в на компьютере 2 на CLI компьютера 1 и вижу, что файл "test.txt" был создан на компьютере 2.

Однако если я использую cmd1 в приведенном выше коде, то я вручную S SH на машине 2, я не вижу файл, который я хочу создать. Я могу S SH в машину 2 и вручную скопировать / вставить содержимое cmd2, и это работает.

Может кто-нибудь помочь мне понять, почему это так? Спасибо!

Редактировать Я добавил ошибку в команду subprocess.popopen, и при использовании cmd1 сообщение print (err) выглядит так:

b"bash: -c: line 0: syntax error near unexpected token `('\nbash: -c: line 0: `mysql --batch -u redacted -predacted -h 789.01.234.567 -D redacted -e  SELECT redacted WHERE redacted > '2020-04-13 10:39:42' AND redacted < '2020-04-13 12:46:27' AND redacted AND redacted AND redacted;'\n"

It похоже на распечатку ошибки, команда была удалена из всех двойных кавычек, а также окончательная строка " > file_name.csv, которая сообщает команде, где сохранить файл. Ниже приведено сравнение исходной команды, которая должна быть отправлена, и того, что сообщило сообщение об ошибке:

origi: mysql --batch -u redacted -p"redacted" -h 789.01.234.567 -D redacted -e " SELECT redacted WHERE redacted > '2020-04-13 10:39:42' AND redacted < '2020-04-13 12:46:27' AND redacted AND redacted AND redacted;" > file_name.csv
error: mysql --batch -u redacted -predacted -h 789.01.234.567 -D redacted -e  SELECT redacted WHERE redacted > '2020-04-13 10:39:42' AND redacted < '2020-04-13 12:46:27' AND redacted AND redacted AND redacted;'\n"

Как убедиться, что моя исходная команда передается в функцию subprocess.Popen ? Похоже, что все двойные кавычки были удалены. Если я делаю простой вывод (cmd1), он выводит мою команду как обычно. Спасибо

1 Ответ

0 голосов
/ 15 апреля 2020

Каждая пара кавычек одного типа, Python интерпретирует это как отдельную строку. Похоже, вы пытаетесь связать cmd1 с кучей разных строк.

Вместо:

cmd1 = """mysql --batch -u redacted -p"redacted" -h redacted -D testexec -e " SELECT redacted(over 30 parameters)"

Попробуйте это:

cmd1 = '""mysql --batch -u redacted -p"redacted" -h redacted -D testexec -e " SELECT redacted(over 30 parameters)" > file_name.csv""'
...