Bude to trochu složitější, ale kombinací několika kusů to bude fungovat:
Vysvětlení
-
Chcete-li vynutit
ssh
použít$SSH_ASKPASS
program, nemůžete povolitssh
abyste viděli skutečnýtty
. Je to jen podmínka. To lze provést pomocísetsid
a pomocí-n
přepněte nassh
.Tento případ by inicioval připojení, ale nebyli byste schopni interagovat s shellem, což je pravděpodobně také váš požadavek;) (a také přeruší vaše místní TTY).
"První sezení" ale můžete vzdát. Měli byste také přidat
-N
přepínač, který potlačí vzdálený příkaz a provede pouze autentizaci .Také možný výstup "junk" může být přesměrován na
&> /dev/null
pokud o to nemáte zájem. -
Nastavte
ControlMaster
vssh_config
. Je to skvělá funkce a jakmile je spojení navázáno, můžete relace "vypálit" velmi rychle. Tento úryvek v~/.ssh/config
měl by to udělat:ControlPath ~/.ssh/controlmasters/%[email protected]%h:%p ControlMaster auto ControlPersist 5m
Můžete to přidat do nějaké
host
blokovat výpis vašich „pomalých kandidátů“ nebo prostě všude. Není to téměř žádná režie.
Poslední řádek
Pak byste měli být schopni se tímto způsobem připojit k hostiteli, u kterého očekáváte, že to bude chvíli trvat:
setsid ssh -nN host
# wait, insert password in the X11 prompt
ssh host
# will bring you directly to your session
Celý proces může zjednodušit alias
nebo bash funkce provádějící obojí v jednom kroku, ale to je ponecháno na fantazii čtenářů.
Pouze argumenty příkazového řádku
Obě věci můžete spojit na příkazovém řádku bez ssh_config
část:
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
Následující funkce by měla fungovat, pokud nejsou specifikovány možnosti SSH:
ssh() {
if ! command ssh -o PasswordAuthentication=no "$1" true
then
setsid -w ssh -fnN "$1"
fi
command ssh "[email protected]"
}
-f
instruuje SSH, aby přešlo na pozadí těsně před spuštěním programu, což je poté, co získal heslo.-w
říkásetsid
čekat na konec programu. V tomto případě se to stane, když SSH přejde na pozadí. V kombinaci sssh -f
, lze odstranit ruční čekání mezi dvěma příkazy SSH.- Funkce předpokládá, že první argument je název hostitele.
- Test má zabránit zbytečným připojením SSH.
A podle příručky SSH (man ssh
):
Pokud
ssh
nemá přidružený terminál, ale jsou nastaveny DISPLAY a SSH_ASKPASS, spustí program určený SSH_ASKPASS.
Proto musíte zrušit spojení terminálu (např. přidáním potrubí) a ujistit se, že DISPLAY
není nastaveno (chcete-li místo toho použít pro přístupovou frázi terminál).
Jednoduchý příklad:
echo foo | SSH_ASKPASS=/my/cmd DISPLAY= ssh ...
Totéž s ssh-add
:
$ echo foo | SSH_ASKPASS=/my/cmd DISPLAY= ssh-add id_rsa
ssh_askpass: exec(/my/cmd): No such file or directory
S OpenSSH 8.4 můžete nastavit $SSH_ASKPASS_REQUIRE
proměnná prostředí na force
. Cituji manuálovou stránku ssh(1):
SSH_ASKPASS_REQUIRE Allows further control over the use of
an askpass program. If this variable
is set to "never" then ssh will never
attempt to use one. If it is set to
"prefer", then ssh will prefer to use
the askpass program instead of the TTY
when requesting passwords. Finally, if
the variable is set to "force", then
the askpass program will be used for
all passphrase input regardless of
whether DISPLAY is set.
Protože OpenSSH 8.4 byl vydán 27. září 2020, budete muset chvíli počkat, než bude tato funkce dostupná v jakékoli hlavní distribuci Linuxu.