希望运行命令: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。
答案 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时的参数”传递。