Ini akan sedikit lebih rumit, tetapi kombinasi dari beberapa bagian akan membuatnya berfungsi:
Penjelasan
-
Untuk memaksa
sshuntuk menggunakan$SSH_ASKPASSprogram, Anda tidak dapat mengizinkansshuntuk melihatttyyang sebenarnya . Itu hanya kondisi. Ini dapat dilakukan dengan menggunakansetsiddan menggunakan-nberalih kessh.Kasing ini akan memulai koneksi, tetapi Anda tidak akan dapat berinteraksi dengan shell, yang mungkin juga merupakan kebutuhan Anda;) (dan juga merusak TTY lokal Anda).
Tapi Anda bisa melepaskan "sesi pertama". Anda juga harus menambahkan
-Nswitch, yang akan menekan perintah jarak jauh dan akan melakukan otentikasi saja .Juga kemungkinan keluaran "sampah" dapat dialihkan ke
&> /dev/nulljika Anda tidak tertarik. -
Siapkan
ControlMasterdissh_config. Ini adalah fitur yang keren dan setelah koneksi dibuat, Anda dapat "menjalankan" sesi dengan cukup cepat. Cuplikan ini di~/.ssh/configharus melakukan itu:ControlPath ~/.ssh/controlmasters/%[email protected]%h:%p ControlMaster auto ControlPersist 5mAnda dapat menambahkannya ke dalam beberapa
hostblokir daftar "kandidat lambat" Anda, atau di mana saja. Hampir tidak ada overhead.
Baris terakhir
Maka Anda harus dapat terhubung dengan cara ini ke host yang Anda harapkan akan memakan waktu cukup lama:
setsid ssh -nN host
# wait, insert password in the X11 prompt
ssh host
# will bring you directly to your session
Seluruh proses dapat disederhanakan dengan alias atau fungsi bash melakukan keduanya dalam satu langkah, tetapi dibiarkan dalam imajinasi pembaca.
Hanya argumen baris perintah
Anda dapat menggabungkan keduanya pada baris perintah tanpa ssh_config bagian:
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
Fungsi berikut akan berfungsi saat opsi SSH tidak ditentukan:
ssh() {
if ! command ssh -o PasswordAuthentication=no "$1" true
then
setsid -w ssh -fnN "$1"
fi
command ssh "[email protected]"
}
-fmenginstruksikan SSH untuk pergi ke latar belakang tepat sebelum eksekusi program, yaitu setelah mendapatkan kata sandi.-wmemberi tahusetsiduntuk menunggu program berakhir. Dalam hal ini, itu terjadi ketika SSH pergi ke latar belakang. Dikombinasikan denganssh -f, penantian manual antara dua perintah SSH dapat dihilangkan.- Fungsi mengasumsikan argumen pertama adalah nama host.
- Pengujian ini hanya untuk mencegah koneksi SSH yang tidak perlu.
A per manual SSH (man ssh ):
Jika
sshtidak memiliki terminal yang terkait dengannya tetapi DISPLAY dan SSH_ASKPASS telah disetel, ini akan menjalankan program yang ditentukan oleh SSH_ASKPASS.
Oleh karena itu Anda perlu melepaskan terminal (misalnya dengan menambahkan pipa) dan pastikan DISPLAY tidak disetel (jika Anda ingin menggunakan terminal untuk frasa sandi Anda).
Contoh sederhana:
echo foo | SSH_ASKPASS=/my/cmd DISPLAY= ssh ...
Sama dengan ssh-add :
$ echo foo | SSH_ASKPASS=/my/cmd DISPLAY= ssh-add id_rsa
ssh_askpass: exec(/my/cmd): No such file or directory
Dengan OpenSSH 8.4 Anda dapat mengatur $SSH_ASKPASS_REQUIRE variabel lingkungan ke force . Mengutip ssh(1) halaman manual:
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.
Karena OpenSSH 8.4 dirilis pada 27 September 2020, Anda harus menunggu sebentar agar fitur ini tersedia di distribusi Linux utama mana pun.