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

2024-06-07 11:34:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我在从python脚本通过ssh运行非完成进程时遇到了一个问题。我需要做的是:

  1. 通过ssh连接到远程服务器
  2. 在此服务器上运行mongod
  3. 在不杀死mongod进程的情况下完成脚本执行

现在,我用这种方式使用subprocess.Popen

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

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

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

正确的方法是什么?我能做些什么来自动传递密码吗?在


Tags: 服务器脚本host密码远程进程mongo方式
2条回答

我同意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(而不是手动编写密码)

SSH不需要输入密码的正确方法是使用public key authentication。在

我还将研究通过SSH运行命令的结构。在

而且您没有在服务器上的shell环境中运行该命令。如果你跑了

ssh host ls &

&实际上将ssh放在后台,而不是{}在主机上。相反,试着去做

^{pr2}$

相关问题 更多 >

    热门问题