Este é o código OpenSSH 7.3p1 para invocar .ssh/rc
. É de "session.c". O arquivo rc é chamado por uma função chamada do_rc_files()
. Todo esse código é executado no servidor. Todas as opções referenciadas são obtidas de sshd_config
, juntamente com a entrada authorized_keys
do arquivo para a chave que autenticou a sessão (se a autenticação por chave foi usada).
/*
* Run $HOME/.ssh/rc, /etc/ssh/sshrc, or xauth (whichever is found
* first in this order).
*/
static void
do_rc_files(Session *s, const char *shell)
{
[...]
/* ignore _PATH_SSH_USER_RC for subsystems and admin forced commands */
if (!s->is_subsystem && options.adm_forced_command == NULL &&
!no_user_rc && options.permit_user_rc &&
stat(_PATH_SSH_USER_RC, &st) >= 0) {
snprintf(cmd, sizeof cmd, "%s -c '%s %s'",
shell, _PATH_BSHELL, _PATH_SSH_USER_RC);
if (debug_flag)
fprintf(stderr, "Running %s\n", cmd);
f = popen(cmd, "w");
if (f) {
if (do_xauth)
fprintf(f, "%s %s\n", s->auth_proto,
s->auth_data);
pclose(f);
} else
fprintf(stderr, "Could not run %s\n",
_PATH_SSH_USER_RC);
} else if (stat(_PATH_SSH_SYSTEM_RC, &st) >= 0) {
...
do_rc_files()
em si é chamado assim:
if (!options.use_login)
do_rc_files(s, shell);
Então, isso nos diz:
- Nenhum arquivo rc é invocado se a opção sshd "UseLogin" estiver configurada.
- .ssh / rc não será chamado se a sessão estiver chamando um subsistema. Isso afeta as sessões de SFTP, por exemplo.
- .ssh / rc não será chamado se a sessão estiver sujeita a uma configuração de
ForceCommand
emsshd_config
(mas não para comandos forçados deauthorized_keys
). - .ssh / rc não é invocado se a opção
authorized_keys
"no-user-rc" tiver sido definida (ou "restrita", o que implica no-user-rc). - .ssh / rc não será chamado se a opção
sshd_config
"PermitUserRC" estiver configurada como "no". - .ssh / rc não é chamado se não estiver presente, relativo ao diretório inicial do usuário.
Se o OpenSSH decidir invocar o .ssh / rc, ele acabará invocando este comando:
$SHELL -c '/bin/sh .ssh/rc'
onde "$ SHELL" é o shell de login do usuário. Isso falhará se o shell do usuário não aceitar a opção "-c" para executar um comando. Ele também pode falhar se /bin/sh
estiver ausente ou não estiver funcionando corretamente.