Un shell de connexion lit d'abord /etc/profile
, puis ~/.bash_profile
.
Un shell sans connexion lit à partir de /etc/bash.bashrc
puis ~/.bashrc
.
Pourquoi est-ce important?
En raison de cette ligne dans man ssh
:
Si la commande est spécifiée, elle est exécutée sur l'hôte distant au lieu d'un shell de connexion.
En d'autres termes, si la commande ssh n'a que des options (pas une commande), comme:
ssh user@host
Il va commencer un shell de connexion, un shell de connexion lit ~/.bash_profile
.
Une commande ssh qui a une commande , comme:
ssh user@host :
Où se trouve la commande :
(ou ne rien faire).
Il ne démarrera pas un shell de connexion, c'est donc ~/.bashrc
ce qui sera lu.
Stdin à distance
La connexion tty fournie pour / dev / stdin sur l'ordinateur distant peut être un tty réel ou autre chose.
Pour:
$ 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
Ce qui se termine par un ATS (pas une connexion réseau) comme le bash démarré le voit.
Pour une connexion ssh avec une commande:
$ 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
La liste des ATS commence de la même manière, mais notez que / etc / profile n'a pas été fourni.
$ 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]
Ce qui indique au shell que la connexion est un canal (pas une connexion réseau).
Ainsi, dans les deux cas de test, le shell est incapable de savoir que la connexion provient d'un réseau et ne lit donc pas ~/.bashrc
(si nous parlons uniquement de la connexion à un réseau). Il lit ~ / .bashrc, mais pour une raison différente.