我正在尝试将ssh从我的服务器转换为pi。我已经在服务器和pi端安装了ssh密钥。
每当我在终端输入以下命令时,我都可以在没有密码的情况下登录我的服务器。
ssh -R 19999:localhost:22 usr@www.example.com
但是,每当我在bash脚本中包含上述内容并执行它时,它会要求我输入密码。这很奇怪。这是为什么?谁能帮我这个 ?因为,我想使用subprocess方法从python脚本运行命令(从python运行bash脚本)。
答案 0 :(得分:1)
任何时候你发现命令在从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-agent
,并在尝试自动使用隧道,ssh代理和VPN服务时咬住它们,直到忘记它为止。
在我自己的ssh-agent
处理中,我使用printenv | ssh 'SSH_A[UG]' > ~/.ssh/env; echo "export SSH_AUTH_SOCK SSH_AGENT_PID >> ~/.ssh/env
在开始新的ssh-agent
会话后保存适当的环境设置(当然,我很少 - 我的工作站和笔记本电脑很少重新启动)。然后是我的~/.bash_profile
来源文件。 (实际上它也会执行kill -0 "$SSH_AGENT_PID" || ~/bin/start_ssh_agent.sh
,并在必要时重新获取env文件;这只是为了自动重启代理。)
答案 1 :(得分:0)
在您调用的bash脚本的顶部,来源您的个人资料:
source ~/.bash_profile
答案 2 :(得分:0)