# 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 ssh
podręcznika SSH_ASKPASS
dotyczą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_ASKPASS
są ustawione. Zauważenie tego jest kluczowe. Aby więc ssh
skorzystać SSH_ASKPASS
, musimy ssh
nie 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 ssh
jako „program” setsid
, możemy odłączyć się ssh
od naszego terminala, spełniając kryteria wymienione na ssh
stronie 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
Rozwiązanie
Jeśli chcesz zrobić to tak, aby setsid
był „wbudowany”, możesz utworzyć takie aliasy:
$ alias ssh="setsid ssh"
Teraz, gdy ssh
pojawi się GUI z prośbą o podanie hasła:
$ ssh user@skinner
Referencje
setsid ssh
instad zwykłegossh
.ssh
aliasysetsid ssh
to jedno podejście. Istnieją inne sposoby. Czynnikiem ograniczającym jest openssh, nie wymaga dołączenia TTY, aby aktywować ASK_SSHPASS.setsid
a następnie pracowaćssh
z 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ć!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 .
źródło
Istnieje sposób na zamknięcie terminala dla pojedynczej komendy, a to polega na przekierowaniu pliku:
Spowoduje to uruchomienie polecenia
ssh-add
przy 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
:I powinieneś być ustawiony.
ssh-add
Już samo wpisanie wywoła teraz alias, który wywoła prawdziwe polecenie z całym przekierowaniem na miejscu.ssh-add
Teraz 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:
Zauważ, że jedyną różnicą jest
ssh-add
znak & dodany na końcu (plus fakt, że zmieniłem polecenie na teoretyczneservice
. Te polecenia poprawnie umieszczą usługę w tle.źródło
ssh
działa dokładnie tak samo i nadal obowiązuje ta sama odpowiedź, którą podałem wcześniej. Wystarczy zastąpić każde wystąpieniessh-add
zssh
i jesteś ustawiony.ssh-add
mnie - nawet nie musiałem przekierowywać stdout / stderr, aby uzyskać pożądane zachowanie, które miało wyskoczyć zssh-askpass
programu. (To znaczyssh-add < /dev/null
wystarczy.)Miałem ten sam problem, gdy instalowałem konika morskiego (który zapewnia
seahorse-ssh-askpass
) bez instalowania pakietugnome-keyring
w 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
seahorse
ignome-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 .źródło