Bisakah saya meminta SSH untuk menggunakan program askpass bahkan jika dijalankan dari terminal?

9

man ssh mengatakan:

SSH_ASKPASS
   If  ssh needs a passphrase, it will read the passphrase from the
   current terminal if it was run from a terminal.  If ssh does not
   have  a  terminal associated with it but DISPLAY and SSH_ASKPASS
   are set, it will execute the program  specified  by  SSH_ASKPASS
   and open an X11 window to read the passphrase.

Saya ingin SSH menggunakan program askpass bahkan jika dijalankan dari terminal.

Kadang-kadang, saya harus terhubung ke server, di mana ada beberapa keterlambatan dalam menampilkan prompt kata sandi (mungkin karena masalah jaringan, mungkin karena upaya membalikkan pencarian DNS, ...). Saya merasa jengkel dan beralih ke hal lain, dan lupa tentang koneksi yang dicoba. (Masukkan lelucon tentang rentang perhatian ikan mas.) Ketika saya akhirnya kembali ke sana, prompt waktunya habis dan bahkan kata sandi yang benar hanya akan menghasilkan koneksi yang tertutup.

Kunci akan menjadi salah satu solusi, tetapi tidak setiap sistem yang saya gunakan memiliki kunci SSH yang biasa. Namun, saya biasanya menggunakan sistem Ubuntu, dan Ubuntu memiliki program askpass SSH yang terinstal secara default.

Namun, jika jendela askpass muncul, saya akan segera menyadarinya. Itu kompromi yang cukup baik bagi saya, kalau saja saya bisa membuatnya bekerja.

muru
sumber
Pertanyaan bagus. Dari melihat kode sumber, itu tidak terlihat seperti itu. Anda harus mengelabunya agar gagal membuka /dev/tty( LD_PRELOAD?).
Celada
@Celada apakah itu akan menyebabkan masalah saat memulai shell?
muru
Mungkin tidak ...
Celada

Jawaban:

7

Ini akan sedikit lebih rumit, tetapi kombinasi beberapa potong akan membuatnya berfungsi:

Penjelasan

  1. Untuk memaksa sshmenggunakan $SSH_ASKPASSprogram, Anda tidak dapat sshmelihat yang asli tty. Itu hanya kondisi. Ini dapat dilakukan dengan menggunakan setsiddan menggunakan -nsakelar ke ssh.

    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 menyerah pada "sesi pertama". Anda juga harus menambahkan -Nsakelar, yang akan menekan perintah jarak jauh dan hanya akan melakukan otentikasi .

    Juga kemungkinan keluaran "sampah" dapat dialihkan ke &> /dev/nulljika Anda tidak tertarik padanya.

  2. Diatur ControlMasterdalam ssh_config. Ini adalah fitur yang keren dan setelah koneksi dibuat, Anda dapat "menyalakan" sesi dengan cukup cepat. Cuplikan ini ~/.ssh/configharus melakukan itu:

    ControlPath ~/.ssh/controlmasters/%r@%h:%p
    ControlMaster auto
    ControlPersist 5m
    

    Anda dapat menambahkannya ke dalam beberapa hostblok yang mencantumkan "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 aliasatau fungsi bash melakukan keduanya dalam satu langkah, tetapi itu dibiarkan di imajinasi pembaca.

Hanya argumen baris perintah

Anda dapat menggabungkan kedua hal bersama di command-line tanpa ssh_configbagian:

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 harus berfungsi ketika opsi SSH tidak ditentukan:

ssh() {
    if ! command ssh -o PasswordAuthentication=no "$1" true
    then
        setsid -w ssh -fnN "$1"
    fi
    command ssh "$@"
}
  • -f menginstruksikan SSH untuk pergi ke latar belakang sebelum pelaksanaan program, yang setelah itu mendapat kata sandi.
  • -wmemberitahu setsiduntuk menunggu program berakhir. Dalam hal ini, itu terjadi ketika SSH pergi ke latar belakang. Dikombinasikan dengan ssh -f, menunggu manual antara dua perintah SSH dapat dihilangkan.
  • Fungsi mengasumsikan argumen pertama adalah nama host.
  • Tes ini hanya untuk mencegah koneksi SSH yang tidak perlu.
Jakuje
sumber
ControlMastersudah diatur, justru karena itu sulit untuk memasukkan kata sandi dalam kasus seperti itu. Seharusnya tidak sulit untuk menulis fungsi yang menguji master yang ada dan menggunakan askpass jika tidak dapat menemukannya. Terima kasih!
muru
3

Manual per SSH ( man ssh):

Jika sshtidak memiliki terminal yang terkait dengannya tetapi DISPLAY dan SSH_ASKPASS diatur, itu akan menjalankan program yang ditentukan oleh SSH_ASKPASS.

Oleh karena itu Anda perlu melepaskan terminal (mis. Dengan menambahkan pipa) dan pastikan DISPLAYtidak disetel (jika Anda ingin menggunakan terminal untuk frasa sandi Anda sebagai gantinya).

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
kenorb
sumber
Sayangnya ini tidak bekerja untuk saya. Bunyinya Pseudo-terminal will not be allocated because stdin is not a terminal, jadi sepertinya pipa itu melakukan sesuatu. ssh </dev/nullmemiliki efek yang sama. Namun dalam kedua kasus itu masih meminta kata sandi, dan saya masih bisa mengetik satu. Saya mencoba di Linux dan Mac. Saya mencoba ssh -vvvtetapi tidak mengatakan sesuatu yang berguna.
Timmmm
1
SSH_ASKPASS=/foo DISPLAY= setsid ssh hostbekerja sekalipun.
Timmmm