我正在使用AIX 5.3服务器,其中设置了一个.bashrc文件来回显“执行bashrc”。 当我使用sshlogin到服务器并运行:
bash -c ls
我得到:
Executing bashrc . .. etc....
但是,当我用同一个用户logintelnet并运行相同的命令,我得到:
. .. etc....
显然,在telnet的情况下,没有调用.bashrc。 就在我可以告诉这是正确的行为,因为在这两种情况下shell都是非交互式的(用-c调用它)。 但是,ssh情况似乎是以交互方式调用shell。 它似乎没有调用.profile,所以它不是创build一个loginshell。 在这两种情况下,我看不出有什么明显的不同。
什么可能导致bash行为的差异?
请检查以确定您所在的loginshell没有别名或不同的PATH具体取决于您是通过ssh还是telnet 。 比较这种方式:
type -a bash
可能有一些条件代码中的一个:
/etc/profile /.bash_profile ~/.bash_login ~/.profile ~/.bashrc 根据您是通过ssh还是telnetlogin, PATH设置不同或创build别名。 PATH可以指向使用不同选项编译的不同版本的Bash。 别名可以是alias bash='bash -i' 。
如果您按照Nikolaidis的build议echo $SHELL ,那么只会显示/etc/passwd设置的内容。 使用ps可能更可靠。 如果由于某种原因,你得到的不是Bash的shell,你需要检查它的启动文件和环境,看是否PATH或别名不同。 但是,通常情况下,交互式shell不应该影响显式调用bash -c工作方式。
你对此是正确的:
就在我可以告诉这是正确的行为,因为在这两种情况下shell都是非交互式的(用-c调用它)。
从Bash手册页 ,这是“正常的”行为 – bash试图决定是否从sshd首先运行它:
由远程shell守护进程调用
Bash试图确定它的运行时间是什么时候它的标准input连接到一个networking连接上,就像远程shell守护进程(通常是rshd)或者安全shell守护进程sshd一样。 如果Bash确定它正在以这种方式运行,它将读取并执行〜/ .bashrc中的命令,如果该文件存在且可读的话。 如果调用sh,它不会这样做。 –norc选项可以用来禁止这种行为,而–rcfile选项可以用来强制读取另一个文件,但rshd通常不会用这些选项调用shell,或者允许指定它们。
在这两种情况下试试echo $ SHELL。 这是在两种情况下实际上看到它轰击。