Python脚本通过ssh连接,运行进程并断开连接而无需等待

时间:2017-01-13 08:20:16

标签: python ssh

我遇到了从python脚本通过ssh运行非整理过程的问题。我需要做什么:

  1. 通过ssh连接到远程服务器
  2. 在此服务器上运行mongod
  3. 完成脚本执行而不杀死mongod进程
  4. 目前,我正在以这种方式使用subprocess.Popen

    subprocess.Popen(['ssh', 'user@' + host, 'mongod', '-f', '/temp-mongo.conf', '&'])
    

    问题是脚本在我被问及用户密码之前就结束了,所以它以Too many authentication failures for root结束。

    我尝试使用p = subprocess.Popen(...).communicate()并且它几乎没问题,但是脚本等待mongod命令完成,显然不会发生。

    这样做的正确方法是什么?我可以自动传递密码吗?

2 个答案:

答案 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 &'
相关问题