Ini akan sedikit lebih rumit, tetapi kombinasi dari beberapa bagian akan membuatnya berfungsi:
Penjelasan
-
Untuk memaksa
ssh
untuk menggunakan$SSH_ASKPASS
program, Anda tidak dapat mengizinkanssh
untuk melihattty
yang sebenarnya . Itu hanya kondisi. Ini dapat dilakukan dengan menggunakansetsid
dan menggunakan-n
beralih 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
-N
switch, yang akan menekan perintah jarak jauh dan akan melakukan otentikasi saja .Juga kemungkinan keluaran "sampah" dapat dialihkan ke
&> /dev/null
jika Anda tidak tertarik. -
Siapkan
ControlMaster
dissh_config
. Ini adalah fitur yang keren dan setelah koneksi dibuat, Anda dapat "menjalankan" sesi dengan cukup cepat. Cuplikan ini di~/.ssh/config
harus melakukan itu:ControlPath ~/.ssh/controlmasters/%[email protected]%h:%p ControlMaster auto ControlPersist 5m
Anda dapat menambahkannya ke dalam beberapa
host
blokir 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]"
}
-f
menginstruksikan SSH untuk pergi ke latar belakang tepat sebelum eksekusi program, yaitu setelah mendapatkan kata sandi.-w
memberi tahusetsid
untuk 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
ssh
tidak 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.