Um shell de login lê primeiro /etc/profile
e, em seguida, ~/.bash_profile
.
Um shell de não-login lê de /etc/bash.bashrc
e, em seguida, ~/.bashrc
.
Por que isso é importante?
Por causa dessa linha em man ssh
:
If command is specified, it is executed on the remote host instead of a login shell.
Em outras palavras, se o comando ssh tiver apenas opções (não um comando), como:
ssh user@host
Ele iniciará um shell de login, um shell de login lê ~/.bash_profile
.
Um comando ssh que tem um comando , como:
ssh user@host :
Onde o comando é :
(ou não faz nada).
Não irá não iniciar uma shell de login, portanto ~/.bashrc
é o que será lido.
stdin remoto
A conexão tty fornecida para / dev / stdin no computador remoto pode ser um tty real ou qualquer outra coisa.
Para:
$ 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
Que termina em um TTY (não em uma conexão de rede) quando o bash iniciado o vê.
Para uma conexão ssh com um 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
A lista de TTYs começa da mesma forma, mas note que o / etc / profile não foi originado.
$ 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]
Que diz ao shell que a conexão é um pipe (não uma conexão de rede).
Assim, em ambos os casos de teste, o shell não pode saber que a conexão é de uma rede e, portanto, não lê ~/.bashrc
(se falarmos apenas sobre a conexão a uma rede). Ele lê ~ / .bashrc, mas por um motivo diferente.