使用API和子流程远程运行python脚本不起作用

使用API和子流程远程运行python脚本不起作用,python,linux,python-2.7,Python,Linux,Python 2.7,我有一个python脚本(我们称之为script1.py),它使用execnet模块在其他机器上远程启动其他脚本(script2.py)。它的重要部分如下所示: import script2 host = "name@ip" gw = execnet.makegateway("ssh={}".format(host)) channel = gw.remote_exec(script2) 这与它在做什么无关,因为当我在终端启动它时,它工作得非常好。现在我尝试通过FlaskAPI启动它。我正在使用

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

import script2
host = "name@ip"
gw = execnet.makegateway("ssh={}".format(host))
channel = gw.remote_exec(script2)
这与它在做什么无关,因为当我在终端启动它时,它工作得非常好。现在我尝试通过FlaskAPI启动它。我正在使用subprocess模块生成带有脚本的新进程(对于不需要连接到另一台机器的任何其他脚本都可以很好地工作)。基本上它应该是这样工作的:

import script2
host = "name@ip"
gw = execnet.makegateway("ssh={}".format(host))
channel = gw.remote_exec(script2)
发送启动脚本的请求->使用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
ssh\u askpass:exec(/usr/bin/ssh askpass):没有这样的文件或目录
权限被拒绝,请重试。
ssh_askpass:exec(/usr/bin/ssh askpass):没有这样的文件或目录
权限被拒绝,请重试。
ssh_askpass:exec(/usr/bin/ssh askpass):没有这样的文件或目录
权限被拒绝(公钥、密码)。
回溯(最后一次调用):文件“/home/ubuntu/script1.py”,第23行,在
gw=execnet.makegateway(“ssh={}.format(host))文件“/usr/local/lib/python2.7/dist-packages/execnet/multi.py”,
第128行,makegateway gw=gateway\u bootstrap.bootstrap(io,规范)
文件“/usr/local/lib/python2.7/dist packages/execnet/gateway\u bootstrap.py”,
第98行,在bootstrap bootstrap_exec(io,spec)文件“/usr/local/lib/python2.7/dist packages/execnet/gateway_bootstrap.py”中,
第50行,在bootstrap\u exec raise HostNotFound(io.remoteaddress)execnet.gateway\u bootstrap.HostNotFound中:remote@10.10.1.2

奇怪的是,我可以在linux终端上完成,但不能通过使用API作为子进程启动它。有人知道它为什么不工作吗?

听起来,当您
ssh
连接到远程主机时,需要输入密码。虽然这在终端上可以正常工作,但当您试图在
flask
下运行相同的命令时,它无法向您询问密码

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

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


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

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


当您从终端连接时,是否需要密码?是的,它要求我键入密码以解释问题