我有一个脚本,用于在全新安装操作系统后设置我的系统。它执行的大部分操作都需要超级用户权限,但有些命令会在主目录下创建文件(例如锁定文件),而主目录的所有者必须对该文件具有写入权限。为了避免在我自己的主目录下而不是下为超级用户创建文件/root
,我要求使用脚本运行sudo -i
并sudo -iu "$SUDO_USER"
以我的身份执行命令。
这在大多数情况下都很有效,但我现在需要执行一个命令,就像我用它运行它一样sudo
,不是 sudo -i
。我该怎么办?
一个糟糕的解决方案可能是这样的:
sudo -iu "$SUDO_USER" << LF
sudo [command]
LF
上面的问题是sudo [command]
可能会提示输入密码,并且该脚本必须是非交互式的。
答案1
正如@Xen2050 所建议的,我暂时允许自己以超级用户身份执行命令,无需进行身份验证。
/etc/sudoers.d
我通过使用指令在目录下添加文件来实现此目的NOPASSWD
。为了安全起见,我使用了visudo
,因此我必须在 here-doc 中使用 ed 脚本,而不是直接使用 here-doc。运行命令后,我删除了该文件。
#!/bin/bash
EDITOR=ed visudo -f /etc/sudoers.d/[file] << LF
a
$SUDO_USER $(hostname) = NOPASSWD: [command]
.
wq
LF
sudo -iu "$SUDO_USER" bash << LF
sudo [command]
LF
rm /etc/sudoers.d/[file]
请注意,[command]
ed 脚本中必须包含命令的完整路径。我[file]
以命令命名。在我的例子中,我正在运行 TeX Live 的安装程序,install-tl
所以我选择它作为文件的名称。