忽略 bash 脚本中的 sudo

Ano*_*ous 10 bash sudo scripts 14.04

我有一个小的 bash 脚本:

#!/bin/bash

touch dummy.txt
Run Code Online (Sandbox Code Playgroud)

如果我执行此脚本,sudo那么它将创建dummy.txt将被root protected

我想做的是:

不管这个脚本是否使用执行的sudo还是普通用户,文件dummy.txt应该不会被根保护。

ste*_*ver 22

您可以通过sudo使用EUIDSUDO_USER变量测试脚本是否正在运行,然后touchSUDO_USERtrue 一样执行- 类似

#!/bin/bash

if [[ $EUID -eq 0 ]] && [[ -n $SUDO_USER ]]; then
  sudo -u "$SUDO_USER" touch dummy.txt
else
  touch dummy.txt
fi
Run Code Online (Sandbox Code Playgroud)

  • 注意 `==` 用于字符串比较。由于 `$EUID` 应该返回整数值,我建议你使用 `-ed` 比较。[用户名中允许有空格](http://unix.stackexchange.com/a/148044/85039) ,所以可能引用 `$SUDO_USER` 变量。否则,很好的答案 - 这是我个人会使用的东西。 (2认同)

Dmi*_*yev 9

如果您的脚本不打算作为 运行root,那么解决问题的最安全方法是在一开始就中止脚本的执行:

if [ "$EUID" = 0 ]; then
   echo "This script must NOT be run as root" 
   exit 1
fi
Run Code Online (Sandbox Code Playgroud)

或者,您可以作为后备用户(例如sudo -u FALLBACK_USER "$0")重新执行您的脚本,而不是简单地中止。

尝试修复单个命令的怪癖将使您的脚本变得不必要地复杂且难以调试。每次修改它时,您都必须进行两次所有测试(作为普通用户,然后作为root),并修复所有root出现的相关错误。可以这么说,这不是一个面向未来的解决方案。


Ser*_*nyy 6

默认情况下,使用 root 帐户创建的文件具有如下权限:

-rw-r--r-- 1 root root 0 11? 17 23:25 rootfile.txt
Run Code Online (Sandbox Code Playgroud)

这里的文件属于root用户和root组,root可以读写,其他人只能读取。

最简单的方法就是将chown文件还给原始用户。

chown username:group_name dummy.txt
Run Code Online (Sandbox Code Playgroud)

您可以使用$SUDO_USER仅在sudo被调用时才可访问的变量,如下所示:

chown "$SUDO_USER":"$SUDO_USER" dummy.txt
Run Code Online (Sandbox Code Playgroud)

如果您以普通用户身份运行脚本,则chown根本不需要该部分,因此您可能需要考虑使用 if-statement 或&&test 来测试脚本以 root 身份运行的情况,并按照以下方式执行操作:

#!/bin/bash
touch dummy.txt
[ $UID -eq 0 ] && chown "$SUDO_USER":"$SUDO_USER" dummy.txt
Run Code Online (Sandbox Code Playgroud)

以上是推荐的方法。还有其他的,比如chmod用来改变用户和组的读写执行权限,但不推荐。