Não pode ser feito no OpenSSH atual: há um problema aberto no Bugzilla do OpenSSH solicitando este recurso a partir de 2013-07: Generalize o SSH_ASKPASS .
Como posso 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 definir SSH_ASKPASS=/usr/bin/ssh-askpass
, mas parece não ter efeitos.
O problema é o fato da documentação do openssh dizer
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.
Um ssh lançado a partir da linha de comando, no meu caso como resultado de um git push
, irá ter um terminal associado a ele, então a lógica SSH_ASKPASS
parece ser ignorada. / p>
Por favor, note que não estou me referindo a ssh-add
, mas a invocações genéricas de ssh em relação a hosts para os quais um par de chaves está presente, mas protegido por uma frase secreta.
Não pode ser feito no OpenSSH atual: há um problema aberto no Bugzilla do OpenSSH solicitando este recurso a partir de 2013-07: Generalize o SSH_ASKPASS .
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
Você pode procurar 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
Eu perdi isso inicialmente, mas depois de ler mais, notei esse comentário na página de manual de ssh
sobre a variável de ambiente SSH_ASKPASS
.
trecho
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ê perceber no comentário, ele afirma que o ssh "não tem um terminal associado" AND DISPLAY
& SSH_ASKPASS
estão definidos. Percebendo isso é fundamental. Portanto, para obter ssh
para usar SSH_ASKPASS
, precisamos obter ssh
para não ter um terminal (também conhecido por. STDIN
& STDOUT
) anexado a ele.
Uma maneira de fazer isso usando o comando setsid
. Não se sinta mal. Eu nunca ouvi falar dessa ferramenta também. Na página do manual:
setsid - run a program in a new session
Portanto, se executarmos ssh
como o "programa" para setsid
, poderemos desanexar ssh
de nosso terminal atendendo aos critérios mencionados na man page de ssh
. Os outros critérios são definidos da seguinte forma:
$ echo $DISPLAY; echo $SSH_ASKPASS
:0.0
/usr/libexec/openssh/ssh-askpass
Então, se juntarmos tudo isso:
$ setsid ssh user@remotehost
Por exemplo:
$ setsid ssh user@skinner
Sevocêquiserfazercomqueosetsid
seja"interno", crie aliases assim:
$ alias ssh="setsid ssh"
Agora, quando você ssh
obterá a interface gráfica solicitando sua senha:
$ ssh user@skinner
Existe uma maneira de fechar o terminal para um único comando, ou seja, usando o redirecionamento de arquivos:
ssh-add > /dev/null < /dev/null 2>&1
Isso executará o comando ssh-add
com o terminal fechado. O que é bom e elegante, exceto pela complexidade. Mas agora que você sabe o comando correto, basta criar 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 definido. Basta digitar ssh-add
para invocar o alias que invocará o comando real com todo o redirecionamento em vigor.
O ssh-add
agora pergunta corretamente a senha 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>&1
significa o descritor de arquivo de redirecionamento # 2 (erro padrão) para o mesmo descritor de arquivo de local # 1 (saída padrão) é direcionado para.
O > /dev/null
significa redirecionar a saída padrão para /dev/null
, que é um arquivo especial que descarta todos os dados gravados nela.
O < /dev/null
significa redirecionar a entrada padrão para /dev/null
(idem).
Como uma nota secundária, e um tópico off, mas uma nota relacionada, se você quiser programar um serviço no bash, você deve lembrar o que um serviço realmente é, um processo com entrada, saída e erro padrão que está em o fundo:
service > /dev/null < /dev/null 2>&1 &
Observe que a única diferença é o & adicionado no final (mais o fato de que eu mudei o comando ssh-add
para um teórico service
. Esses comandos irão colocar corretamente um serviço em segundo plano.
Eu tive o mesmo problema quando instalei o seahorse (que fornece seahorse-ssh-askpass
) sem instalar o pacote gnome-keyring
no ArchLinux.
Olhando para o conteúdo deste pacote gnome-keyring
( link ) pode ajudá-lo a resolver seu problema.
Em qualquer caso, se você não se importar em usar cavalos-marinhos, também poderá instalar os pacotes seahorse
e gnome-keyring
(ou os equivalentes para sua distribuição).
Se você não usa o Gnome, etapas adicionais podem ser necessárias: link .
Tags ssh