Aviso:
Seria muito bom ler essa questão antes de marcá-la como duplicada. Li dezenas de outras perguntas (aqui, em superuser.com, serverfault.com e assim por diante), todas lidando com o SSH não encontrando / dev / tty, mas nenhuma delas com relação a keychain
, o que na verdade deve evitar esse problema.
Tendo dito isto:
Eu tenho um roteador Linux (extensão Debian) que está conectado à Internet via pppoe
. Meu provedor me fornece um endereço IP dinâmico que muda de tempos em tempos. Sempre que isso acontece, o roteador deve executar um script em outro host via SSH.
Configurei corretamente o SSH no roteador e no outro host, usando a autenticação de chave pública. As chaves SSH são protegidas por uma frase secreta.
Além disso, configurei keychain
conforme recomendado aqui . De acordo com o meu entendimento desta página (e outros), keychain
"fornece" o mesmo processo ssh-agent
para qualquer cliente SSH; quando estou logando, ele inicia ssh-agent
(se nenhum estiver funcionando ainda) e pergunta (ou faz ssh perguntar) pela (s) senha (s); a partir de então, as chaves SSH estão na memória de ssh-agent
e prontamente disponíveis para outros processos.
Isso funciona com a seguinte exceção:
Eu coloquei um script em /etc/ppp/ip-up.d
; esse script contém (entre outras) as seguintes linhas:
eval '/usr/bin/keychain --noask --agents ssh --eval id_rsa_ipupdate'
ssh -i /root/.ssh/id_rsa_ipupdate [email protected] '/path/to/remote/command'
Embora o script seja executado como esperado toda vez que o provedor designar um novo endereço IP, o comando SSH falha, ou seja, o script no host remoto não é executado. Demorei um pouco para depurar isso, mas depois de fazer pppd
registrar suas mensagens de depuração em um arquivo separado, finalmente encontrei o motivo. Algumas linhas relevantes das mensagens de depuração do pppd:
debug1: Server accepts key: pkalg ssh-rsa blen 535
debug2: input_userauth_pk_ok: fp SHA256:BZSkP9mMIB+cCi5WfgYnqT2QmskTgsKHsWuNXHxIQu0
debug3: sign_and_send_pubkey: RSA SHA256:BZSkP9mMIB+cCi5WfgYnqT2QmskTgsKHsWuNXHxIQu0
debug1: read_passphrase: can't open /dev/tty: No such device or address
debug2: no passphrase given, try next key
debug2: we did not send a packet, disable method
debug1: No more authentication methods to try.
Permission denied (publickey).
Portanto, o SSH não encontra / dev / tty, o que é provavelmente normal, dado que é executado a partir de pppd
neste caso e, portanto, não pode ler a senha do teclado. Até agora tudo bem.
Mas o ponto chave é: Por que o SSH (obviamente) deseja ler a frase secreta do teclado, embora um ssh-agent
esteja em execução, gerenciado por keychain
e tendo a chave prontamente disponível?
Anote a primeira linha do fragmento de script acima. Ele deve garantir que SSH_AUTH_SOCK
e SSH_AGENT_PID
sejam definidos e exportados corretamente.
Por favor, note também que o script funciona perfeitamente (sem pedir uma passphrase) quando eu o executo a partir da linha de comando.
Para deixar as coisas absolutamente claras: primeiro faço login no roteador. Como configurei o keychain
conforme recomendado em sua página inicial, sou imediatamente solicitado pela (s) frase (s) de acesso (s) ao efetuar login. Quando, em seguida, chamo meu script da linha de comando, ele funciona como esperado sem solicitar a frase secreta. Mas quando o script é chamado por pppd
, a linha SSH falha.
Alguém poderia, por favor, explicar por que o SSH quer / dev / tty embora possa carregar as chaves do ssh-agent, e como contornar esse problema?
P.S. Sim, posso viver com o fato de que o script irá falhar inevitavelmente depois que o roteador for reinicializado, até que eu faça o login pelo menos uma vez: -)
EDIT 1
Eu fiz mais pesquisas e notei o seguinte: A linha
eval '/usr/bin/keychain --noask --agents ssh --eval id_rsa_ipupdate'
do script acima definitivamente cria um segundo processo ssh-agent
quando o script é executado por pppd
devido a uma alteração do endereço IP público. Isso significa que keychain
não encontra o primeiro (que tem as chaves SSH disponíveis) por algum motivo estranho.
Novamente, isso só acontece quando o script é executado por pppd
; quando eu chamo o script da linha de comando, está tudo bem.
Agora estou pensando em abrir um relatório de bug ou algo assim. A propósito, minha keychain
versão é 2.8.2
.