
Recentemente, tive que resolver um caso paralelo em que tive que adicionar uma série de impressões digitais do servidor às de um usuário known_hosts
(a autorização é realizada com um par de chaves). Achei que a solução mais fácil seria apenas ligar
yes yes | ssh *login@host*
. Surpreendentemente (pelo menos para mim), isso não funciona: ssh
ainda pergunta se deseja adicionar a impressão digital e requer entrada manual.
Minha pergunta é: por que isso acontece, como em,qual é o mecanismo subjacente a esse comportamento?
Responder1
Para este prompt, ssh
não use ostdin&saída padrãostreams – para evitar que o prompt seja confundido com a entrada/saída do comando remoto. (Imagine rodar ssh host cat something.tar | tar x
e, de repente, tar x
reclamar de lixo em sua entrada.)
Em vez disso, ssh
abre o dispositivo especial /dev/tty
, que sempre aponta para seu "terminal de controle", escreve o prompt lá e lê a resposta dele.
Especificamente para o seu problema, o OpenSSH vem com ssh-keyscan
uma ferramenta para obter chaves públicas de vários servidores ao mesmo tempo.
ssh-keyscan host1 host2 host3 >> ~/.ssh/known_hosts
(Não tenho certeza se você quis dizer known_hosts
ou realmente precisava authorized_keys
aqui.)
Para o caso geral, o expect
utilitário pode ser usado para automatizar programas que normalmente fazem E/S via tty.