无法使用 ssh 检索配置文件变量。
server2 ==> 用户 apptst ==> bash 配置文件有 $APPHOME 变量。
尝试使用 ssh 从 server1 检索值但失败了。
使用以下选项
server1> ssh apptst@server2 'echo $APPHOME'
server1> ssh apptst@server2 echo '$APPHOME'
server1> ssh apptst@server2 echo "$APPHOME"
server1> ssh apptst@server2 "echo $APPHOME"
当尝试
server1> ssh apptst@server2 ls -ld $APPHOME
它工作正常。
有什么建议缺少什么以及如何从 server2 获取变量?
答案1
该命令应该可以工作:
server1> ssh apptst@server2 'bash -l -c "echo \$APPHOME"'
- 您需要使用
'
引号将完整的命令作为一个参数传递给 ssh;这也会阻止 server1 上的 shell$APPHOME
自行扩展 bash -l
启动登录 shell,读取配置文件,其中 $APPHOME 被定义(如下@chepner 指出在他的回答中,这不是 sshd 调用时的默认设置)-c
执行下一个参数,再次用引号引起来,表示执行完整的 echo 命令。- 逃避
\$
是必要的,因为否则父(非登录)shellsshd 调用的(以及直接从 init (*) 继承环境的)确实会扩展$APPHOME
。但这还为时过早,因为$APPHOME
只定义了登录贝壳(通过~/.profile
)。[在 OP 评论后添加了这一点]
(*) 如果我错了,请纠正我。
答案2
问题是,当你指定通过运行的确切命令时ssh
,遥控器sshd
不会不是启动登录 shell 来执行它,但启动常规的非交互式 shell。在这种情况下,.bash_profile
不会执行,因此APPHOME
未定义。
在写这篇文章的时候,mph 发布了正确的解决方案强制处理登录 shell .bash_profile
。