在bash脚本中忽略sudo
我有一个小的bash脚本:
#!/bin/bash touch dummy.txt
如果我用sudo
执行这个脚本,那么它将创建一个将受root保护的 dummy.txt
。
我想做的是:
无论此脚本是使用sudo
还是普通用户执行,文件dummy.txt
都不应受root保护。
您可以使用EUID
和SUDO_USER
变量测试脚本是否通过sudo
运行,然后如果为true则执行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
如果您的脚本不是以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
时可访问的$SUDO_USER
变量,如下所示:
chown "$SUDO_USER":"$SUDO_USER" dummy.txt
如果您以普通用户身份运行脚本,则根本不需要chown
部分,因此您可能需要考虑使用if-statement或&&
test来测试以root身份运行脚本的情况,并沿着这些行执行某些操作:
#!/bin/bash touch dummy.txt [ $UID -eq 0 ] && chown "$SUDO_USER":"$SUDO_USER" dummy.txt
以上是推荐的方法。 还有其他一些,比如使用chmod
来更改用户和组的读写执行权限,但不建议这样做。