15

我正在尝试为一些常用的 sudo shell 命令(例如,具有C-c srun (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

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

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

4

7 回答 7

14

我经常从 Emacs 调用命令,例如aptitude update. scottfrazer的解决方案可能没有那么有用。同步命令让我等了很久,如果你执行一个不受支持的程序(例如,aptitude使用ncurses的程序),你会挂掉 Emacs(C-g不会有帮助),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)))

这里“M”在interactiveminibuffer 中的程序名称提示中with-temp-buffer创建了一个假缓冲区,我们在其中将目录更改/sudo::/为使用 TRAMP 进行 sudo 提示。

这是 David Kastrup 来自sudo 命令的解决方案,带有 minibuffer 密码提示 @ gnu.emacs.help

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

阅读手册中的外壳流程

于 2013-07-30T09:38:02.550 回答
13

怎么样:

(shell-command (concat "echo " (shell-quote-argument (read-passwd "Password? "))
                       " | sudo -S your_command_here"))
于 2010-03-18T20:29:51.560 回答
6

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

M-x shell
sudo whoami

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

于 2010-03-18T18:12:52.280 回答
3

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

设置一个 ssh 密钥对,这样就不需要密码。

程序:

  1. 运行ssh-keygen以生成一对密钥。给他们一个有用的名字,让他们在你习惯这个名字后与你将做的所有其他人分开
  2. 公开的一份复制$HOME/.ssh收款账户
  3. 保留发送帐户的私有帐户(您可以将其复制到多个$HOME/.ssh发送帐户,但最好为每台传入机器制作单独的密钥对)
  4. 在发送机器上编辑$HOME/.ssh/config以告诉 ssh 使用什么密钥
  5. 利润
于 2010-03-18T18:38:45.943 回答
1

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

于 2010-03-18T18:18:22.800 回答
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目录中四处寻找。

于 2010-03-18T18:37:54.803 回答
0

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

http://nakkaya.com/sudoEl.markdown

于 2010-03-18T20:07:58.877 回答