我有一个小的 bash 脚本:
#!/bin/bash
touch dummy.txt
如果我执行这个脚本,sudo
它将dummy.txt
创建根保护。
我想要做的是:
无论此脚本是使用sudo
还是普通用户执行,文件dummy.txt
都应该不是受到 root 保护。
答案1
sudo
您可以使用EUID
和变量来测试脚本是否正在运行SUDO_USER
,然后touch
按SUDO_USER
真值执行 - 类似于
#!/bin/bash
if [[ $EUID -eq 0 ]] && [[ -n $SUDO_USER ]]; then
sudo -u "$SUDO_USER" touch dummy.txt
else
touch dummy.txt
fi
答案2
如果您的脚本不打算以 身份运行root
,解决问题最安全的方法是在一开始就中止脚本的执行:
if [ "$EUID" = 0 ]; then
echo "This script must NOT be run as root"
exit 1
fi
或者,您可以以后备用户身份重新执行脚本(例如sudo -u FALLBACK_USER "$0"
),而不是简单地中止。
尝试修复单个命令的怪癖会使您的脚本变得不必要地复杂且难以调试。每次修改它时,您都必须进行两次测试(作为普通用户,然后作为root
),并修复root
出现的所有与 相关的错误。可以说,这不是一个面向未来的解决方案。
答案3
默认情况下,使用 root 帐户创建的文件具有如下权限:
-rw-r--r-- 1 root root 0 11月 17 23:25 rootfile.txt
此处文件属于root用户和root组,root可以读写,但其他人只能读取。
最简单的方法就是将chown
文件返回给原始用户。
chown username:group_name dummy.txt
您可以使用仅在调用$SUDO_USER
时才可访问的变量,如下所示:sudo
chown "$SUDO_USER":"$SUDO_USER" dummy.txt
如果您以普通用户身份运行脚本,则chown
根本不需要该部分,因此您可能需要考虑使用 if 语句或&&
测试来测试脚本以 root 身份运行的情况,并执行以下操作:
#!/bin/bash
touch dummy.txt
[ $UID -eq 0 ] && chown "$SUDO_USER":"$SUDO_USER" dummy.txt
以上是推荐的方法。还有其他方法,例如用于chmod
更改用户和组的读写执行权限,但不建议这样做。