在Emacs组织模式下评估代码块时如何输入密码?

时间:2014-05-13 02:12:49

标签: emacs org-mode org-babel

我在Org文件中有一个shell代码块。还有" sudo"命令在里面。所以我应该被要求输入密码。但是当我评估它时,它只会返回" sudo"命令。是否有任何方式使评估类型具有互动性?

2 个答案:

答案 0 :(得分:20)

是的,通过向#+BEGIN_SRC行添加适当的header arguments

#+BEGIN_SRC sh :dir /sudo::
apt-get update
#+END_SRC
emacs-orgmode邮件列表上的

来源Running a sudo in a #+begin_src sh fails to get tty and askpass

解释:dir参数

  

指定代码块执行期间的默认目录。如果不存在,则使用与当前缓冲区关联的目录。

通过将/sudo::作为值传递给:dir,我们使用TRAMP语法来访问具有超级用户权限的文件或目录。请注意,在上面的示例中,我们没有指定在::之后使用的目录。在这种情况下,/root将用作默认值。基本上,我们对Org Babel所说的是“以root身份访问/root并在执行此代码时将该位置用作默认目录”。

您可以通过将/sudo::更改为

来指定要使用的其他目录
/sudo::/path/to/dir

修改

如果您需要代码块中的某些命令来运行而不具有超级用户权限,您可以通过添加

来执行此操作
sudo -u <username>

在他们面前(用普通用户的用户名替换<username>)。为了便于说明,假设您的用户名为enchanter,并且您希望代码块中不需要超级用户权限的任何命令作为您自己的用户运行。在这种情况下,您必须使用

为每个命令添加前缀
sudo -u enchanter

您可以使用whoami(打印当前处于“活动状态”的用户的名称)来检查这是否有效。添加

#+BEGIN_SRC sh :dir /sudo::
whoami
sudo -u enchanter whoami
whoami
#+END_SRC

到您的org-mode文件并进行评估。输出将是:

#+RESULTS:
| root       |
| enchanter  |
| root       |

<强>积分

我确信StackExchange / Internet上有其他帖子解决了以不同用户身份运行命令的问题,但是我找不到这些帖子了...

答案 1 :(得分:5)

当你有大多数命令以SUDO身份运行时,@ itjeyd的答案很好。

但是当你只有一小部分命令作为SUDO运行时,你必须编写很多sudo -u <username>代码,如果你希望用户可以运行该块,你必须将用户名作为变量传递。 / p>

对于这种情况,我有一个使用echo <password> | sudo -S <your command>

的解决方案

以下是示例:

#+BEGIN_SRC sh :var PASSWORD=(read-passwd "Sudo Password: ")
   # some normal commands here and there

   # run sudo
   echo ${PASSWORD} | sudo -S <your command>

   # more normal commands
#+END_SRC