执行远程命令
我想运行这个命令: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] No such file or directory",因为它在本地机器上找不到 /usr/bin/mysql。
4 个回答
1
subprocess
总是会在本地机器上运行命令。如果你想通过 SSH 运行命令,你需要把命令作为输入传给你的 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"')
1
也许可以把这些都合并成一个命令呢?
p1 = sp.Popen(["ssh", "user@some_host", "echo \"%s\" | mysql -u ..." % sql], stdout=sp.PIPE)