Оболочка входа сначала читает, /etc/profile
а затем ~/.bash_profile
.
Оболочка без входа в систему читает /etc/bash.bashrc
и затем ~/.bashrc
.
Почему это важно?
Из-за этой строки в man ssh
:
Если указана команда , она выполняется на удаленном хосте вместо оболочки входа в систему.
Другими словами, если команда ssh имеет только параметры (не команду), например:
ssh user@host
Это запустит оболочку входа в систему, оболочка входа в систему читает ~/.bash_profile
.
Команда ssh, которая имеет команду , например:
ssh user@host :
Где команда :
(или ничего не делать).
Это не запустит оболочку входа в систему, поэтому ~/.bashrc
это то, что будет прочитано.
Удаленный ввод
Предоставленное tty-соединение для / dev / stdin на удаленном компьютере может быть действительным tty или чем-то другим.
Для:
$ 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
Который заканчивается TTY (не сетевым подключением), как его видит запущенный bash.
Для соединения SSH с помощью команды:
$ 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
Список TTY начинается так же, но обратите внимание, что / etc / profile не был получен.
$ 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]
Что говорит оболочке, что соединение представляет собой канал (не сетевое соединение).
Таким образом, в обоих тестовых случаях оболочка не может знать, что соединение из сети и, следовательно, не читает ~/.bashrc
(если мы говорим только о соединении с сетью). Он читает ~ / .bashrc, но по другой причине.