2011-08-26 460 views
1

展望运行命令:SSH用户@ some_host “回声 'some_sql' |在/ usr/bin中/ MySQL的-u some_args”POPEN远程命令

我将如何做到这一点使用POPEN?

返回 “OSERROR:[错误2]没有这样的文件或目录”,因为它是寻找本地机器上的/ usr/bin中/ MySQL的。

回答

1

也许把它全部组合成一个单一的命令?

p1 = sp.Popen(["ssh", "[email protected]_host", "echo \"%s\" | mysql -u ..." % sql], stdout=sp.PIPE) 
1

subprocess总是在本地机器上运行命令。如果你想通过SSH运行命令,你需要通过stdin将命令作为输入传递给你的ssh进程,或者当你启动ssh时作为参数传递。

但是,一个更好的主意可能是使用专为运行远程命令(如fabric)而设计的库。

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

paramiko是一个很好的工具 – timger

+0

是的,或者'Pexpect'是另一个易于使用的解决方案 – wim

0

针对黄色时,OP说,他正试图运行命令:

SSH用户@ some_host “回声 'some_sql' |在/ usr/bin中/ MySQL的-u some_args”

所以他很清楚,将命令作为“当您启动ssh时的参数”传递。