Bude to trochu složitější, ale kombinací několika kusů to bude fungovat:
Vysvětlení
-
Chcete-li vynutit
sshpoužít$SSH_ASKPASSprogram, nemůžete povolitsshabyste viděli skutečnýtty. Je to jen podmínka. To lze provést pomocísetsida pomocí-npř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
-Npř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/nullpokud o to nemáte zájem. -
Nastavte
ControlMastervssh_config. Je to skvělá funkce a jakmile je spojení navázáno, můžete relace "vypálit" velmi rychle. Tento úryvek v~/.ssh/configměl by to udělat:ControlPath ~/.ssh/controlmasters/%example@unixlinux.online%h:%p ControlMaster auto ControlPersist 5mMůžete to přidat do nějaké
hostblokovat 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 "example@unixlinux.online"
}
-finstruuje 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
sshnemá 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.