我使用的是 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
登录)。以每种方式进行比较:ssh
telnet
type -a bash
以下其中之一可能存在一些条件代码:
/etc/profile
/.bash_profile
~/.bash_login
~/.profile
~/.bashrc
这PATH
会根据您是通过ssh
还是进行登录来设置 或 创建别名telnet
。PATH
可以指向使用不同选项编译的不同版本的 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。