Sem um comando, o SSH executa um shell de login. Para bash
, isso envolve o fornecimento de .profile
(que, no Ubuntu, origina .bashrc
) (e /etc/profile
, que origina /etc/bash.bashrc
). Existem outros arquivos que podem ser originados, como .bash_profile
, mas uma configuração padrão do Ubuntu possui apenas .profile
.
$ grep bashrc /etc/profile .profile
/etc/profile: # The file bash.bashrc already sets the default PS1.
/etc/profile: if [ -f /etc/bash.bashrc ]; then
/etc/profile: . /etc/bash.bashrc
.profile: # include .bashrc if it exists
.profile: if [ -f "$HOME/.bashrc" ]; then
.profile: . "$HOME/.bashrc
Quando executado com um comando, o SSH não executa um shell de login, portanto, de acordo com man bash
( seção INVOCATION
):
When an interactive shell that is not a login shell is started, bash
reads and executes commands from /etc/bash.bashrc and ~/.bashrc, if
these files exist. This may be inhibited by using the --norc option.
The --rcfile file option will force bash to read and execute commands
from file instead of /etc/bash.bashrc and ~/.bashrc.
No entanto, com um comando, bash
não está sendo executado de forma interativa. Então, por que .bashrc
é originado? Novamente, de man bash
:
Bash attempts to determine when it is being run with its standard input
connected to a network connection, as when executed by the remote shell
daemon, usually rshd, or the secure shell daemon sshd. If bash
determines it is being run in this fashion, it reads and executes
commands from ~/.bashrc and ~/.bashrc, if these files exist and are
readable. It will not do this if invoked as sh. The --norc option may
be used to inhibit this behavior, and the --rcfile option may be used
to force another file to be read, but neither rshd nor sshd generally
invoke the shell with those options or allow them to be specified.
Outros arquivos podem ser lidos pelo SSH (de man ssh
, seção FILES
):
~/.ssh/rc
Commands in this file are executed by ssh when the user logs in,
just before the user's shell (or command) is started. See the
sshd(8) manual page for more information.
/etc/ssh/sshrc
Commands in this file are executed by ssh when the user logs in,
just before the user's shell (or command) is started. See the
sshd(8) manual page for more information.
Para variáveis de ambiente, (de man ssh
, seção ENVIRONMENT
):
Additionally, ssh reads ~/.ssh/environment, and adds lines of the format
“VARNAME=value” to the environment if the file exists and users are
allowed to change their environment. For more information, see the
PermitUserEnvironment option in sshd_config(5).
O módulo pam_env
está habilitado para SSH:
$ grep pam_env /etc/pam.d/sshd
# /etc/security/pam_env.conf.
session required pam_env.so # [1]
session required pam_env.so user_readenv=1 envfile=/etc/default/locale
Portanto, as variáveis em /etc/environment
e ~/.pam_environment
também são definidas (e /etc/default/locale
, pois envfile
está definido). No entanto, esses arquivos não são originados da forma como .profile
é, portanto, você não pode usar comandos shell aqui.