Popen远程命令

时间:2011-08-26 22:08:26

标签: python

希望运行命令: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 个答案:

答案 0 :(得分: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"')

答案 1 :(得分:1)

或许将它们组合成一个命令?

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

答案 2 :(得分:1)

subprocess始终在本地计算机上运行命令。如果要通过SSH运行命令,则需要通过stdin将命令作为输入传递给ssh进程,或者在启动ssh时将其作为参数传递。

然而,更好的想法可能是使用专为运行fabric等远程命令而设计的库。

答案 3 :(得分:0)

作为对Amber的回应,OP说他正在尝试运行命令:

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

所以他很明显,将命令作为“当你开始使用ssh时的参数”传递。