Eine Login-Shell liest zuerst /etc/profile
und dann ~/.bash_profile
.
Eine Nicht-Login-Shell liest von /etc/bash.bashrc
und dann ~/.bashrc
.
Warum ist das so wichtig?
Wegen dieser Zeile in man ssh
:
Wenn ein Befehl angegeben wird, wird er auf dem Remote-Host anstelle einer Anmeldeshell ausgeführt.
Mit anderen Worten, wenn der Befehl ssh nur Optionen enthält (kein Befehl), wie zum Beispiel:
ssh user@host
Es wird eine Login-Shell gestartet, eine Login-Shell liest ~/.bash_profile
.
Ein ssh-Befehl, der einen Befehl hat , wie:
ssh user@host :
Wo der Befehl ist :
(oder nichts tun).
Es wird keine Login-Shell gestartet, daher ~/.bashrc
wird gelesen.
Remote stdin
Die angegebene tty-Verbindung für / dev / stdin auf dem Remotecomputer ist möglicherweise eine tatsächliche tty oder etwas anderes.
Zum:
$ 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
Was in einem TTY (keine Netzwerkverbindung) endet, wie die gestartete Bash es sieht.
Für eine SSH-Verbindung mit einem Befehl:
$ 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
Die Liste der TTYs beginnt gleich, aber beachten Sie, dass / etc / profile nicht bezogen wurde.
$ 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]
Das sagt der Shell, dass die Verbindung eine Pipe ist (keine Netzwerkverbindung).
In beiden Testfällen kann die Shell also nicht wissen, dass die Verbindung von einem Netzwerk stammt, und liest daher nicht ~/.bashrc
(wenn wir nur über die Verbindung zu einem Netzwerk sprechen). Es liest ~ / .bashrc, aber aus einem anderen Grund.