SSH'ye, anahtar parola cümlesi için grafiksel bir bilgi istemi kullanmasını söyleyin.


41

SSH'yi, terminali kullanan standart yerine grafiksel bir bilgi istemi (örneğin, GTK) kullanarak şifre istemek için nasıl zorlayabilirim?

Ayarı denedim SSH_ASKPASS=/usr/bin/ssh-askpassama etkisinin olmadığı görülüyor.

Sorun, openssh dokümantasyonunun söylediği gerçek.

Ssh , bununla ilişkili bir terminale sahip değilse, DISPLAY ve SSH_ASKPASS ayarlanırsa, parolayı okumak için SSH_ASKPASS tarafından belirtilen programı yürütecek ve bir X11 penceresi açacaktır.

Bir sonucu olarak benim durumumda, komut satırından başlatılan bir SSH git push, olacak o kadar, kendisiyle ilişkilendirilmiş bir terminali var SSH_ASKPASSmantık gözardı gibi görünüyor.

Lütfen ssh-add, bir anahtar çiftinin bulunduğu ancak bir parola ile korunan bir ana bilgisayara yönelik genel ssh çağrılarına değinmediğimi, unutmayın.

Yanıtlar:


32

# 1 - Eksik paket?

Muhtemelen içeren paketi kaçırıyorsunuz ssh-askpass. Yüklemeyi dene.

Fedora / CentOS / RHEL:

$ sudo yum install openssh-askpass

Debian / Ubuntu:

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

Eksik yardımcı programları bulma

Bu komutları kullanarak eksik araçları arayabilirsiniz:

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 - Bağlantı kesilmiş terminal?

Bunu başlangıçta özledim, ancak daha fazla okuduktan sonra bu yorumu ortam değişkeniyle sshilgili man sayfasında gördüm SSH_ASKPASS.

alıntı

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.)

Yorumda dikkat çekerseniz, ssh "ile ilişkili bir terminale sahip olmadığını" belirtir ve VE ayarlanır. Bunun fark edilmesi anahtardır. Yani almak için kullanmak biz almak gerekir (aka. Bir terminal yok etmek ve ona bağlı).DISPLAYSSH_ASKPASSsshSSH_ASKPASSsshSTDINSTDOUT

Komutu kullanarak bunu yapmanın bir yolu setsid. Kötü hissetme. Ben de bu aracı hiç duymadım. Man sayfasından:

setsid - bir programı yeni bir oturumda çalıştır

Bu yüzden, eğer ssh“program” olarak setsidkoşarsak ssh, terminalimizden, sshman sayfasında belirtilen kriterleri karşılayabiliriz . Diğer kriterler aşağıdaki gibi belirlenmiştir:

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

Yani hepsini bir araya getirirsek:

$ setsid ssh user@remotehost

Örneğin:

$ setsid ssh user@skinner

                                       ask gui ss

Bir çözüm

Bunu setsid"yerleşik" olacak şekilde yapmak isterseniz, bunun gibi bir takma ad oluşturabilirsiniz:

$ alias ssh="setsid ssh"

Şimdi sshGUI'yi açarken parolanızı soracağınız zaman:

$ ssh user@skinner

Referanslar


ssh-askpass gnome kuruludur ve manuel olarak başlatıldığında düzgün çalışır.
gioele

@ gioele - güncellemeleri görün, sanırım çözdüm.
slm

Bu çözümün sorunu setsid ssh, düz etiketi kullanmak için her git veya rsync komutunu değiştirmemi gerektirmesidir ssh.
gioele

@ gioele - GUI şifresini "zorlamak" için bir yöntem istediniz, bunu sağlar. sshTakma adlar gibi komutları değiştirebilirsiniz setsid sshbir yaklaşımdır. Başka yollar var. Sınırlayıcı faktör, openssh'ın ASK_SSHPASS'ı etkinleştirmek için ekli TTY'ye ihtiyacı yoktur.
slm

Paketi kaçırmıyorum ve kullanamıyorum setsidve sshterminalimden çalışıyorum. Bu sadece geçerli bir cevap değil! Ayrıca, Ubuntu'nun eski sürümlerinde çalışıyordu, bu yüzden neden birden bire çalışmayı bıraktığımı anladığımdan emin değilim!
Alexis Wilke

8

Mevcut OpenSSH'de yapılamaz: OpenSSH Bugzilla'da 2013-07 itibariyle bu özelliği isteyen bir sorun var: SSH_ASKPASS'i genelleştir .


Bu soruya bir cevap vermiyor. Bir yazarın açıklamasını eleştirmek veya talep etmek için yazının altına bir yorum bırakın.
cuonglm

8
@ cuonglm "bu mümkün değil" bir cevaptır. Yanlış veya yanıltıcı olabilir (öyle olduğunu söylemiyorum), ama yine de bir cevap.
terdon

2

Tek bir komut için terminali kapatmanın bir yolu var ve bu dosya yeniden yönlendirmeyi kullanıyor:

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

Bu komut ssh-addterminal kapalıyken çalışacaktır . Karmaşıklığı dışında, iyi ve züppe. Ama şimdi doğru komutu bildiğine göre, basitçe bir takma isim yap ve şunu ekle ~/.bash_aliases:

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

Ve ayarlanmalısın. Basitçe yazmak ssh-add, şimdi tüm yönlendirme işlemlerinde gerçek komutu çağıracak olan diğer adı çağıracaktır.

ssh-addŞimdi doğru sen (Ubuntu ya da türevleri de, bunlar başka yerde başka isimlere sahip olabilir) yüklü bu paketlerden birine sahip şartıyla ... size bir iletişim kutusu ile parolayı sorar:

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

Şimdi, tüm bunlar ne anlama geliyor?

İkinci 2>&1dosya tanımlayıcı # 2'yi (standart hata) aynı yerde dosya tanımlayıcı # 1'e (standart çıktı) yönlendirir.

Bu > /dev/nullaraç /dev/null, standart çıktıyı , kendisine yazılan tüm verileri silen özel bir dosyaya yönlendirir .

Bu < /dev/null, standart girişi /dev/null(idem) yönlendirir .

Bir yan not ve bir kapalı konu ama ilgili not olarak, eğer bir hizmeti bash olarak programlamak istiyorsanız, bir servisin gerçekte ne olduğunu, arka planda yer alan standart girdi, çıktı ve hata kapalı olan bir işlemi hatırlamalısınız:

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

Tek farkın sonunda & eklenmiş olduğuna dikkat edin (artı ssh-addbir teorik için komutu değiştirdiğim gerçeği service. Bu komutlar arka plana doğru bir hizmet koyacaktır.


Detaylı cevap Victor için teşekkür ederiz. Ancak benim gereksinimlerime uymuyor. Sorunun sonunda yazdığım gibi, “Lütfen ssh-add değil, bir anahtar çiftinin bulunduğu ancak bir parola tarafından korunan bir ana bilgisayara yönelik genel ssh çağrılarıyla ilgili olmadığımı unutmayın.”.
gioele,

Anlıyorum. Peki, sshaynı şekilde çalışır ve daha önce verdiğim aynı cevap hala geçerlidir. Sadece her oluşumunu değiştirmek ssh-addile sshve kümesidir.
Victor,

Unuttuğunuz küçük bir ayrıntı var: ssh için stdin / stdout'u kapatırsam, komutları nasıl ssh ile verebilirim? ;)
gioele

Bu ssh-addbenim için işe yaradı - stdout / stderr komutunu yönlendirmeye ihtiyacım olmadı, bu da ssh-askpassprogramı açmak için istenen davranışı sağladı . (Bu ssh-add < /dev/nullyeterli oldu.)
Ben Stern

0

ArchLinux'a seahorse-ssh-askpasspaketi yüklemeden denizatı (bunu sağlayan ) gnome-keyringkurduğumda da aynı sorunu yaşadım.

Bu paketin içeriğine bakmak gnome-keyring( https://www.archlinux.org/packages/extra/i686/gnome-keyring ) sorununuzu çözmenize yardımcı olabilir.

Her durumda, denizatı kullanmak sakıncası yoksa, paketleri seahorseve gnome-keyring(veya dağıtımınıza eşdeğer olanları) da yükleyebilirsiniz . Gnome kullanmıyorsanız, ek adımlar gerekli olabilir: https://wiki.archlinux.org/index.php/GNOME_Keyring .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.