2010-03-18 3 views
13

Я пытаюсь создать сочетания клавиш для некоторых обычно используемых команд sudo shell (например, имея C-c s запустите (shell-command "sudo /etc/init.d/apache2 restart")).Как запустить команду sudo в Emacs?

Я попытался с помощью оболочки вызова команды прямо как указано выше, но он просто выводит следующее в *Shell Command Output* буфера:

[sudo] password for Inaimathi: 
Sorry, try again. 
[sudo] password for Inaimathi: 
Sorry, try again. 
[sudo] password for Inaimathi: 
Sorry, try again. 
sudo: 3 incorrect password attempts 

Это на самом деле не запрашивает пароль. Я не хочу запускать Emacs, используя sudo emacs, но я думаю, что это вариант, если ничего не будет работать.

Идеальное решение было бы функцией из Emacs (в отличие от OS jiggery-pokery, чтобы изменить поведение оболочки или команду sudo). Что-то вроде (sudo-shell-command "dostuff"), или (with-password-prompt (shell-command "sudo dostuff")).

+0

Связанный (около дубликата?): Http://stackoverflow.com/questions/95631/open-a-file-with-su-sudo-inside-emacs и голос для перехода на Суперпользователя может быть правильным. @Inaimathi: Если это тесно связано с программированием, сейчас самое подходящее время, чтобы объяснить, почему, или эти вопросы, вероятно, будут перенесены на более подходящий сайт. – dmckee

+2

Учитывая, что OP пытается связать некоторый elisp с ключом, это для меня достаточно программирование. – dmckee

+0

Реструктурированный вопрос, чтобы облегчить некоторую путаницу. – Inaimathi

ответ

13

Как насчет:

(shell-command (concat "echo " (shell-quote-argument (read-passwd "Password? ")) 
         " | sudo -S your_command_here")) 
+0

Отлично. Другими словами, я мог бы легко сделать что-то вроде '(defun sudo-shell-command (command) (shell-command (concat« echo »(read-passwd« Пароль: »)« | sudo -S »)))' , Гораздо лучше, чем писать пароль в исходном коде. – Inaimathi

3

Если вы используете emacs22 или новее, вы можете просто запустить оболочку из emacs и запустить там команду sudo. Он будет автоматически тянуть вас в окно минибуфера вашего пароля:

M-x shell 
sudo whoami 

Это нужно просто попросить ваш пароль вниз в нижней части экрана (без его отображения).

+0

eshell также хорошо :) – rmk

+0

Я предпочитаю 'ansi-term';) –

1

sudo пытается открыть терминальное устройство (tty), чтобы прочитать пароль. Процесс emacs может не иметь управляющего терминала. sudo -S сообщает, что он использует стандартный ввод для пароля, который должен поступать от emacs.

+0

' (shell-command "sudo -S /etc/init.d/apache2 restart") 'делает то же самое (т. Е. Пытается произвольно пароль 3 раза и отправляет 3 неудачных попытки в буфер '* Shell Command Output * '. – Inaimathi

+0

И' (shell-command "echo password | sudo -S /etc/init.d/apache2 restart") '? (Нет что это хорошее решение для кодирования пароля в команде.) –

+0

Да. Я бы не хотел, чтобы мой корневой пароль был где-то в моем коде. Похоже, это может быть хуже, чем запуск 'sudo emacs'. +1 для предложения подхода -S (даже если я его неправильно понял) – Inaimathi

1

РЕДАКТИРОВКА: Ответ Скотта выше является более предпочтительным для этого взлома. Используйте это.

Возможное решение:

я узнал, что установка по умолчанию пароля с просьбой полезности решает эту проблему.

Что мне нужно было сделать, это добавить Defaults:ALL askpass=/usr/lib/openssh/gnome-ssh-askpass в мой файл /etc/sudoers (с использованием sudo visudo, очевидно).

Eval-ing (shell-command "sudo /etc/init.d/apache2 restart") теперь предлагает мне пароль вместо попыток угадать его безуспешно.

Я не принимаю этот ответ, если не станет ясно, что нет лучшего решения; в идеале я хотел бы что-то, что решает проблему внутри Emacs, вместо того, чтобы требовать, чтобы вы ткнулись в свой каталог /etc.

+0

Еще лучше, если у вас есть управление sudoers, вы можете настроить его так * вы * не запрашиваете пароль для этих программ, которые вы часто запускаете , –

3

Обход (а не решение Emacs):

Настройка пары ключей SSH, так что пароль не требуется.

Процедура:

  1. запустить ssh-keygen генерировать пару ключей.Дайте им подходящее имя, чтобы держать их выясняли от всех остальных вы будете делать, как только вы получите использовать для этого
  2. Скопируйте общественности один к $HOME/.ssh для получения учетной записи
  3. Держите частный один в $HOME/.ssh представляемого счета (вы можете скопировать его на несколько отправке счетов, но это может быть лучше сделать отдельную пару ключей для каждой входящей машины)
  4. редактировать $HOME/.ssh/config на отправляющую машине сказать SSH, какой ключ использовать
  5. Прибыль
0

Я использовал следующее для запуска Nmap из Emacs, как корень,

http://nakkaya.com/sudoEl.markdown

+0

Эта ссылка кажется мертвой. Где-то мы можем это увидеть? –

11

Я часто называют команды из Emacs, как aptitude update. Решение scottfrazer может оказаться не столь полезным. Синхронные команды заставляют меня ждать долгое время, и если вы выполняете неподдерживаемую программу (например, aptitude, которая использует ncurses), вы повесите трубку Emacs (Cg не поможет), а загрузка процессора будет на 100% , Изменение на async-shell-command решает это.

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

echo PASSWORD | sudo -S aptitude: exited abnormally with code 1. 

Вот почему я предлагаю следующее решение:

(defun sudo-shell-command (command) 
    (interactive "MShell command (root): ") 
    (with-temp-buffer 
    (cd "/sudo::/") 
    (async-shell-command command))) 

Здесь «М» в interactive запрашивает имя программы в минибуфере, with-temp-buffer создает буфер подстановки, в котором мы меняем каталог на /sudo::/, чтобы использовать TRAMP для приглашения sudo.

Это решение от David Kastrup от sudo command with minibuffer password prompt @ gnu.emacs.help.

Обратите внимание, что вы по-прежнему не должны звонить напрямую aptitude, иначе подпроцесс будет там навсегда, пока вы не отправите sudo pkill aptitude.

Прочитать на shells и processes в руководстве.

+1

Спасибо, ваш ответ именно то, что я искал. Я думаю, что это должно быть отмечено как лучшее. –

Смежные вопросы