Diga ao SSH para usar um prompt gráfico para a senha da chave


41

Como forçar o SSH a solicitar senhas usando um prompt gráfico (GTK, por exemplo) em vez do padrão que usa o terminal?

Eu tentei configurar, SSH_ASKPASS=/usr/bin/ssh-askpassmas parece não ter efeitos.

O problema é que a documentação do openssh diz

Se o ssh não tiver um terminal associado, mas DISPLAY e SSH_ASKPASS estiverem configurados, ele executará o programa especificado por SSH_ASKPASS e abrirá uma janela X11 para ler a frase secreta.

Um ssh lançado a partir da linha de comando, no meu caso como resultado de a git push, terá um terminal associado a ele, portanto a SSH_ASKPASSlógica parece ser ignorada.

Observe que não estou me referindo ssh-add, mas a invocações ssh genéricas em relação a hosts para os quais um par de chaves está presente, mas protegido por uma senha.

Respostas:


32

# 1 - Pacote ausente?

Você provavelmente está perdendo o pacote que contém ssh-askpass. Tente instalá-lo.

Fedora / CentOS / RHEL:

$ sudo yum install openssh-askpass

Debian / Ubuntu:

$ sudo apt-get install ssh-askpass-gnome ssh-askpass

Localizando utilitários ausentes

Você pode procurar por ferramentas ausentes usando estes comandos:

Fedora / CentOS / RHEL:

$ yum search ssh-askpass
Loaded plugins: langpacks, presto, refresh-packagekit
Adding en_US to language list
======================================================= Matched: ssh-askpass =======================================================
x11-ssh-askpass.x86_64 : A passphrase dialog for X and not only for OpenSSH
ksshaskpass.x86_64 : A KDE version of ssh-askpass with KWallet support
connect-proxy.x86_64 : SSH Proxy command helper
openssh-askpass.x86_64 : A passphrase dialog for OpenSSH and X

Debian / Ubuntu:

$ apt-file -l search ssh-askpass
app-install-data
cruft
git-cola
luckybackup-data
pssh
sdm-terminal
seahorse
ssh-askpass
ssh-askpass-fullscreen
ssh-askpass-gnome

# 2 - Terminal desconectado?

Eu perdi isso inicialmente, mas depois de ler mais, notei esse comentário na página de manual sshsobre a SSH_ASKPASSvariável de ambiente.

excerto

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. This is particularly
               useful when calling ssh from a .xsession or related script.  
               (Note that on some machines it may be necessary to redirect the 
               input from /dev/null to make this work.)

Se você notar no comentário, ele afirma que ssh "não possui um terminal associado" AND DISPLAY & SSH_ASKPASSestá definido. Perceber que isso é fundamental. Portanto, para sshusar SSH_ASKPASS, precisamos sshnão ter um terminal (aka. STDIN& STDOUT) Conectado a ele.

Uma maneira de fazer isso, fazendo uso do comando setsid. Não se sinta mal. Também nunca ouvi falar dessa ferramenta. Na página do manual:

setsid - executa um programa em uma nova sessão

Portanto, se rodarmos sshcomo o "programa" setsid, podemos desconectar sshdo nosso terminal atendendo aos critérios mencionados na sshpágina do manual. Os outros critérios são definidos da seguinte maneira:

$ echo $DISPLAY; echo $SSH_ASKPASS
:0.0
/usr/libexec/openssh/ssh-askpass

Então, se colocarmos tudo isso junto:

$ setsid ssh user@remotehost

Por exemplo:

$ setsid ssh user@skinner

                                       ss de ask gui

Uma solução

Se você deseja torná-lo setsid"embutido", é possível criar um alias como:

$ alias ssh="setsid ssh"

Agora, quando ssha GUI aparecer, solicitando sua senha:

$ ssh user@skinner

Referências


O ssh-askpass gnome está instalado e funciona bem se iniciado manualmente.
Gioele

@gioele - veja as atualizações, acho que descobri.
Slm

o problema dessa solução é que ele requer que eu modifique cada comando git ou rsync para usar setsid sshinstad of plain ssh.
Gioele

@gioele - você pediu um método para "forçar" a senha da GUI, isso fornece isso. Você pode substituir comandos, como sshpor aliases, setsid sshé uma abordagem. Existem outras maneiras. O fator limitante é o openssh não precisa de TTY anexado para ativar o ASK_SSHPASS.
slm

Não estou sentindo falta do pacote e não posso usá-lo setside depois trabalhar no sshmeu terminal. Isso não é uma resposta válida !? Além disso, ele estava funcionando em versões mais antigas do Ubuntu, então não tenho muita certeza de entender por que de repente parou de funcionar!
Alexis Wilke #

8

Isso não pode ser feito no OpenSSH atual: existe um problema em aberto no OpenSSH Bugzilla solicitando esse recurso a partir de 2013-07: Generalize SSH_ASKPASS .


Isso não fornece uma resposta para a pergunta. Para criticar ou solicitar esclarecimentos a um autor, deixe um comentário abaixo da postagem.
cuonglm

8
@cuonglm "isso não é possível" é uma resposta. Pode ser errado ou enganoso (não estou dizendo que seja), mas ainda é uma resposta.
terdon

2

Existe uma maneira de fechar o terminal para um único comando, e usando o redirecionamento de arquivo:

ssh-add > /dev/null < /dev/null 2>&1

Isso executará o comando ssh-addcom o terminal fechado. O que é bom e elegante, exceto pela complexidade. Mas agora que você conhece o comando correto, basta torná-lo um alias e anexá-lo a ~/.bash_aliases:

alias ssh-add="/usr/bin/ssh-add > /dev/null < /dev/null 2>&1"

E você deve estar pronto. Simplesmente digitar ssh-addagora chamará o alias que chamará o comando real com todo o redirecionamento no lugar.

O ssh-addagora pede a senha corretamente com uma caixa de diálogo ... Desde que você tenha um desses pacotes instalados (no Ubuntu ou derivados, eles podem ter outros nomes em outro lugar):

  • ssh-askpass
  • ssh-askpass-fullscreen
  • ssh-askpass-gnome
  • ksshaskpath
  • kwalletcli
  • lxqt-openssh-askpass
  • razorqt-openssh-askpasss

Agora, o que todas essas coisas significam?

O 2>&1meio redireciona o descritor de arquivo nº 2 (erro padrão) para o mesmo local do descritor de arquivo nº 1 (saída padrão).

O > /dev/nullmeio para redirecionar a saída padrão para /dev/null, que é um arquivo especial que descarta todos os dados gravados nele.

O < /dev/nullmeio redireciona a entrada padrão para /dev/null(idem).

Como uma observação lateral e um tópico fora do contexto, mas relacionada, se você quiser programar um serviço no bash, lembre-se do que realmente é um serviço, um processo com entrada, saída e erro padrão fechados que estão em segundo plano:

service > /dev/null < /dev/null 2>&1 &

Observe que a única diferença é o & adicionado no final (mais o fato de eu ter alterado o comando ssh-addpor uma teoria service. Esses comandos colocarão corretamente um serviço em segundo plano.


Obrigado pela resposta detalhada Victor. No entanto, ele não se encaixa nos meus requisitos. Como escrevi no final da pergunta, "Observe que não estou me referindo ao ssh-add, mas às invocações genéricas do ssh para hosts que possuem um par de chaves, mas são protegidos por uma senha".
Gioele

Entendo. Bem, sshfunciona exatamente da mesma maneira, e a mesma resposta que eu dei anteriormente ainda se aplica. Basta substituir todas as ocorrências de ssh-addcom sshe você está definido.
Victor

Você esqueceu apenas um pequeno detalhe: se eu fechar o stdin / stdout para ssh, como dou comandos através do ssh? ;)
Gioele

Isso funcionou para ssh-addmim - eu nem precisei redirecionar o stdout / stderr para obter o comportamento desejado, que era abrir o ssh-askpassprograma. (Ou seja, ssh-add < /dev/nullfoi o suficiente.)
Ben Stern

0

Eu tive o mesmo problema quando instalei o cavalo marinho (que fornece seahorse-ssh-askpass) sem instalar o pacote gnome-keyringno ArchLinux.

Observar o conteúdo deste pacote gnome-keyring( https://www.archlinux.org/packages/extra/i686/gnome-keyring ) pode ajudá-lo a resolver seu problema.

De qualquer forma, se você não se importa em usar cavalos-marinhos, também pode instalar os pacotes seahorsee gnome-keyring(ou os equivalentes para sua distribuição). Se você não usar o Gnome, poderão ser necessárias etapas adicionais: https://wiki.archlinux.org/index.php/GNOME_Keyring .

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.