为什么在 AIX 上使用 telnet 和 ssh 时 bash 调用会有所不同

为什么在 AIX 上使用 telnet 和 ssh 时 bash 调用会有所不同

我使用的是 AIX 5.3 服务器,其中 .bashrc 文件设置为回显“正在执行 bashrc”。当我使用 ssh 登录到服务器并运行:

bash -c ls

我得到:

Executing bashrc
.
..
etc....

但是,当我以同一用户身份使用 telnet 登录并运行相同的命令时,我得到:

.
..
etc....

显然,在 telnet 情况下,没有调用 .bashrc。据我所知,这是正确的行为,因为在这两种情况下,shell 都是非交互式的(它是用 调用的-c)。但是,ssh 的情况似乎是以交互式方式调用 shell。它似乎没有调用 .profile,因此它没有创建登录 shell。我看不出这两种情况下的环境有什么明显不同。

什么可能导致 bash 行为的差异?

答案1

检查以确保您所在的登录 shell 没有别名或不同的名称(具体取决于您是通过或PATH登录)。以每种方式进行比较:sshtelnet

type -a bash

以下其中之一可能存在一些条件代码:

  • /etc/profile
  • /.bash_profile
  • ~/.bash_login
  • ~/.profile
  • ~/.bashrc

PATH会根据您是通过ssh还是进行登录来设置 或 创建别名telnetPATH可以指向使用不同选项编译的不同版本的 Bash。 别名可能类似于alias bash='bash -i'

如果您echo $SHELL按照 Nikolaidis 的建议操作,那么这只会显示您的登录 shell 中设置的内容/etc/passwd。使用 可能更可靠ps。如果出于某种原因您获取了 Bash 以外的 shell,则需要检查其启动文件和环境以查看 或PATH别名是否不同。不过,通常情况下,您的交互式 shell 不应影响显式调用的bash -c工作方式。

你说得对:

据我所知,这是正确的行为,因为在两种情况下 shell 都是非交互式的(它是用 -c 调用的)。

答案2

来自Bash 手册页,这是“正常”行为 - bash 首先尝试确定您是否从 sshd 运行它:

由远程 shell 守护进程调用

Bash 尝试确定它何时通过连接到网络连接的标准输入运行,就像通过远程 shell 守护程序(通常是 rshd)或安全 shell 守护程序 sshd 运行一样。如果 Bash 确定它以这种方式运行,它会从 ~/.bashrc 读取并执行命令(如果该文件存在且可读)。如果以 sh 形式调用,它不会执行此操作。可以使用 --norc 选项来禁止此行为,可以使用 --rcfile 选项来强制读取另一个文件,但 rshd 通常不会使用这些选项调用 shell 或允许指定它们。

答案3

在两种情况下都尝试 echo $SHELL。这是为了在两种情况下看到它在 shell 中实际 bash。

相关内容