Emacs / CVS / OpenSSH: предотвращение всплывающего окна пароля

Я использую GNU Emacs на своем нетбуке Ubuntu в полноэкранном режиме. Когда я редактирую файлы, находящиеся под контролем версий, и нажимаю C-x v v, чтобы зафиксировать последние изменения, открывается всплывающее окно OpenSSH с запросом моего пароля для сервера, на котором находится мой репозиторий.

К сожалению, из-за полноэкранного режима всплывающее окно не открывается, и я не могу ввести свой пароль. Но это все еще как-то модально, поэтому я также не могу вернуться в emacs и, скажем, выйти из полноэкранного режима (или сделать что-нибудь еще, например C-g). Я практически в ловушке.

Как пользователь emacs, я считаю, что всплывающие окна все равно отвратительны ;-) поэтому в идеале я хотел бы, чтобы меня попросили ввести пароль ssh в минибуфере. Как я могу настроить свою систему так, чтобы это произошло? (Я предпочитаю каждый раз вводить свой пароль, а не хранить пару ключей в ~ / .ssh /).


person Thomas    schedule 14.07.2010    source источник
comment
Вы добавили награду, но так и не ответили ни на одно из предложений, сделанных людьми в первый раз. Мы не знаем, пытались ли вы вообще использовать эти решения.   -  person phils    schedule 13.06.2011
comment
@phils: Хороший замечание (хотя я прокомментировал один). Ваш собственный ответ был хорошим намеком, но не совсем ответом на мой вопрос. Я думаю, что ответ sanityinc, который вы тоже много комментировали (спасибо за это), идет в правильном направлении. Но это не выход.   -  person Thomas    schedule 18.06.2011


Ответы (6)


Вы можете использовать ssh-agent перед запуском emacs (или в другой оболочке).

person Dirk Eddelbuettel    schedule 14.07.2010
comment
Исходный плакат предпочитает вводить пароли аутентификации на основе ключа. Однако я согласен, что ssh-agent и пары ключей - лучшее решение. - person stsquad; 14.07.2010

Я размышляю здесь, так как я не использую CVS или vc в Emacs, однако я предполагаю, что Emacs выполняет командную оболочку для соответствующей программы для выполнения фиксации, а запрос пароля является чем-то полностью внешним по отношению к Emacs. Поэтому я подозреваю, что вы хотите сначала выяснить, какие параметры необходимы для выполнения фиксации без графического интерфейса пользователя из вашей оболочки без Emacs, а затем изменить vc-checkin-switches (или определить vc-cvs-checkin-switches) в Emacs для соответствия (см. defun vc-switches).

person phils    schedule 15.07.2010

Вероятно, сработала программа ssh-askpass, которая, как мне кажется, смотрит на переменную среды DISPLAY, чтобы решить, как запросить пароль. Если установлено, появляется графическое окно, а если нет, запрашивается TTY.

Если подсистема vcs определяет, когда у пользователя запрашиваются пароли (что весьма вероятно), то возможно, что вы можете отключить $ DISPLAY для подпроцессов:

(setenv "DISPLAY" nil)

Однако это может иметь и другие отрицательные побочные эффекты, поэтому также проверьте "man ssh-askpass" на случай, если что-то там может помочь.

(Отказ от ответственности: я лично использую решение на основе ssh-agent, которое настоятельно рекомендую.)

person sanityinc    schedule 16.07.2010
comment
Вы можете использовать советы или ловушки, чтобы применить это только к необходимому коду. Я вижу, что vc-before-checkin-hook и vc-checkin-hook (после) определены, но я предполагаю, что вам нужно будет сделать это не только для коммитов? Для (исключительно) случая C-x v v следующий совет будет охватывать его: (defadvice vc-next-action (around my-ssh-prompt-fix-for-vc-next-action activate) (let ((backup (getenv "DISPLAY"))) (setenv "DISPLAY" nil) ad-do-it (setenv "DISPLAY" backup))) - person phils; 19.07.2010
comment
Если среда, в которой работает cvs, влияет на это, то другой вариант - переопределить команду cvs. vc-cvs-command жестко кодирует cvs как команду и передает ее vc-do-command, поэтому одним из вариантов было бы написать сценарий оболочки для cvs (вне Emacs), чтобы выполнить настоящую команду в измененной среде. Это может повлиять на вызовы cvs, не относящиеся к Emacs, поэтому вы можете назвать оболочку чем-то другим, кроме cvs, и создать некий совет перед vc-do-command, чтобы изменить значение его command arg, чтобы оно соответствовало, когда это cvs. - person phils; 19.07.2010
comment
или, может быть, просто воспользуйтесь советом из моего первого комментария к vc-do-command вместо vc-next-action? - person phils; 19.07.2010
comment
Глобальная установка DISPLAY на nil предотвращает всплывающее окно. Однако теперь мне также нужен способ перенаправить ssh-askpass с запросом пароля на минибуфер. В настоящее время он просто печатает Permission denied to the *vc* buffer и прерывается. - person Thomas; 18.06.2011

Вы можете настроить ssh для мультиплексирования всех новых подключений к серверу через существующие подключения. Это означает, что пока вы открыли ssh-соединение (скажем, в оболочке), новые соединения с тем же удаленным хостом не будут запрашивать пароль. я использую

Host *
    ControlPath ~/.ssh/master-%r@%h:%p
    ControlMaster auto
    ServerAliveInterval 30

в ~ / .ssh / config, чтобы настроить это.

person l0st3d    schedule 13.06.2011
comment
Классная техника, но не совсем то, что я ищу здесь. Но все же полезно знать! - person Thomas; 14.06.2011

Исследуя свой основной ответ (см. Выше), я наткнулся на psvn для emacs. См. Этот вопрос / ответ SO для более подробной информации: SVN для Emacs: как установить имя автора и сохранить пароль?

Я подумал, что вам также может быть интересно узнать о psvn, но я думаю, что тот, который об установке значения PreferredAuthentication на SSH, более непосредственно применим к вопросу, который вы изначально задали.

person justis    schedule 15.06.2011

Попробуйте как-нибудь установить это в своей среде:

export CVS_RSH='ssh -o PreferredAuthentications="password"'

Это должно заставить его прекратить попытки аутентификации с открытым ключом, что также подавит отображение графического ssh-askpass. Это работает путем указания команды SSH, которую CVS будет использовать для подключения к удаленному серверу. Обратите внимание, что это будет применяться ко всем командам CVS, запускаемым из контекста, в котором вы устанавливаете переменную среды.

Вы также можете изучить возможность его настройки в своем ~/.ssh/config. Вы можете установить параметры для каждого хоста отдельно. Вот страница, которая примерно показывает, как, хотя для принудительной аутентификации по общедоступному ключу. Обратите внимание, что это повлияет на все использование SSH для вашей учетной записи, а не только для CVS. Это вполне может быть то, что вы ищете, поскольку вы, кажется, предпочитаете избегать аутентификации по публичному ключу. Вот пример блока, который вы бы добавили в ~/.ssh/config:

Host cvs

  Hostname cvs.your.corp
  User yourCVSusername
  PreferredAuthentications password

В качестве альтернативы вы можете изменить Host cvs на Host cvs.your.corp, если ваши существующие средства доступа к нему используют полное доменное имя, а не просто имя хоста.

Наконец, вы можете получить свой ~/.ssh/config файл только этой строкой (или добавить ее в начало существующей):

PreferredAuthentications password

Это сделает предпочтение применимым ко всем SSH-соединениям с удаленными хостами.

Удачи. Надеюсь, это поможет вам выбраться из ловушки модального диалога.

person justis    schedule 15.06.2011
comment
Спасибо, но я не использую SVN. - person Thomas; 18.06.2011
comment
То же решение работает для CVS, просто устанавливая переменную среды CVS_RSH вместо переменной SVN_SSH. Я обновил ответ, чтобы отразить это. Обратите внимание, что второе решение, изменяющее ~/.ssh/config, будет работать для всех программ, использующих SSH, даже если они не поддерживают такие переменные среды, как CVS_RSH и SVN_RSH. - person justis; 20.06.2011
comment
Я также добавил примеры для второго решения. - person justis; 20.06.2011
comment
@justis: Большое спасибо за обновление! Но действительно ли эти решения работают для вас? Для меня первое решение (установка CVS_RSH) дает мне cvs [commit aborted]: cannot exec ssh -o PreferredAuthentications="password": No such file or directory, а второе (редактирование ~ / .ssh / config) не имеет никакого эффекта, всплывающее окно все еще появляется. - person Thomas; 21.06.2011
comment
@thomas Да, мне точно подходит второй. Возможно, вам придется использовать PreferredAuthentications keyboard-interactive, если аутентификация пароля отключена на удаленном узле SSH. - person justis; 21.06.2011
comment
Всплывающее окно появляется потому, что ваш клиент и удаленный хост определили, что publickey - это метод, который вы оба предпочитаете больше всего. Затем он видит, что нет значения для SSH_TTY и что есть значение для SSH_ASKPASS или что значение по умолчанию присутствует и исполняется. Таким образом, в среде X11 появляется всплывающее окно вместо записи в терминал, которого не существует. - person justis; 21.06.2011
comment
Я только что понял, что PubkeyAuthentication no в вашем ~/.ssh/config тоже может работать. - person justis; 21.06.2011
comment
Уловка CVS_RSH не работает, потому что она рассматривает всю строку как исполняемый файл. Вы все равно сможете исправить это, изменив значения в ~ / .ssh / config. Однако я все еще не уверен, куда пойдет SSH_TTY. Я не использую emacs, я просто знаю немного о SSH и пытаюсь помочь с этой частью. - person justis; 21.06.2011