Una shell di login legge prima /etc/profile
e poi ~/.bash_profile
.
Una shell senza login legge da /etc/bash.bashrc
e poi ~/.bashrc
.
Perché è importante?
A causa di questa linea in man ssh
:
Se viene specificato un comando , viene eseguito sull'host remoto anziché su una shell di accesso.
In altre parole, se il comando ssh ha solo opzioni (non un comando), come:
ssh user@host
Avvierà una shell di login, una shell di login legge ~/.bash_profile
.
Un comando ssh che ha un comando , come:
ssh user@host :
Dove si trova il comando :
(o non fare nulla).
Sarà Non avviare una shell di login, quindi, ~/.bashrc
è quello che verrà letto.
Stdin remoto
La connessione tty fornita per / dev / stdin nel computer remoto può essere una tty effettiva o qualcos'altro.
Per:
$ 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
Il che termina in un TTY (non una connessione di rete) come viene visto dalla bash avviata.
Per una connessione ssh con un comando:
$ 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
L'elenco dei TTY inizia allo stesso modo, ma nota che / etc / profile non è stato fornito.
$ 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]
Il che dice alla shell che la connessione è una pipe (non una connessione di rete).
Quindi, in entrambi i casi di test, la shell non è in grado di sapere che la connessione proviene da una rete e quindi non legge ~/.bashrc
(se parliamo solo della connessione a una rete). Legge ~ / .bashrc, ma per una ragione diversa.