假设我有两个主机: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运行命令需要做什么。
从我的服务器的手册页:
所以,在你可以从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(我不知道为什么)。