Um shell de logon primeiro lê /etc/profile
e depois ~/.bash_profile
.
Um shell sem login lê /etc/bash.bashrc
e depois ~/.bashrc
.
Por que isso é importante?
Devido a esta linha em man ssh
:
Se o comando for especificado, ele será executado no host remoto em vez de no shell de logon.
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 será lido ~/.bash_profile
.
Um comando ssh que possui um comando , como:
ssh user@host :
Onde o comando está :
(ou não faz nada).
Ele não iniciará um shell de login, portanto ~/.bashrc
é o que será lido.
Remote stdin
A conexão tty fornecida para / dev / stdin no computador remoto pode ser um tty real ou 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) como 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 observe que / 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]
O que informa ao shell que a conexão é um pipe (não uma conexão de rede).
Portanto, nos dois casos de teste, o shell não pode saber que a conexão é de uma rede e, portanto, não lê ~/.bashrc
(se falamos apenas da conexão com uma rede). Ele lê ~ / .bashrc, mas por um motivo diferente.