Answers:
您可以sudo
使用EUID
和SUDO_USER
变量测试脚本是否正在运行,然后touch
像执行SUDO_USER
true一样执行-类似
#!/bin/bash
if [[ $EUID -eq 0 ]] && [[ -n $SUDO_USER ]]; then
sudo -u "$SUDO_USER" touch dummy.txt
else
touch dummy.txt
fi
sudo -u
检测到它以root身份运行,则可以重新运行脚本。OP谈到在一个脚本中包含多个命令。但是要注意避免错误的无限循环。
[[...]]
因此在if语句@Serg中引用该变量不是绝对必要的,而且我认为这-ed
是拼写错误-eq
-eq
。不知道[[
没有分词。谢谢。就个人而言,我仍会出于良好的脚本编写习惯而引用
如果您的脚本不是要以方式运行root
,则解决问题的最安全方法是在一开始就中止脚本的执行:
if [ "$EUID" = 0 ]; then
echo "This script must NOT be run as root"
exit 1
fi
(可选)您可以作为后备用户(例如sudo -u FALLBACK_USER "$0"
)重新执行脚本,而不仅仅是中止操作。
尝试解决单个命令的怪癖会使脚本不必要地变得复杂且难以调试。每次修改它时,您都必须进行两次测试(以普通用户身份,然后为root
),并修复所有root
与之相关的错误。可以这么说,这不是面向未来的解决方案。
默认情况下,使用root accound创建的文件具有如下权限:
-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
用途,例如用于更改用户和组的读写执行权限,但不建议这样做。
sudo
,则不可以-您不能忽略它。您可以选择以普通用户身份运行脚本(我不明白为什么不这样做,因为您只是在这里为您的用户创建文件)或更改文件所有权(如我在答案中所示)。
chown
和chmod
在脚本中根据需要设置所有权和权限。