Глядя на запуск команды: ssh user @some_host "echo 'some_sql' |/usr/bin/mysql -u some_args"
Как мне это сделать с помощью Popen?
p1 = sp.Popen(["ssh", "user@some_host", "echo \"%s\"" % sql], stdout=sp.PIPE)
p2 = sp.Popen(["/usr/bin/mysql", "-u some_args"], stdin=p1.stdout, stdout=sp.PIPE)
Возвращает "OSError: [Errno 2] Нет такого файла или каталога", так как он ищет /usr/bin/mysql на локальном компьютере.
возможно, объединив все это в единую команду?
p1 = sp.Popen(["ssh", "user@some_host", "echo \"%s\" | mysql -u ..." % sql], stdout=sp.PIPE)
Я бы вообще не использовал Popen; вместо этого используйте paramiko
import paramiko
ssh_client = paramiko.SSHClient()
ssh_client.load_system_host_keys()
ssh_client.connect('www.somehost.com', username='user')
ssh_client.exec_command(' "echo 'some_sql' | /usr/bin/mysql -u some_args"')
subprocess
всегда запускает команды на локальном компьютере. Если вы хотите запускать команды через SSH, вам нужно передать команды в качестве входных данных для вашего процесса ssh
через stdin или в качестве аргумента при запуске ssh.
Однако лучшей идеей может быть использование библиотеки, предназначенной для запуска удаленных команд, таких как fabric
.
В ответ на Amber OP говорит, что он пытается запустить команду:
ssh user @some_host "echo 'some_sql' |/usr/bin/mysql -u some_args"
Поэтому он явно передает команды как "аргумент, когда вы начинаете ssh".
Pexpect
- другое простое в использовании решение