在 bash 脚本中忽略 sudo

在 bash 脚本中忽略 sudo

我有一个小的 bash 脚本:

#!/bin/bash

touch dummy.txt

如果我执行这个脚本,sudo它将dummy.txt创建根保护

我想要做的是:

无论此脚本是使用sudo还是普通用户执行,文件dummy.txt都应该不是受到 root 保护。

答案1

sudo您可以使用EUID和变量来测试脚本是否正在运行SUDO_USER,然后touchSUDO_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更改用户和组的读写执行权限,但不建议这样做。

相关内容