man ssh
diz:
SSH_ASKPASS
If ssh needs a passphrase, it will read the passphrase from the
current terminal if it was run from a terminal. If ssh does not
have a terminal associated with it but DISPLAY and SSH_ASKPASS
are set, it will execute the program specified by SSH_ASKPASS
and open an X11 window to read the passphrase.
Eu gostaria que o SSH usasse um programa askpass, mesmo que fosse executado em um terminal.
Ocasionalmente, tenho que me conectar a servidores, onde há algum atraso na exibição de um prompt de senha (talvez devido a problemas de rede, talvez devido a tentativas de pesquisas reversas no DNS, ...). Fico aborrecido e mudo para outra coisa, e esqueço a tentativa de conexão. (Insira uma piada sobre o tempo de atenção de um peixe dourado.) Quando finalmente volto a ele, o prompt excede o tempo limite e até mesmo uma senha correta resultaria em uma conexão fechada.
As chaves seriam uma solução, mas nem todo sistema que eu uso possui minhas chaves SSH habituais. No entanto, eu costumo usar sistemas Ubuntu, e o Ubuntu tem um programa askH SSH instalado por padrão.
Se uma janela askpass aparecer, eu ficaria imediatamente ciente disso. Esse é um compromisso bom o suficiente para mim, se eu conseguir fazê-lo funcionar.
/dev/tty
(LD_PRELOAD
?).Respostas:
Isso será um pouco mais complicado, mas a combinação de várias peças fará com que funcione:
Explicação
Para forçar
ssh
a usar o$SSH_ASKPASS
programa, você não pode permitirssh
ver o realtty
. É apenas condição. Isso pode ser feito usandosetsid
e usando-n
alternar parassh
.Este caso iniciaria a conexão, mas você não conseguiria interagir com o shell, o que provavelmente também é seu requisito;) (e também interrompe seu TTY local).
Mas você pode desistir da "primeira sessão". Você também deve adicionar a
-N
opção, que suprimirá o comando remoto e fará apenas a autenticação .Além disso, o possível "lixo" de saída pode ser redirecionado
&> /dev/null
se você não estiver interessado nele.Configurar
ControlMaster
emssh_config
. É um recurso interessante e uma vez que a conexão é estabelecida, você pode "iniciar" as sessões rapidamente. Este trecho~/.ssh/config
deve fazer o seguinte:Você pode adicionar isso a alguns
host
blocos que listam seus "candidatos lentos" ou em qualquer lugar. É quase sem sobrecarga.Linha final
Então você deve conseguir se conectar dessa maneira ao host que espera que demore um pouco:
Todo o processo pode ser simplificado pela
alias
função bash, executando as duas coisas em uma única etapa, mas é deixado na imaginação dos leitores.Somente argumentos de linha de comando
Você pode unir as duas coisas na linha de comando sem
ssh_config
parte:A seguinte função deve funcionar quando as opções SSH não são especificadas:
-f
instrui o SSH a ir para o plano de fundo imediatamente antes da execução do programa, após a obtenção da senha.-w
dizsetsid
para aguardar o término do programa. Nesse caso, isso acontece quando o SSH fica em segundo plano. Combinado comssh -f
, a espera manual entre os dois comandos SSH pode ser eliminada.fonte
ControlMaster
já está configurado, justamente porque é difícil digitar senhas nesses casos. Não deve ser difícil escrever uma função que teste um mestre existente e use o askpass se não conseguir encontrar um. Obrigado!Um por manual SSH (
man ssh
):Portanto, você precisa desassociar o terminal (por exemplo, adicionando um tubo) e verifique se
DISPLAY
não está definido (se você deseja usar o terminal para sua senha).Exemplo simples:
O mesmo com
ssh-add
:fonte
Pseudo-terminal will not be allocated because stdin is not a terminal
, então parece que o cachimbo está fazendo alguma coisa.ssh </dev/null
teve o mesmo efeito. No entanto, nos dois casos, ele ainda pede uma senha e ainda posso digitar uma. Tentei no Linux e Mac. Eu tentei,ssh -vvv
mas não diz nada de útil.SSH_ASKPASS=/foo DISPLAY= setsid ssh host
funciona embora.