2011-08-26 415 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時的參數」傳遞。