当通过ssh运行脚本时,环境variables不可用

假设我有两个主机:A和B,用户a和b。 B是安装Cygwin的Windows机器,如果这很重要的话。

B被configuration为从A通过SSH访问而不需要密码(它包含A的公共RCA密钥),所以我可以通过以下方式在A上运行命令:

ssh b@B [command] 

但是当我尝试运行一个命令时,需要访问一个环境variables,命令失败:

 [15:54:08] - a@A - ~ $ ssh b@B 'echo $ANT_HOME' 

返回空string。

相同的命令,如果直接连接(不通过SSH)是正确执行的:

 b@B ~ $ echo $ANT_HOME /cygdrive/c/PROGRA~1/apache-ant-1.9.0 

后者是可能的,因为相关的variables是在“bash_profile”中输出的:

 export JAVA_HOME="/cygdrive/c/PROGRA~1/Java/jdk1.7.0_45" export ANT_HOME="/cygdrive/c/PROGRA~1/apache-ant-1.9.0" 

但由于某些原因,这不适用于SSH的情况。


一些额外的信息可能是有用的。

主机B有Windows XP + Cygwin。 CYGWIN sshd在SYSTEM帐户下运行。 在Windows的“系统”环境variables部分中定义了JAVA_HOME和ANT_HOME。

当我运行“$ ssh b @ B env”命令时,它不会打印ANT_HOME或JAVA_HOME,但是如果将它们包含在sshd_config文件中,则会执行此操作。 但即使如此,简单的命令ssh b @ B'echo $ ANT_HOME'不能像我所期望的那样工作。

请给我一个提示,通过SSH运行命令需要做什么。

从我的服务器的手册页:

  1. 读取文件〜/ .ssh / environment(如果存在),并允许用户更改其环境。 请参见sshd_config(5)中的PermitUserEnvironment选项。

所以,在你可以从env执行任何操作之前,你需要在/ etc / ssh / sshd_config中启用它,并且在启用属性PermitUserEnvironment之后,在〜/ .ssh / environment中设置env vars。

当你运行一个命令作为ssh的参数时,这个命令是由sshd直接运行的; shell不涉及。

你可以使用类似下面的方法validation它:

ssh b @ B pstree

在这个例子中,shell是bash_profile,只有当shell被作为loginshell调用时,或者shell被-login选项调用的时候(参见bash手册页;寻找INVOCATION)。 当你直接运行一个命令时,你得到的环境是由sshd和PAM在login时设置的。

因此,如果你想要你的.bash_profile,你需要在shell下运行它,并且需要将shell作为交互式或loginshell运行,如下所示:

ssh b @ B“bash -l -c'env'”

这应该让你输出你的愿望。 唯一需要注意的是引用很快就会变得棘手。 请注意,在Linux上,至less,

ssh b @ B bash -l -c'env'

不会让你一个loginshell(我不知道为什么)。