Posso obter o SSH para usar um programa askpass mesmo se ele foi executado a partir de um terminal?

7

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 a partir de um terminal.

Ocasionalmente, eu tenho que me conectar a servidores, onde há algum atraso na exibição de uma solicitação de senha (talvez devido a problemas de rede, talvez devido a tentativas de pesquisas inversas de DNS,…). Eu fico irritado e mudo para outra coisa, e esqueço a tentativa de conexão. (Insira uma piada sobre a atenção de um peixinho dourado.) Quando eu finalmente voltar a ele, o tempo limite do prompt e até mesmo uma senha correta resultariam em uma conexão fechada.

As chaves seriam uma solução, mas nem todo sistema que eu uso tem minhas chaves SSH usuais. No entanto, eu costumo usar sistemas Ubuntu, e o Ubuntu tem um programa askpass SSH instalado por padrão.

Se uma janela do askpass aparecesse, no entanto, eu estaria imediatamente ciente disso. Isso é um compromisso bastante bom para mim, se eu puder fazê-lo funcionar.

    
por muru 27.03.2016 / 22:34

2 respostas

6

Isso será um pouco mais complicado, mas a combinação de várias peças fará com que funcione:

Explicação

  1. Para forçar o ssh a usar o programa $SSH_ASKPASS , não é possível permitir que ssh veja o% realtty. É apenas condição. Isso pode ser feito usando setsid e usando -n alternando para ssh .

    Este caso iniciaria a conexão, mas você não seria capaz de interagir com o shell, que provavelmente também é sua exigência;) (e também interrompe seu TTY local).

    Mas você pode desistir da "primeira sessão". Você também deve adicionar -N switch, que suprimirá o comando remoto e fará apenas a autenticação .

    Além disso, o possível "lixo" de saída pode ser redirecionado para &> /dev/null se você não estiver interessado nele.

  2. Configure ControlMaster em ssh_config . É um recurso interessante e assim que a conexão é estabelecida, você pode "ativar" as sessões rapidamente. Este snippet em ~/.ssh/config deve fazer isso:

    ControlPath ~/.ssh/controlmasters/%r@%h:%p
    ControlMaster auto
    ControlPersist 5m
    

    Você pode adicionar isso em algum bloco host listando seus "candidatos lentos" ou apenas em qualquer lugar. Não é quase nenhuma sobrecarga.

Linha final

Em seguida, você poderá se conectar dessa maneira ao host que espera que demore:

setsid ssh -nN host
# wait, insert password in the X11 prompt
ssh host
# will bring you directly to your session

Todo o processo pode ser simplificado pela função alias ou bash fazendo as duas etapas, mas é deixada na imaginação dos leitores.

Apenas argumentos da linha de comando

Você pode unir as duas coisas na linha de comando sem ssh_config part:

setsid ssh -nNMS ~/.ssh/masters/%C host
# wait, insert password in the X11 prompt
ssh -S ~/.ssh/masters/%C host
# will bring you directly to your session

A seguinte função deve funcionar quando as opções de SSH não são especificadas:

ssh() {
    if ! command ssh -o PasswordAuthentication=no "$1" true
    then
        setsid -w ssh -fnN "$1"
    fi
    command ssh "$@"
}
  • -f instrui o SSH a ir para o segundo plano antes da execução do programa, após a senha.
  • -w informa setsid para aguardar o final do programa. Nesse caso, isso acontece quando o SSH vai para o segundo plano. Combinado com ssh -f , a espera manual entre os dois comandos SSH pode ser eliminada.
  • A função assume que o primeiro argumento é o nome do host.
  • O teste é apenas para evitar conexões SSH desnecessárias.
por 28.03.2016 / 00:14
3

A por manual do SSH ( man ssh ):

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.

Portanto, você precisa desassociar o terminal (por exemplo, adicionando um canal) e certificar-se de que DISPLAY não esteja definido (se você quiser usar o terminal para sua frase secreta).

Exemplo simples:

echo foo | SSH_ASKPASS=/my/cmd DISPLAY= ssh ...

O mesmo com ssh-add :

$ echo foo | SSH_ASKPASS=/my/cmd DISPLAY= ssh-add id_rsa
ssh_askpass: exec(/my/cmd): No such file or directory
    
por 22.12.2016 / 14:32