3

我正在尝试在 Python 中检索远程 Linux 服务器的环境变量。或者,如果我可以在我正在执行的命令中使用变量名,那也很好。据我所知,我正在拨打的电话应该可以正常工作,但我正在取回垃圾。我已经设置了公钥认证,所以不需要密码。

努力一:

devdir = subprocess.check_output(["ssh", connectstring, "echo $DEVDIR"])

努力2:

ret = subprocess.check_output(["ssh", connectstring, 
    "$DEVDIR/{0}".format(testpath)])

connectstring是 user@ip 并且工作正常。$DEVDIR是我要使用的远程变量并包含路径。testpath是我要执行的脚本的路径,植根于$DEVDIR.

Effort 1 返回“\n”,Effort 2 无法远程解析 $DEVDIR。


努力3:

import paramiko
...
ssh = paramiko.SSHClient()
ssh.connect(ip, user)    # succeeds
stdin, stdout, stderr = ssh.exec_command("echo $DEVDIR")

结果:stdout.readlines() = "\n"

4

3 回答 3

2

如果环境变量设置在 中,您可以使用该选项.bashrc强制远程命令在登录 shell 下运行。-l以下...

devdir = subprocess.check_output(["ssh", connectstring, "sh -l -c 'echo $DEVDIR'"])

...为我工作。

于 2013-04-24T17:05:06.630 回答
1

执行命令 va SSH 不会产生登录会话。所以有些变量可能没有设置。

您可以通过将变量替换为另一个变量来检查这一点,例如$HOSTNAMEor$HOST$SSH_CONNECTIONor 执行env命令。

一种解决方案可能是将变量赋值放入一个文件中,该文件也在非登录会话中执行。.bashrc不过应该没问题;也许里面的某个地方有缺陷。

于 2013-04-24T16:51:51.473 回答
-1

尝试这个:

devdir = subprocess.check_output(["ssh -i", connectstring, "echo $DEVDIR", FALSE])

这有点像黑客,但它应该有所帮助。

于 2013-04-24T16:10:56.607 回答