我遇到了从python脚本通过ssh运行非整理过程的问题。我需要做什么:
目前,我正在以这种方式使用subprocess.Popen
:
subprocess.Popen(['ssh', 'user@' + host, 'mongod', '-f', '/temp-mongo.conf', '&'])
问题是脚本在我被问及用户密码之前就结束了,所以它以Too many authentication failures for root
结束。
我尝试使用p = subprocess.Popen(...).communicate()
并且它几乎没问题,但是脚本等待mongod
命令完成,显然不会发生。
这样做的正确方法是什么?我可以自动传递密码吗?
答案 0 :(得分:1)
我同意e4c5您应该使用像Fabric
这样的工具。如果你想以肮脏的方式待在这样的事情应该有效:
subprocess.call('ssh user@%s "mongod -f /temp-mongo.conf &>/dev/null &"' % host,
shell=True)
请注意,您需要执行以下操作:
&>/dev/null
将mongod的所有输出路由到/ dev / null(没有它会阻塞,不会100%确定原因。可能是因为shell的stdout附加到命令)shell=True
以便shell为您构建命令(因此您不需要放置", "
而不是每个空格)这也适用于auth over public key(而不是手动编写密码)
答案 1 :(得分:0)
SSH无需输入密码的正确方法是使用public key authentication。
我还会看看Fabric通过SSH运行命令。
并且您没有在服务器上的shell环境中运行该命令。如果你运行
ssh host ls &
&
实际上会将ssh
放在后台,而不是ls
在主机上。而是尝试做
ssh host sh -c 'ls &'