【问题标题】:ssh command not working from a bash script [closed]ssh 命令在 bash 脚本中不起作用 [关闭]
【发布时间】:2014-11-19 13:39:42
【问题描述】:

我正在尝试从我的服务器将 ssh 反向到 pi。我已经在服务器端和 pi 端安装了 ssh 密钥。

每当我在终端中输入以下命令时,我就可以在没有密码的情况下登录我的服务器。

ssh -R 19999:localhost:22 usr@www.example.com

但是,每当我在 bash 脚本中包含上述内容并执行它时,它都会要求我输入密码。这很奇怪。这是为什么?谁能帮我这个 ?因为,我想使用 subprocess 方法从 python 脚本运行命令(从 python 运行 bash 脚本)。

【问题讨论】:

  • 在python中使用pty模块,它是标准的lib或paramiko。

标签: python bash shell ssh subprocess


【解决方案1】:

在被调用的 bash 脚本的顶部,获取您的个人资料:

source ~/.bash_profile

【讨论】:

  • 高度投机,有时是一个非常糟糕的主意。
【解决方案2】:

如果您发现从 shell 提示符发出的命令有效,而从某些脚本启动时失败,那么在 Unix(和 Linux)下发生这种情况的原因非常有限。

最有可能的是您的脚本在您的交互环境中缺少某些内容。确保您在 Python 的 subprocess.Popen() 下运行命令的环境与您启动 Python 的环境相匹配的一种方法是,将类似字典的环境显式传递给 Popen() 调用,如下所示:

#!/usr/local/bin/python
proc = subprocess.Popen(cmd, [args], env=os.environ)

...os.environ 将是您的 Python 进程的环境。当然,您可以创建自己的副本,并有选择地修改或从中删除键/值对,然后将其传递给 Popen()

如果您的命令包含任何要扩展的变量,那么您可能需要使用Popen() 选项来设置shell=True;这将强制 Python 启动 shell 的副本来解释命令行内容。当然,对于潜在的敌对意见来说,这是不可信的。 (换句话说,不要盲目地从不受信任的来源获取字符串并尝试通过您的 shell 运行它们)。

在这种情况下,在尝试使用 ssh 时,我建议您特别查找任何 SSH_AGENT 和 SSH_AUTHSOCK 环境设置。人们在尝试自动使用隧道、ssh 代理和 VPN 服务时,经常会配置 ssh-agent 并忘记它,直到它咬到他们为止。

在我自己的ssh-agent 处理中,我在启动新的ssh-agent 会话后使用printenv | ssh 'SSH_A[UG]' > ~/.ssh/env; echo "export SSH_AUTH_SOCK SSH_AGENT_PID >> ~/.ssh/env 保存适当的环境设置(当然,我很少这样做——我的工作站和笔记本电脑很少会重新启动) .然后我的~/.bash_profile 获取该文件。 (实际上它也执行kill -0 "$SSH_AGENT_PID" || ~/bin/start_ssh_agent.sh,并在必要时重新获取 env 文件;这只是自动重启代理)。

【讨论】:

    【解决方案3】:

    【讨论】:

      最近更新 更多