我在 Org 文件中有一个 shell 代码块。里面有“sudo”命令。所以我应该被要求输入密码。但是当我评估它时,它只会返回“sudo”命令的错误。有什么方法可以使评估具有互动性吗?
2 回答
是的,通过向该行添加适当的标题参数#+BEGIN_SRC
:
#+BEGIN_SRC sh :dir /sudo::
apt-get update
#+END_SRC
来源:在 #+begin_src sh 中运行 sudo 无法在 emacs-orgmode 邮件列表中获取 tty 和 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 上还有其他帖子解决了以不同用户身份运行命令的问题,但我在找到这些后就停止了寻找......
当您有大多数命令作为 SUDO 运行时,@itsjeyd 的答案很好。
但是,当您只有一小部分命令作为 SUDO 运行时,您必须编写大量代码,sudo -u <username>
并且如果您希望该块可以由用户运行,则必须将用户名作为变量传递。
对于这种情况,我有一个解决方案可以使用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