如何在Emacs中运行sudo命令?

时间:2010-03-18 18:07:17

标签: emacs sudo shell

我正在尝试为一些常用的sudo shell命令创建快捷键(例如,让C-c s运行(shell-command "sudo /etc/init.d/apache2 restart"))。

我尝试使用如上所述的直接shell命令调用,但它只是将以下内容输出到*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

实际上并没有要求输入密码。我不想使用sudo emacs启动Emacs,但我想这是一个选项,如果没有别的方法可行。

理想的解决方案是Emacs中的一个函数(而不是OS jiggery-pokery来改变shell的行为或sudo命令)。类似于(sudo-shell-command "dostuff")(with-password-prompt (shell-command "sudo dostuff"))

7 个答案:

答案 0 :(得分:13)

怎么样:

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

答案 1 :(得分:11)

我经常拨打来自Emacs的命令,例如aptitude updatescottfrazer的解决方案可能没那么有用。同步命令让我等了很长时间,如果你执行一个不受支持的程序(例如aptitude,它使用ncurses),你将挂断Emacs( Cg 不会帮助),CPU负载将是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中的“M”提示迷你缓冲区中的程序名称,with-temp-buffer创建一个假缓冲区,我们将目录更改为/sudo::/以使用TRAMP进行sudo提示。

这是来自sudo command with minibuffer password prompt @ gnu.emacs.help的David Kastrup的解决方案。

注意,您仍然不应该直接调用aptitude,否则子进程将永远存在,直到您发送sudo pkill aptitude

在手册中阅读shellsprocesses

答案 2 :(得分:4)

如果你正在运行emacs22或更高版本,你可以从emacs启动一个shell并在那里运行你的sudo命令。它会自动将您拉入迷你缓冲窗口以获取密码:

M-x shell
sudo whoami

这应该只是在屏幕底部询问您的密码(没有显示它)。

答案 3 :(得分:3)

解决方法(而不是emacs解决方案):

设置ssh密钥对,以便不需要密码。

步骤:

  1. 运行ssh-keygen以生成一对密钥。给它们一个有用的名称,以便在你习惯使用它们之后将它们整理出来。
  2. 公开一个复制到$HOME/.ssh以获取接收帐户
  3. 私有保留在发送帐户的$HOME/.ssh中(您可以将其复制到多个发送帐户,但为每台传入的计算机创建单独的密钥对可能更好)< / LI>
  4. 在发送计算机上编辑$HOME/.ssh/config以告诉ssh使用哪个密钥
  5. 利润

答案 4 :(得分:1)

sudo尝试打开终端设备(tty)以读取密码。您的emacs进程可能没有控制终端。 sudo -S告诉它使用标准输入来获取应该来自emacs的密码。

答案 5 :(得分:1)

编辑:斯科特上面的回答远比这个黑客更好。使用它。

可能的解决方案:

我发现设置默认密码请求实用程序可以解决这个问题。

我必须做的是将Defaults:ALL askpass=/usr/lib/openssh/gnome-ssh-askpass添加到我的/etc/sudoers文件中(显然使用sudo visudo)。

评估(shell-command "sudo /etc/init.d/apache2 restart")现在提示我输入密码,而不是试图猜测它不成功。

我不接受这个答案,除非很明显没有更好的解决办法;理想情况下,我想在Emacs内部解决问题,而不是要求你在/etc目录周围寻找问题。

答案 6 :(得分:0)

我使用以下命令以root身份从emacs启动nmap,

http://nakkaya.com/sudoEl.markdown