【问题标题】:Running python scripts remotely using API and subprocess does not work使用 API 和子进程远程运行 python 脚本不起作用
【发布时间】:2020-01-08 11:53:23
【问题描述】:

我有 python 脚本(我们称之为 script1.py),它使用 execnet 模块在其他机器上远程启动其他脚本(script2.py)。它的重要部分如下所示:

import script2
host = "name@ip"
gw = execnet.makegateway("ssh={}".format(host))
channel = gw.remote_exec(script2)

它在做什么无关紧要,因为当我在终端中启动它时,它工作得非常好。现在我尝试通过 Flask API 启动它。我正在使用 subprocess 模块通过脚本生成新进程(与不需要连接到另一台机器的任何其他脚本完美配合)。基本上它应该是这样的:

发送启动脚本的请求 -> 使用 script1.py 生成子进程 -> 在 script1.py 中导入 script2 并使用 execnet 在其他机器上启动它

当我这样做时,我得到一个错误:

 ssh_askpass: exec(/usr/bin/ssh-askpass): No such file or directory
 Permission denied, please try again.
 ssh_askpass: exec(/usr/bin/ssh-askpass): No such file or directory
 Permission denied, please try again.
 ssh_askpass: exec(/usr/bin/ssh-askpass): No such file or directory
 Permission denied (publickey,password).
 Traceback (most recent call last): File "/home/ubuntu/script1.py", line 23, in <module>
 gw = execnet.makegateway("ssh={}".format(host)) File "/usr/local/lib/python2.7/dist-packages/execnet/multi.py",
 line 128, in makegateway gw = gateway_bootstrap.bootstrap(io, spec) 
 File "/usr/local/lib/python2.7/dist-packages/execnet/gateway_bootstrap.py",
 line 98, in bootstrap bootstrap_exec(io, spec) File "/usr/local/lib/python2.7/dist-packages/execnet/gateway_bootstrap.py",
 line 50, in bootstrap_exec raise HostNotFound(io.remoteaddress) execnet.gateway_bootstrap.HostNotFound: remote@10.10.1.2

奇怪的是,我可以在 linux 终端中做到这一点,但不能通过 API 将它作为子进程启动。有谁知道为什么它不起作用?

【问题讨论】:

  • 从终端连接时,需要密码吗?
  • 是的,它要求我输入密码

标签: python linux python-2.7


【解决方案1】:

当您ssh 到您的远程主机时,听起来您需要输入密码。虽然这在终端上运行良好,但当您尝试在 flask 下运行相同的命令时,它无法要求您输入密码。

它正在尝试使用ssh-askpass 命令,该命令可用于弹出一个对话框,您可以在其中输入密码;这通常用于 GUI 环境中,您可以在没有密码的情况下运行ssh。但是,对于您正在做的事情,这并不是一个真正合适的解决方案,因为理想情况下,您不希望每次需要验证时都必须手动与代码交互。

此问题的典型解决方案是使用基于 ssh 密钥的身份验证:创建一个供您的应用程序使用的公钥/私钥对,将公钥放在远程主机上适当的 authorized_keys 文件中,并确保当您的 Python 代码会生成一个 ssh 连接,它使用相应的密钥文件。


顺便说一句,execnet 的文档说:

execnet 目前处于仅维护模式,主要是因为它仍然是 pytest-xdist 插件的后端。不要在新项目中使用。

【讨论】:

  • 感谢您解释问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-07
  • 1970-01-01
  • 2018-08-22
  • 1970-01-01
  • 1970-01-01
  • 2010-10-29
  • 2018-06-02
相关资源
最近更新 更多