Powiedz SSH, aby użył graficznego monitu o podanie hasła klucza

41

Jak zmusić SSH do żądania haseł za pomocą graficznego monitu (na przykład GTK) zamiast standardowego używającego terminala?

Próbowałem ustawienia, SSH_ASKPASS=/usr/bin/ssh-askpassale wydaje się, że nie ma żadnych efektów.

Problem polega na tym, że mówi dokumentacja openssh

Jeśli ssh nie ma przypisanego terminala, ale są ustawione DISPLAY i SSH_ASKPASS, wykona program określony przez SSH_ASKPASS i otworzy okno X11 w celu odczytania hasła.

Ssh uruchomiony z wiersza poleceń, w moim przypadku jako wynik a git push, będzie miał z nim powiązany terminal, więc SSH_ASKPASSlogika wydaje się być ignorowana.

Należy pamiętać, że nie mam na myśli ssh-add, ale ogólnych wywołań ssh w kierunku hostów, dla których para kluczy jest obecna, ale chroniona hasłem.

gioele
źródło

Odpowiedzi:

32

# 1 - Brakuje paczki?

Prawdopodobnie brakuje Ci pakietu, który zawiera ssh-askpass. Spróbuj zainstalować.

Fedora / CentOS / RHEL:

$ sudo yum install openssh-askpass

Debian / Ubuntu:

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

Znajdowanie brakujących narzędzi

Możesz wyszukać brakujące narzędzia za pomocą następujących poleceń:

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 - Odłączony terminal?

Początkowo mi tego brakowało, ale po dalszym czytaniu zauważyłem ten komentarz na stronie sshpodręcznika SSH_ASKPASSdotyczący zmiennej środowiskowej.

fragment

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.)

Jeśli zauważysz w komentarzu, oznacza to, że ssh „nie ma przypisanego terminala” ORAZ DISPLAY i SSH_ASKPASSsą ustawione. Zauważenie tego jest kluczowe. Aby więc sshskorzystać SSH_ASKPASS, musimy sshnie mieć przyłączonego terminalu (aka. STDIN& STDOUT).

Jednym ze sposobów na to jest użycie polecenia setsid. Nie czuj się źle Nigdy też nie słyszałem o tym narzędziu. Ze strony podręcznika:

setsid - uruchom program w nowej sesji

Więc jeśli działamy sshjako „program” setsid, możemy odłączyć się sshod naszego terminala, spełniając kryteria wymienione na sshstronie man. Pozostałe kryteria są ustawione w następujący sposób:

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

Więc jeśli połączymy to wszystko razem:

$ setsid ssh user@remotehost

Na przykład:

$ setsid ssh user@skinner

                                       ss of ask gui

Rozwiązanie

Jeśli chcesz zrobić to tak, aby setsidbył „wbudowany”, możesz utworzyć takie aliasy:

$ alias ssh="setsid ssh"

Teraz, gdy sshpojawi się GUI z prośbą o podanie hasła:

$ ssh user@skinner

Referencje

slm
źródło
ssh-askpass gnome jest zainstalowany i działa dobrze, jeśli zostanie uruchomiony ręcznie.
gioele
@gioele - zobacz aktualizacje, myślę, że to rozgryzłem.
slm
problemem tego rozwiązania jest to, że wymaga zmodyfikowania każdej komendy git lub rsync, aby używała setsid sshinstad zwykłego ssh.
gioele
@gioele - poprosiłeś o metodę „wymuszenia” GUI hasła, to zapewnia. Można zastąpić polecenia takie jak sshaliasy setsid sshto jedno podejście. Istnieją inne sposoby. Czynnikiem ograniczającym jest openssh, nie wymaga dołączenia TTY, aby aktywować ASK_SSHPASS.
slm
Nie brakuje mi tego pakietu i nie mogę używać, setsida następnie pracować sshz mojego terminala. To po prostu nie jest poprawna odpowiedź !? Dodatkowo działał w starszych wersjach Ubuntu, więc nie jestem pewien, czy rozumiem, dlaczego nagle przestał działać!
Alexis Wilke
8

Nie można tego zrobić w bieżącym OpenSSH: w Bugzilli OpenSSH jest otwarty problem z prośbą o tę funkcję od 2013-07: Uogólnij SSH_ASKPASS .

gioele
źródło
To nie daje odpowiedzi na pytanie. Aby skrytykować lub poprosić autora o wyjaśnienia, zostaw komentarz pod postem.
cuonglm
8
@cuonglm „to nie jest możliwe” to odpowiedź. Może to być błędne lub wprowadzające w błąd (nie twierdzę, że tak jest), ale wciąż jest to odpowiedź.
terdon
2

Istnieje sposób na zamknięcie terminala dla pojedynczej komendy, a to polega na przekierowaniu pliku:

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

Spowoduje to uruchomienie polecenia ssh-addprzy zamkniętym terminalu. Co jest w porządku i eleganckie, z wyjątkiem jego złożoności. Ale teraz, gdy znasz poprawne polecenie, po prostu stwórz alias i dołącz do ~/.bash_aliases:

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

I powinieneś być ustawiony. ssh-addJuż samo wpisanie wywoła teraz alias, który wywoła prawdziwe polecenie z całym przekierowaniem na miejscu.

ssh-addTeraz poprawnie zadaje hasło z okna dialogowego ... Pod warunkiem, że masz jeden z poniższych pakietów (w Ubuntu lub pochodnych, mogą one mieć inne nazwy gdzie indziej):

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

Co oznaczają te wszystkie rzeczy?

Te 2>&1środki przekierowanie pliku deskryptora # 2 (błąd standardowy) do tego samego miejsca plik opisu # 1 (wyjście standardowe) skierowaną.

Te > /dev/nullśrodki przekierować standardowe wyjście do /dev/null, który jest specjalnym plikiem, że odrzuty wszystkie zapisane na nim dane.

Te < /dev/nullśrodki przekierować standardowe wejście /dev/null(idem).

Jako uwaga dodatkowa i nie na temat, ale pokrewna uwaga, jeśli kiedykolwiek chcesz zaprogramować usługę w bash, musisz pamiętać, czym tak naprawdę jest usługa, proces ze standardowym wejściem, wyjściem i błędem zamkniętym, który jest w tle:

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

Zauważ, że jedyną różnicą jest ssh-addznak & dodany na końcu (plus fakt, że zmieniłem polecenie na teoretyczne service. Te polecenia poprawnie umieszczą usługę w tle.

Zwycięzca
źródło
Dziękuję za szczegółową odpowiedź, Victor. Jednak nie spełnia moich wymagań. Jak napisałem na końcu pytania: „Pamiętaj, że nie odnoszę się do ssh-add, ale do ogólnych wywołań ssh w kierunku hostów, dla których para kluczy jest obecna, ale jest chroniona hasłem”.
gioele
Widzę. Cóż, sshdziała dokładnie tak samo i nadal obowiązuje ta sama odpowiedź, którą podałem wcześniej. Wystarczy zastąpić każde wystąpienie ssh-addz sshi jesteś ustawiony.
Victor
Jest tylko mały szczegół, o którym zapomniałeś: jeśli zamknę stdin / stdout dla ssh, jak wydawać polecenia przez ssh? ;)
gioele
To działało dla ssh-addmnie - nawet nie musiałem przekierowywać stdout / stderr, aby uzyskać pożądane zachowanie, które miało wyskoczyć z ssh-askpassprogramu. (To znaczy ssh-add < /dev/nullwystarczy.)
Ben Stern
0

Miałem ten sam problem, gdy instalowałem konika morskiego (który zapewnia seahorse-ssh-askpass) bez instalowania pakietu gnome-keyringw ArchLinux.

Przejrzenie zawartości tego pakietu gnome-keyring( https://www.archlinux.org/packages/extra/i686/gnome-keyring ) może pomóc w rozwiązaniu problemu.

W każdym razie, jeśli nie masz nic przeciwko korzystaniu z konika morskiego, możesz również zainstalować pakiety seahorsei gnome-keyring(lub równoważne dla twojej dystrybucji). Jeśli nie korzystasz z Gnome, mogą być wymagane dodatkowe kroki: https://wiki.archlinux.org/index.php/GNOME_Keyring .

Fabrice
źródło