enc*_*ter 10 emacs org-mode org-babel
我在Org文件中有一个shell代码块.其中有"sudo"命令.所以我应该被要求输入密码.但是当我评估它时,它只是为"sudo"命令返回错误.是否有任何方法可以使评估类型具有互动性?
its*_*eyd 20
是的,有,通过添加适当的报头参数的#+BEGIN_SRC
行:
#+BEGIN_SRC sh :dir /sudo::
apt-get update
#+END_SRC
Run Code Online (Sandbox Code Playgroud)
来源:在#+ begin_src sh中运行sudo无法获取tty并在emacs-orgmode邮件列表上询问.
说明::dir
参数
指定代码块执行期间的默认目录.如果不存在,则使用与当前缓冲区关联的目录.
通过传递/sudo::
值,:dir
我们正在使用TRAMP语法来访问具有超级用户权限的文件或目录.请注意,在上面的示例中,我们没有指定要使用的目录::
.在这种情况下,/root
将用作默认值.基本上,我们对Org Babel说的是" /root
以root身份访问并在执行此代码时将该位置用作默认目录".
您可以通过更改/sudo::
为指定要使用的其他目录
/sudo::/path/to/dir
Run Code Online (Sandbox Code Playgroud)
编辑
如果你需要代码块中的某些命令在没有超级用户权限的情况下运行,你可以通过put来实现
sudo -u <username>
Run Code Online (Sandbox Code Playgroud)
在他们面前(用<username>
普通用户的用户名替换).为了便于说明,假设您的用户名是enchanter
,并且您希望代码块中不需要超级用户权限的任何命令作为您自己的用户运行.在这种情况下,您必须为每个命令添加前缀
sudo -u enchanter
Run Code Online (Sandbox Code Playgroud)
您可以使用whoami
(打印当前"活动"的用户的名称)检查其是否有效.加
#+BEGIN_SRC sh :dir /sudo::
whoami
sudo -u enchanter whoami
whoami
#+END_SRC
Run Code Online (Sandbox Code Playgroud)
到您的org-mode
文件并评估它.输出将是:
#+RESULTS:
| root |
| enchanter |
| root |
Run Code Online (Sandbox Code Playgroud)
积分
我确信StackExchange/Internet上还有其他帖子解决了以不同用户身份运行命令的问题,但是我已经停止了我找到这些...
当你有大多数命令作为SUDO运行时,@ itjeyd的答案是好的.
但是当你只有一小部分命令作为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
Run Code Online (Sandbox Code Playgroud)