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

标签 python ssh

我在通过 ssh 从 python 脚本运行未完成的进程时遇到问题。我需要做什么:

  1. 通过 ssh 连接到远程服务器
  2. 在此服务器上运行 mongod
  3. 完成脚本执行而不终止 mongod 进程

目前,我以这种方式使用 subprocess.Popen:

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

问题是脚本在我被询问用户密码之前结束,因此它以root 身份验证失败次数过多结束。

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

执行此操作的正确方法是什么?我可以做一些事情来自动传递密码吗?

最佳答案

我同意 e4c5 的观点,您应该使用像 Fabric 这样的工具。如果你想继续使用肮脏的方式,这样的事情应该有效:

subprocess.call('ssh user@%s "mongod -f /temp-mongo.conf &>/dev/null  &"' % host, 
                shell=True)

请注意,您需要执行以下操作:

  • 引用远程调用
  • add &>/dev/null 将 mongod 的所有输出路由到/dev/null (如果没有这个,它会阻塞,不能 100% 确定原因。可能是因为附加了 shell 的标准输出到命令)
  • 使用 shell=True 以便 shell 为您构建命令(这样您就不需要用 ", " 代替每个空格)<

这也适用于通过公钥进行身份验证(而不是手动编写密码)

关于Python 脚本通过 ssh 连接、运行进程并断开连接,无需等待,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41630144/

相关文章:

python - 使用python3.6类型错误: an integer is required

linux - 通过另一个用户建立隧道 ssh

git - Composer 使用 https 而不是 ssh(对于 GitLab)

linux - 命令在脚本中不起作用,但在 shell 中有效

python - 在 Python 中执行访问单独数据库的 MySQL 查询

Python - 作业 - 将任意基数转换为任意基数

python - Commands.getstatusoutput 失败,显示 sh : Syntax error: ";" unexpected

python - 无法使用 pip Python 2.7 安装 aws-sam-cli

python - PhantomJS webdriver 的创建导致 Python 中通过 ssh session 的用户输入问题

linux - 保存时文件权限发生变化(使用 root )