登录shell首先读取/etc/profile
,然后读取~/.bash_profile
。
非登录外壳程序从中读取/etc/bash.bashrc
,然后读取~/.bashrc
。
为什么这么重要?
由于此行中man ssh
:
如果指定了命令,那么它将在远程主机而不是登录shell上执行。
换句话说,如果ssh命令仅具有选项(没有命令),例如:
ssh user@host
它将启动一个登录外壳,登录外壳读取~/.bash_profile
。
一个SSH命令里面确实有一个命令,如:
ssh user@host :
命令在哪里:
(或什么都不做)。
它不会启动登录外壳,因此~/.bashrc
将被读取。
远程标准输入
为远程计算机中的/ dev / stdin提供的tty连接可能是实际的tty或其他东西。
对于:
$ ssh sorontar@localhost
/etc/profile sourced
$ ls -la /dev/stdin
lrwxrwxrwx 1 root root 15 Dec 24 03:35 /dev/stdin -> /proc/self/fd/0
$ ls -la /proc/self/fd/0
lrwx------ 1 sorontar sorontar 64 Dec 24 19:34 /proc/self/fd/0 -> /dev/pts/3
$ ls -la /dev/pts/3
crw--w---- 1 sorontar tty 136, 3 Dec 24 19:35 /dev/pts/3
如开始的bash所见,它以TTY(不是网络连接)结尾。
对于使用命令的ssh连接:
$ ssh sorontar@localhost 'ls -la /dev/stdin'
sorontar@localhost's password:
lrwxrwxrwx 1 root root 15 Dec 24 03:35 /dev/stdin -> /proc/self/fd/0
TTY的列表以相同的开头,但是请注意/ etc / profile不是源。
$ ssh sorontar@localhost 'ls -la /proc/self/fd/0'
sorontar@localhost's password:
lr-x------ 1 sorontar sorontar 64 Dec 24 19:39 /proc/self/fd/0 -> pipe:[6579259]
告诉外壳程序连接是管道(不是网络连接)。
因此,在这两个测试用例中,shell无法知道连接来自网络,因此无法读取~/.bashrc
(如果我们仅谈论与网络的连接)。它确实读取〜/ .bashrc,但是出于不同的原因。