执行远程命令

1 投票
4 回答
2097 浏览
提问于 2025-04-17 00:25

我想运行这个命令: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)

撰写回答