Durante o meu aprendizado sobre o shell de login não interativo, encontrei 2 maneiras de executar remotamente os comandos via SSH. Para mim, ambos parecem ser iguais. Mas infelizmente não são.
Com o comando echo "shopt login_shell; echo \$-" | ssh -l poweruser 192.168.1.67
, recebo a seguinte saída.
Pseudo-terminal will not be allocated because stdin is not a terminal.
[email protected]'s password:
login_shell on
hBs
Mas com o comando ssh -l poweruser 192.168.1.67 "shopt login_shell; echo \$-"
, recebo uma saída diferente.
[email protected]'s password:
login_shell off
hBc
Você poderia dizer por que o shell não é um shell de login no segundo caso, embora solicite a senha.
man ssh
documentos que :A razão é que em um caso você especificou um comando, e no outro não, e
ssh
deliberadamente (por design) se comporta de forma diferente nesses casos.Naquele em que você não forneceu um comando, um shell de login foi iniciado e leu a entrada canalizada e a executou. Naquele em que você forneceu um comando, ele foi iniciado.
A solicitação da senha não está relacionada. Isso está autenticando você no servidor, antes que o shell ou comando seja iniciado.
Isso é impreciso, mas pode ser uma maneira útil de olhar para isso:
echo … | ssh …
“parece” uma sessão interativa —ssh
está lendo comandos do shell de sua entrada padrão após o início. Agora, é claro,ssh
pode distinguir entre seu stdin ser um pipe ou um tty (ou um arquivo), mas pode não se incomodar em fazê-lo. Tratar um pipe diferente de um tty pode dificultar o uso de algo comoexpect
( página man ).echo … | ssh …
é como ligar para alguém no telefone e pedir para fazer alguma coisa. Potencialmente, você quer que eles façam isso imediatamente (enquanto você ainda está no telefone) e, portanto, um shell de login parece mais apropriado.Com , você está especificando os comandos a serem executados antes mesmo de fazer a conexão. Você não pode fazer algo condicionalmente, com base nas respostas que você vê (exceto talvez apertar + se algo der errado). Portanto, não pode ser interativo; é mais como processamento em lote .
ssh … command
ssh
CtrlCÉ como enviar um e-mail para alguém e pedir para fazer algo. Você não espera uma resposta imediata e, portanto, um shell de login parece menos apropriado.
Para mais informações, consulte Por que um shell de "login" em vez de um shell "sem login"? (onde - divulgação - a única resposta foi escrita por mim) e Diferença entre o Shell de login e o Shell sem login? - embora, depois de uma rápida olhada, não veja nada que seja diretamente relevante para essa pergunta.