Скажите SSH использовать графическое приглашение для ключевой фразы

41

Как я могу заставить SSH запрашивать парольные фразы, используя графическое приглашение (например, GTK) вместо стандартного, использующего терминал?

Я попытался установить, SSH_ASKPASS=/usr/bin/ssh-askpassно, похоже, не имеет никаких эффектов

Проблема в том, что документация openssh говорит

Если ssh не имеет связанного с ним терминала, но установлены DISPLAY и SSH_ASKPASS, он выполнит программу, указанную SSH_ASKPASS, и откроет окно X11 для чтения парольной фразы.

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

Обратите внимание, что я имею в виду не ssh-addобщие вызовы ssh по отношению к хостам, для которых присутствует пара ключей, но которые защищены парольной фразой.

Gioele
источник

Ответы:

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 «не имеет терминала, связанного с» И DISPLAY & SSH_ASKPASSустановлены. Заметьте, что это ключ. Поэтому, чтобы начать sshиспользовать, SSH_ASKPASSнам нужно, чтобы sshк нему не был подключен терминал (aka. STDIN& STDOUT).

Один из способов сделать это, используя команду setsid. Не плохо себя чувствую. Я никогда не слышал об этом инструменте. Со страницы руководства:

setsid - запустить программу в новом сеансе

Поэтому, если мы запускаем ssh«программу», setsidмы можем отсоединиться sshот нашего терминала, отвечающего критериям, указанным в sshсправочной странице пользователя. Другие критерии установлены следующим образом:

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

Итак, если мы соберем все это вместе:

$ setsid ssh user@remotehost

Например:

$ setsid ssh user@skinner

                                       ss of ask gui

Решение

Если вы хотите, чтобы он был setsid«встроенным», вы можете создать псевдонимы так:

$ alias ssh="setsid ssh"

Теперь, когда вы sshполучите графический интерфейс, запрашивающий ваш пароль:

$ ssh user@skinner

Ссылки

SLM
источник
ssh-askpass gnome установлен и работает нормально, если запускается вручную.
Gioele
@ gioele - смотрите обновления, думаю, я это понял.
SLM
проблема этого решения состоит в том, что он требует, чтобы я модифицировал каждую команду git или rsync для использования setsid sshinstad из plain ssh.
Джоеле
@gioele - вы попросили метод «форсировать» GUI пароля, это обеспечивает это. Вы можете заменить такие команды, как sshпсевдонимы, setsid sshэто один из подходов. Есть и другие способы. Ограничивающим фактором является то, что openssh не требует присоединения TTY для активации ASK_SSHPASS.
SLM
Я не пропускаю пакет, и я не могу использовать, setsidа затем работать sshс моего терминала. Это просто неверный ответ !? Кроме того, он работал в старых версиях Ubuntu, поэтому я не уверен, что понимаю, почему он вдруг перестал работать!
Алексис Вилке
8

Это невозможно сделать в текущем OpenSSH: в OpenSSH Bugzilla существует проблема, требующая этой функции по состоянию на 2013-07: обобщить SSH_ASKPASS .

Gioele
источник
Это не дает ответа на вопрос. Чтобы критиковать или запросить разъяснения у автора, оставьте комментарий под своим постом.
cuonglm
8
@cuonglm "это невозможно" - это ответ. Это может быть неправильно или вводить в заблуждение (я не говорю, что это так), но это все еще ответ.
Terdon
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(там же).

В качестве дополнительного примечания и не по теме, но связанного примечания, если вы когда-нибудь захотите запрограммировать службу в 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 .

Fabrice
источник