Como o ssh executa um comando?

15

Estou usando o Bash no cliente e no servidor. Ao executar um comando sobre SSH:

  • ssh <host> 'declare' fornece uma lista de variáveis ​​de shell.

  • ssh <host> 'mount' fornece uma lista de pontos de montagem.

No entanto, declareé um Bash embutido, enquanto mounté um comando externo. Como o SSH sabe qual executar se houver um shell interno e um comando externo com o mesmo nome no servidor?

Cyker
fonte
2
O ssh sempre executa seu shell, que é armazenado no /etc/passwd. Se for /usr/sbin/nologinvocê não pode logar.
Ipor Sircer 23/12

Respostas:

21

A sshexecuta os comandos fornecidos no shell do usuário remoto (obtido a partir do /etc/passwd), como visível a partir do código-fonte :

argv[0] = (char *) shell0;
argv[1] = "-c";
argv[2] = (char *) command;
argv[3] = NULL;
execve(shell, argv, env);

Portanto, os respectivos comandos que são executados para o seu exemplo no servidor remoto são:

  • bash -c declare
  • bash -c mount

Ambos são passados ​​para bashe avaliados. Os internos são avaliados internamente e os comandos externos são chamados como se você fizesse isso no prompt de linha de comando local.

Jakuje
fonte
Se um shell é sempre iniciado pelo ssh daemon, o interessante é que, quando o usuário chama ssh com um comando, esse shell não é um shell de login, mesmo que o usuário tenha realizado algum tipo de login. Qualquer ideia?
Cyker
Sim. O shell que executa o comando é 1) Nenhum shell de login 2) Não é interativo. Você pode forçar a interatividade pelo -tswitch, mas ele ainda não carregará os arquivos rc.
Jakuje
1
Observe que sshd(o servidor) está fazendo isso, não ssh(o cliente).
Ysdx
@ysdx Eles estão trabalhando juntos. O cliente diz ao servidor para executar o comando através de um shell, e o servidor faz isso.
Barmar