在bash脚本中忽略sudo


9

我有一个小的bash脚本:

#!/bin/bash

touch dummy.txt

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

我想做的是:

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


4
不论“ root protected”是什么意思,您都可以使用chownchmod在脚本中根据需要设置所有权和权限。
fkraiem

1
目前尚不清楚“根保护”是什么意思。您是说只有root用户才能读/写(例如,将文件权限设置为700),或者root用户是文件所有者?

1
@DoritoStyle很抱歉造成您的混淆。用root保护,我的意思是root用户是文件所有者。
匿名

Answers:


22

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

#!/bin/bash

if [[ $EUID -eq 0 ]] && [[ -n $SUDO_USER ]]; then
  sudo -u "$SUDO_USER" touch dummy.txt
else
  touch dummy.txt
fi

2
注意==用于字符串比较。由于$EUID应该返回整数值,因此建议您使用-ed比较。 用户名中允许使用空格,因此可能用引号引起$SUDO_USER来。否则,好的答案-这是我个人会使用的东西。
Sergiy Kolodyazhnyy

@steeldriver,这就是我想要的。谢谢!!
匿名

1
如果脚本sudo -u检测到它以root身份运行,则可以重新运行脚本。OP谈到在一个脚本中包含多个命令。但是要注意避免错误的无限循环。
彼得·科德斯

1
没有分词,[[...]]因此在if语句@Serg中引用该变量不是绝对必要的,而且我认为这-ed是拼写错误-eq
Arronical

@Arronical是的,这是的错字-eq。不知道[[没有分词。谢谢。就个人而言,我仍会出于良好的脚本编写习惯而引用
Sergiy Kolodyazhnyy,2016年

9

如果您的脚本不是要以方式运行root,则解决问题的最安全方法是在一开始就中止脚本的执行:

if [ "$EUID" = 0 ]; then
   echo "This script must NOT be run as root" 
   exit 1
fi

(可选)您可以作为后备用户(例如sudo -u FALLBACK_USER "$0")重新执行脚本,而不仅仅是中止操作。

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


6

默认情况下,使用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用途,例如用于更改用户和组的读写执行权限,但不建议这样做。


感谢您的回复。但是在QI中,仅在实际情况下解释了简单的情况,原始脚本将创建许多文件。在Linux中,我们不能只是简单地忽略sudo吗?
匿名

1
@Anonymous如果使用来执行整个脚本sudo,则不可以-您不能忽略它。您可以选择以普通用户身份运行脚本(我不明白为什么不这样做,因为您只是在这里为您的用户创建文件)或更改文件所有权(如我在答案中所示)。
Sergiy Kolodyazhnyy

这是最正确的解决方案,并且应该不难扩展。
小鸡
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.