【问题标题】:Why my ~/.bashrc is sourced while I'm connected and not when I only execute a command?为什么我的 ~/.bashrc 是在我连接时获取的,而不是在我只执行命令时获取的?
【发布时间】:2013-07-03 14:51:11
【问题描述】:

我有一个需要执行脚本的目标 AIX 6.1 服务器。

我的目标服务器上的~/.bashrc 配置为添加变量MACHINE=1

当我 ssh 服务器并连接时,我有效地查看了我的环境中的 ~/.bashrc 变量:

[user@source ~]$ ssh user@10.10.10.10
[user@target]
$env |grep "MACHINE"
MACHINE=1
[user@target]
$

但是当我在 ssh 中直接执行 env 命令时,变量没有设置:

[user@source ~]$ ssh user@10.10.10.10 "env" |grep MACHINE
[user@source ~]$

服务器上还有什么需要配置的吗?

【问题讨论】:

  • ssh user@10.10.10.10 "env" 打印出什么。我的意思是没有grep
  • 它会打印很多变量,除了 ~/.bashrc 中定义的变量
  • 这个链接也有类似的问题stackoverflow.com/questions/1198378/…
  • 如mywiki.wooledge.org/DotFiles 中所述,非登录非交互式shell 上的行为是实现定义的;有一个非默认编译时选项可以在这些系统上启用~/.bashrc 的来源,但是否启用它由您的操作系统供应商控制。

标签: bash ssh aix


【解决方案1】:

您可以选择告诉sshd 为您设置环境变量。在/etc/sshd_config:

PermitUserEnvironment yes

在~/.ssh/environment:

MACHINE=1

【讨论】:

  • 在我的配置中,sshd_config 不在这里,但这个解决方案可以作为替代方案。这并不能解释它在我的旧服务器上是如何工作的,但这个解决方案可能更干净。谢谢。
  • @Pierre-LouisLaffont 一些操作系统启用了非默认编译时标志,导致即使在非交互式、非登录 shell 上也可以获取 .bashrc。这可能就是您的旧系统正常工作的原因。
【解决方案2】:

ssh 远程命令执行发生在非交互式 shell 中。因此,您的${HOME}/.bashrc、/etc/bashrc 不会被读取。

如果您希望ssh 命令读取环境变量,请将它们添加到/etc/profile。

或者,尝试破解:

ssh user@10.10.10.10 'source ${HOME}/.bashrc; echo ${MACHINE}'

【讨论】:

  • 实际上我有一个旧的目标服务器正在工作,而 /etc/profile 中没有任何内容,所以我不知道这个旧的服务器是如何工作的。
  • 对于替代方案,我已经想到了,但我不能,因为 ssh 命令是由外部程序实现的
  • 它甚至不会发生在 shell 中。连接后,远程sshd 正在执行env 的实例,而不是shell。
  • ssh user@10.10.10.10 "source ${HOME}/.bashrc; echo ${MACHINE} 不行吗?
  • @chepner 会不会。 sshd 不直接execve(),但总是调用一个shell。
猜你喜欢
  • 2022-11-19
  • 1970-01-01
  • 2020-03-05
  • 1970-01-01
  • 1970-01-01
  • 2017-09-10
  • 1970-01-01
相关资源
最近更新 更多