Скажіть SSH використовувати графічний запит для ключової фрази


41

Як я можу змусити SSH запитувати парольні фрази, використовуючи графічний підказку (наприклад, GTK) замість стандартної, яка використовує термінал?

Я спробував налаштування, SSH_ASKPASS=/usr/bin/ssh-askpassале, схоже, це не має ефектів.

Проблема полягає в тому, що йдеться про відкриту документацію

Якщо ssh не має терміналу, пов'язаного з ним, але встановлено DISPLAY та SSH_ASKPASS, він виконає програму, задану SSH_ASKPASS, і відкриє вікно X11 для зчитування парольної фрази.

Ssh, запущений з командного рядка, в моєму випадку як результат a git push, буде пов'язаний з ним термінал, тому SSH_ASKPASSлогіка, здається, ігнорується.

Зауважте, що я маю на увазі не ssh-addзагальні виклики ssh до хостів, для яких присутня пара ключів, але захищена парольною фразою.

Відповіді:


32

№1 - Відсутній пакет?

Вам, мабуть, не вистачає пакунку, який містить ssh-askpass. Спробуйте встановити його.

Fedora / CentOS / RHEL:

$ sudo yum install openssh-askpass

Debian / Ubuntu:

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

Пошук відсутніх утиліт

Ви можете шукати відсутні інструменти за допомогою цих команд:

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 - Відключений термінал?

Я пропустив це спочатку, але після подальшого читання я помітив цей коментар на сторінці людини sshщодо SSH_ASKPASSзмінної середовища.

витяг

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

Якщо ви помітили в коментарі, в ньому зазначається, що ssh "не має терміналу, пов'язаного" AND DISPLAY & SSH_ASKPASS. Помітивши це ключово. Тож для sshвикористання SSH_ASKPASSнам потрібно зробити так, щоб sshдо нього не був приєднаний термінал (ака. STDIN& STDOUT).

Один із способів зробити це за допомогою команди setsid. Не відчувай себе погано. Я ніколи не чув про цей інструмент. На чоловіковій сторінці:

setid - запустіть програму в новому сеансі

Отже, якщо ми запускаємо sshяк "програму", setsidми можемо відірватися sshвід нашого терміналу, відповідаючи критеріям, зазначеним на sshсторінці man. Інші критерії встановлюються наступним чином:

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

Отже, якщо ми все це зробимо разом:

$ setsid ssh user@remotehost

Наприклад:

$ setsid ssh user@skinner

                                       ss ask gui

Вирішення

Якщо ви хочете зробити так, щоб setsid"вбудований", ви можете створити псевдоніми так:

$ alias ssh="setsid ssh"

Тепер, коли ви sshотримаєте графічний інтерфейс, що з'являється, запитуючи пароль:

$ ssh user@skinner

Список літератури


ssh-askpass gnome встановлений, і він працює чудово, якщо його запустити вручну.
gioele

@gioele - дивіться оновлення, я думаю, я це зрозумів.
slm

Проблема цього рішення полягає в тому, що воно вимагає, щоб я setsid sshміняв кожну команду git або rsync, щоб використовувати instad plain ssh.
gioele

@gioele - ви попросили метод "примусити" графічний інтерфейс пароля, це передбачає це. Ви можете замінити такі команди, як sshпсевдоніми setsid ssh- це один підхід. Є й інші способи. Обмежуючий фактор opensh не потребує додавання TTY для активації ASK_SSHPASS.
slm

Я не пропускаю пакунок, і не можу використовувати, setsidа потім працювати sshзі свого терміналу. Це просто не правильна відповідь !? Плюс, він працював у старих версіях Ubuntu, тому я не надто впевнений, що розумію, чому він раптом перестав працювати!
Алексіс Вілке

8

Це неможливо зробити в поточному OpenSSH: у BugSSilla OpenSSH відкрита проблема з проханням про цю функцію станом на 2013-07: Узагальнення SSH_ASKPASS .


Це не дає відповіді на запитання. Щоб критикувати або вимагати роз'яснення у автора, залиште коментар під їх дописом.
cuonglm

8
@cuonglm "це неможливо" - це відповідь. Це може бути неправильним чи оманливим (я не говорю, що це є), але все одно це відповідь.
тердон

2

Існує спосіб закрити термінал для однієї команди, і це використовується перенаправлення файлів:

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

Це запустить команду ssh-addіз закритим терміналом. Який тонкий і денді, за винятком його складності. Але тепер, коли ви знаєте правильну команду, просто зробити його псевдонім і додайте його ~/.bash_aliases:

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

І вам слід встановити. Просте введення ssh-addтепер викличе псевдонім, який викличе реальну команду з усім переадресацією на місці.

ssh-addТепер правильно задасть пароль з допомогою діалогового вікна ... При умови , що у вас є один з цих пакетів (в Ubuntu або їх похідних, вони можуть мати інші назви в інших місцях):

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

Тепер, що означають усі ці речі?

Засіб 2>&1переспрямування дескриптора файлу №2 (стандартна помилка) на той самий дескриптор файлу місця # 1 (стандартний вихід) спрямований на.

В > /dev/nullкошти перенаправити стандартний висновок /dev/null, який являє собою спеціальний файл , який відкидає всі дані , записані на нього.

Засіб < /dev/nullперенаправляє стандартний вхід на /dev/null(idem).

Як бічна примітка, так і поза темою, але пов'язана з цим примітка, якщо ви хочете коли-небудь запрограмувати послугу в bash, ви повинні пам’ятати, що таке служба насправді, процес зі стандартним входом, висновком та помилкою, що закривається, що знаходиться на задньому плані:

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

Зауважте, що єдиною відмінністю є & додано в кінці (плюс той факт, що я змінив команду ssh-addна теоретичну service. Ці команди правильно поставлять службу на задній план.


Дякую за детальну відповідь Віктор. Однак це не відповідає моїм вимогам. Як я писав наприкінці запитання, «Зверніть увагу, що я маю на увазі не ssh-add, а загальні виклики ssh до хостів, для яких присутній ключова пара, але захищений парольною фразою».
gioele

Я бачу. Ну, sshфункціонує точно так само, і досі застосовується та сама відповідь, яку я дав раніше. Просто замініть всі входження ssh-addз sshі ви безліч.
Віктор

Ви просто забули про крихітну деталь: якщо я закрию stdin / stdout для ssh, як я можу подавати команди через ssh? ;)
gioele

Це працювало для ssh-addмене - мені навіть не потрібно було перенаправляти stdout / stderr, щоб отримати бажану поведінку, яка полягала у спливаючому ssh-askpassпрограмі. (Тобто ssh-add < /dev/nullбуло достатньо.)
Бен Стерн

0

У мене була така ж проблема, коли я встановив морського коня (який надає seahorse-ssh-askpass), не встановлюючи пакет gnome-keyringна ArchLinux.

Перегляд вмісту цього пакету gnome-keyring( https://www.archlinux.org/packages/extra/i686/gnome-keyring ) може допомогти вам вирішити вашу проблему.

У будь-якому випадку, якщо ви не проти використовувати морського коня, ви також можете встановити пакунки seahorseта gnome-keyring(або еквівалентні для вашого розповсюдження). Якщо ви не використовуєте Gnome, можуть знадобитися додаткові кроки: https://wiki.archlinux.org/index.php/GNOME_Keyring .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.