GNU/Linux >> Znalost Linux >  >> Linux

Mohu přimět SSH, aby používal program askpass, i když byl spuštěn z terminálu?

Bude to trochu složitější, ale kombinací několika kusů to bude fungovat:

Vysvětlení

  1. Chcete-li vynutit ssh použít $SSH_ASKPASS program, nemůžete povolit ssh abyste viděli skutečný tty . Je to jen podmínka. To lze provést pomocí setsid a pomocí -n přepněte na ssh .

    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.

  2. Nastavte ControlMaster v ssh_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 s ssh -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.


Linux
  1. Rozdíl mezi programem spouštění systému a terminálu?

  2. Jak posílat úhozy (f5) z terminálu do programu Gui?

  3. Linux – Můžeme získat informace o kompilátoru z binárního souboru Elf?

  1. Ssh – Potřebujete Tty ke spuštění sudo, pokud mohu sudo bez hesla?

  2. Kde mohu nastavit proměnné prostředí, které bude crontab používat?

  3. Jak mohu získat aktuální datum a čas v terminálu a nastavit pro něj vlastní příkaz v terminálu?

  1. Jak mohu použít SSH s proxy SOCKS 5?

  2. Jak ukončit SSH vagrant v terminálu

  3. Mohu nastavit systémovou poštu pro použití externího serveru SMTP?