gpt4 book ai didi

python - 在 Supervisord 上运行的 Flask 应用如何打开 SSH 隧道?

转载 作者:行者123 更新时间:2023-12-01 23:08:14 25 4
gpt4 key购买 nike

注意:我在问题中包含了 Flask,但我怀疑它与 Flask 有任何关系,也与 supervisord 有关。和sshtunnel .

基本上,我正在尝试打开 SSH 隧道来连接到数据库并以编程方式执行一些命令。这种情况总是发生在 worker 身上Thread打开 threading图书馆。通过直接调用 Gunicorn 或直接运行脚本,效果很好。这是函数:

def _get_ssh_server(client):
"""Open an SSH tunnel forwarder and return it."""

return sshtunnel.SSHTunnelForwarder(
(os.environ['SSH_HOSTNAME'], int(os.environ['SSH_PORT'])),
ssh_username=os.environ['SSH_USERNAME'],
ssh_pkey=os.environ['SSH_PKEY'],
remote_bind_address=(
os.environ['REMOTE_BIND_ADDRESS'], 3306),
local_bind_address=("localhost", int(
os.environ['LOCAL_BIND_PORT']))
)

显然这些环境变量存在并且是正确的。当我在本地运行并直接调用 Gunicorn(甚至在远程服务器上)时,一切正常。

当我运行sudo service supervisord restart时并观察日志,我看到:

ValueError: No password or public key available!

这是 supervisord 的命令部分应用程序.ini .

command=/usr/local/bin/pipenv run gunicorn -w 3 manage:app

研究告诉我,这与 supervisord 的方式有关。与ssh-agent一起工作。两者都root和我一起工作的用户,私钥存在于~/.ssh中在id_rsa具有正确的权限。直接在这两个作品上运行 Gunicorn,将问题隔离到 supervisord .

我可能可以使用 screen 让它工作或类似的解决方案,但这不是首选解决方案。任何帮助将不胜感激。

谢谢!

编辑:我能够通过以 root 身份删除 /home/<user>/.ssh/id_rsa 来使其失败。文件,终止 SSH 代理,然后重新启动它。我通过运行 ssh-add 让它再次工作。运行 supervisord还是不行。

如果 SSH 代理supervisor用途与 root 相同使用了,为什么不起作用?

最佳答案

所以,我自己解决了这个问题。我不是 100% 确定为什么它之前不起作用,但我有一个仍然使用相同工具的替代解决方案。

sshtunnel 的文档指出,您可以使用文件路径或 paramiko RSAKey 代替 ssh_pkey.我一直在使用 str 文件路径,所以我尝试了其他方法。

我做的第一件事是将私钥的格式从 OpenSSH 更改为 RSA:

ssh-keygen -p -m PEM -f ~/.ssh/id_rsa

接下来,我将 SSH key 中加载的代码块更改为:

import paramiko

# ...

def _get_ssh_server(client):
"""Open an SSH tunnel forwarder and return it."""

return sshtunnel.SSHTunnelForwarder(
(os.environ['SSH_HOSTNAME'], int(os.environ['SSH_PORT'])),
ssh_username=os.environ['SSH_USERNAME'],
ssh_pkey=paramiko.RSAKey.from_private_key_file(os.environ['SSH_PKEY']),
remote_bind_address=(os.environ['REMOTE_BIND_ADDRESS'], 3306),
local_bind_address=("localhost", int(os.environ['LOCAL_BIND_PORT'])),
allow_agent=False,
)

现在一切都按预期进行。

关于python - 在 Supervisord 上运行的 Flask 应用如何打开 SSH 隧道?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57470511/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com