Beri tahu SSH untuk menggunakan prompt grafis untuk frasa sandi utama


41

Bagaimana saya bisa memaksa SSH untuk meminta frasa sandi menggunakan prompt grafis (GTK, misalnya) alih-alih yang standar yang menggunakan terminal?

Saya mencoba pengaturan SSH_ASKPASS=/usr/bin/ssh-askpasstetapi tampaknya tidak memiliki efek.

Masalahnya adalah fakta yang dikatakan oleh dokumentasi openssh

Jika ssh tidak memiliki terminal yang terkait dengannya tetapi DISPLAY dan SSH_ASKPASS diatur, ia akan menjalankan program yang ditentukan oleh SSH_ASKPASS dan membuka jendela X11 untuk membaca frasa sandi.

Sebuah ssh diluncurkan dari baris perintah, dalam kasus saya sebagai hasil dari git push, akan memiliki terminal yang terkait dengannya, sehingga SSH_ASKPASSlogika tampaknya diabaikan.

Harap dicatat bahwa saya tidak merujuk ssh-add, tetapi untuk pemanggilan ssh generik terhadap host yang memiliki pasangan kunci tetapi dilindungi oleh frasa sandi.

Jawaban:


32

# 1 - Paket tidak ada?

Anda mungkin melewatkan paket yang berisi ssh-askpass. Coba pasang.

Fedora / CentOS / RHEL:

$ sudo yum install openssh-askpass

Debian / Ubuntu:

$ sudo apt-get install ssh-askpass-gnome ssh-askpass

Menemukan utilitas yang hilang

Anda dapat mencari alat yang hilang menggunakan perintah ini:

Fedora / CentOS / RHEL:

$ yum search ssh-askpass
Loaded plugins: langpacks, presto, refresh-packagekit
Adding en_US to language list
======================================================= Matched: ssh-askpass =======================================================
x11-ssh-askpass.x86_64 : A passphrase dialog for X and not only for OpenSSH
ksshaskpass.x86_64 : A KDE version of ssh-askpass with KWallet support
connect-proxy.x86_64 : SSH Proxy command helper
openssh-askpass.x86_64 : A passphrase dialog for OpenSSH and X

Debian / Ubuntu:

$ apt-file -l search ssh-askpass
app-install-data
cruft
git-cola
luckybackup-data
pssh
sdm-terminal
seahorse
ssh-askpass
ssh-askpass-fullscreen
ssh-askpass-gnome

# 2 - Terminal terputus?

Saya awalnya merindukan ini tetapi setelah membaca lebih lanjut saya melihat komentar ini di halaman sshmanual mengenai SSH_ASKPASSvariabel lingkungan.

kutipan

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. This is particularly
               useful when calling ssh from a .xsession or related script.  
               (Note that on some machines it may be necessary to redirect the 
               input from /dev/null to make this work.)

Jika Anda perhatikan di komentar, itu menyatakan bahwa ssh "tidak memiliki terminal yang terkait" DAN DISPLAY & SSH_ASKPASSdiatur. Memperhatikan ini adalah kuncinya. Jadi untuk bisa sshmenggunakan SSH_ASKPASSkita harus sshtidak memiliki terminal (alias. STDIN& STDOUT) Yang melekat padanya.

Salah satu cara untuk melakukan ini dengan memanfaatkan perintah setsid. Jangan merasa buruk. Saya juga tidak pernah mendengar alat ini. Dari halaman manual:

setsid - jalankan program dalam sesi baru

Jadi jika kita menjalankan sshsebagai "program" untuk setsidkita dapat melepaskan sshdari terminal kita memenuhi kriteria yang disebutkan dalam sshhalaman manual. Kriteria lainnya ditetapkan sebagai berikut:

$ echo $DISPLAY; echo $SSH_ASKPASS
:0.0
/usr/libexec/openssh/ssh-askpass

Jadi jika kita menyatukan ini semua:

$ setsid ssh user@remotehost

Sebagai contoh:

$ setsid ssh user@skinner

                                       tanya gui

Sebuah solusi

Jika Anda ingin membuatnya jadi setsid"bawaan" Anda dapat membuat alias seperti:

$ alias ssh="setsid ssh"

Sekarang ketika Anda, sshAnda akan mendapatkan GUI muncul meminta kata sandi Anda:

$ ssh user@skinner

Referensi


ssh-askpass gnome diinstal dan berfungsi dengan baik jika diluncurkan secara manual.
gioele

@gioele - lihat pembaruan, saya pikir saya sudah menemukan jawabannya.
slm

masalah dari solusi ini adalah mengharuskan saya memodifikasi setiap perintah git atau rsync untuk menggunakan setsid sshinstad dari plain ssh.
gioele

@gioele - Anda meminta metode untuk "memaksa" kata sandi GUI, ini memberikan itu. Anda dapat mengganti perintah seperti sshdengan alias setsid sshadalah salah satu pendekatan. Ada beberapa cara lain. Faktor pembatas adalah openssh tidak memerlukan TTY yang terpasang untuk mengaktifkan ASK_SSHPASS.
slm

Saya tidak ketinggalan paket dan saya tidak bisa menggunakan setsiddan kemudian bekerja sshdari terminal saya. Itu sama sekali bukan jawaban yang valid !? Plus, itu berfungsi di versi lama Ubuntu, jadi saya tidak terlalu yakin saya mengerti mengapa tiba-tiba berhenti bekerja!
Alexis Wilke

8

Ini tidak dapat dilakukan di OpenSSH saat ini: ada masalah terbuka di OpenSSH Bugzilla meminta fitur ini pada 2013-07: Generalisasi SSH_ASKPASS .


Ini tidak memberikan jawaban untuk pertanyaan itu. Untuk mengkritik atau meminta klarifikasi dari penulis, tinggalkan komentar di bawah posting mereka.
cuonglm

8
@cuonglm "ini tidak mungkin" adalah jawaban. Mungkin salah atau menyesatkan (saya tidak mengatakan itu), tetapi itu masih merupakan jawaban.
terdon

2

Ada cara untuk menutup terminal untuk satu perintah, dan itu menggunakan pengalihan file:

ssh-add > /dev/null < /dev/null 2>&1

Ini akan menjalankan perintah ssh-adddengan terminal tertutup. Yang bagus dan keren, kecuali untuk kompleksitasnya. Tetapi sekarang setelah Anda tahu perintah yang benar, cukup buat itu sebagai alias dan tambahkan ke ~/.bash_aliases:

alias ssh-add="/usr/bin/ssh-add > /dev/null < /dev/null 2>&1"

Dan Anda harus siap. Cukup mengetik ssh-addsekarang akan memanggil alias yang akan memanggil perintah sebenarnya dengan semua pengalihan di tempat.

The ssh-addsekarang benar meminta Anda password dengan kotak dialog ... Asalkan Anda memiliki salah satu dari paket ini diinstal (di Ubuntu atau turunan, mereka mungkin memiliki nama yang lain di tempat lain):

  • ssh-askpass
  • ssh-askpass-fullscreen
  • ssh-askpass-gnome
  • ksshaskpath
  • kwalletcli
  • lxqt-openssh-askpass
  • razorqt-openssh-askpasss

Sekarang, apa artinya semua itu?

The 2>&1berarti mengarahkan file descriptor # 2 (standard error) ke tempat yang sama file descriptor # 1 (standar output) diarahkan untuk.

The > /dev/nullberarti mengarahkan output standar untuk /dev/null, yang merupakan file khusus yang membuang semua data ditulis untuk itu.

The < /dev/nullberarti mengarahkan standar input ke /dev/null(idem).

Sebagai catatan tambahan, dan topik tidak umum tetapi catatan terkait, jika Anda ingin memprogram layanan di bash, Anda harus mengingat apa sebenarnya layanan itu, sebuah proses dengan input standar, output, dan kesalahan ditutup yang ada di latar belakang:

service > /dev/null < /dev/null 2>&1 &

Perhatikan bahwa satu-satunya perbedaan adalah & ditambahkan di akhir (ditambah fakta bahwa saya mengubah perintah ssh-adduntuk teori service. Perintah-perintah itu akan menempatkan layanan dengan benar di latar belakang.


Terima kasih atas jawaban terperinci Victor. Namun, itu tidak sesuai dengan persyaratan saya. Seperti yang saya tulis di akhir pertanyaan, «Harap dicatat bahwa saya tidak mengacu pada ssh-add, tetapi untuk doa ssh umum terhadap host yang menghadirkan pasangan kunci tetapi dilindungi oleh frasa sandi.».
gioele

Saya melihat. Yah, sshfungsinya dengan cara yang persis sama, dan jawaban yang sama yang saya berikan sebelumnya masih berlaku. Ganti saja setiap kemunculan ssh-adddengan sshdan Anda sudah siap.
Victor

Hanya ada detail kecil yang Anda lupa: jika saya menutup stdin / stdout untuk ssh, bagaimana saya memberikan perintah melalui ssh? ;)
gioele

Ini bekerja untuk ssh-addsaya - saya bahkan tidak perlu mengarahkan stdout / stderr untuk mendapatkan perilaku yang diinginkan, yaitu memunculkan ssh-askpassprogram. (Yaitu, ssh-add < /dev/nullsudah cukup.)
Ben Stern

0

Saya memiliki masalah yang sama ketika saya menginstal kuda laut (yang menyediakan seahorse-ssh-askpass) tanpa menginstal paket gnome-keyringpada ArchLinux.

Melihat isi paket ini gnome-keyring( https://www.archlinux.org/packages/extra/i686/gnome-keyring ) dapat membantu Anda memecahkan masalah Anda.

Bagaimanapun, jika Anda tidak keberatan menggunakan kuda laut, Anda juga dapat menginstal paket seahorsedan gnome-keyring(atau yang setara untuk distribusi Anda). Jika Anda tidak menggunakan Gnome, langkah-langkah tambahan mungkin diperlukan: https://wiki.archlinux.org/index.php/GNOME_Keyring .

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.