Попен удаленных команд

1

Глядя на запуск команды: 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 на локальном компьютере.

Теги:

4 ответа

1
Лучший ответ

возможно, объединив все это в единую команду?

p1 = sp.Popen(["ssh", "user@some_host", "echo \"%s\" | mysql -u ..." % sql], stdout=sp.PIPE)
4

Я бы вообще не использовал 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"')
  • 0
    Парамико хороший инструмент
  • 0
    Да, или Pexpect - другое простое в использовании решение
1

subprocess всегда запускает команды на локальном компьютере. Если вы хотите запускать команды через SSH, вам нужно передать команды в качестве входных данных для вашего процесса ssh через stdin или в качестве аргумента при запуске ssh.

Однако лучшей идеей может быть использование библиотеки, предназначенной для запуска удаленных команд, таких как fabric.

0

В ответ на Amber OP говорит, что он пытается запустить команду:

ssh user @some_host "echo 'some_sql' |/usr/bin/mysql -u some_args"

Поэтому он явно передает команды как "аргумент, когда вы начинаете ssh".

Ещё вопросы

Сообщество Overcoder
Наверх
Меню