作为 sudo 运行这个 bash 脚本如何以 root 身份执行内容

作为 sudo 运行这个 bash 脚本如何以 root 身份执行内容

我被告知以下两个有关以 sudo 身份运行脚本的声明:

  1. 执行sudo命令的用户还必须具有该文件的执行权限
  2. 只有该文件将以 root 身份执行,而不是其中的命令

我没有理由怀疑我被告知的内容,但是我有以下正在运行的设置,如果上述两个陈述正确的话,我想知道为什么。

我有以下脚本:

/var/www/bash_scripts/test/set_permissions.sh

该脚本包含以下内容:

chown -R jason:www-data /var/www/test.site.com
find /var/www/test.site.com -type f -exec chmod 664 {} \;
find /var/www/test.site.com -type d -exec chmod 775 {} \;

该脚本的权限为:

-rwxrwxr-- 1 root root 200 Nov 21 22:49 set_permissions.sh

我的/etc/sudoers文件包含以下附加到底部的行:

www-data ALL=(ALL) NOPASSWD: /var/www/bash_scripts/test/set_permissions.sh

当通过以 user 身份运行的 php 进程执行脚本时www-data,脚本将按预期执行,并且执行其中的所有命令。

如果上面的语句 1. 正确,则该脚本永远不应执行,因为它只能通过 root 用户执行。如果上面的语句 2. 正确,则脚本中的命令将无法执行。

我只是想弄清楚这两个陈述是否正确,如果正确,我做了什么才导致上述行为?

编辑

www-data拥有/var/www/test.site.com

php 代码通过以下方式运行命令: exec('sudo /var/www/bash_scripts/site/test/set_permissions.sh 2>&1')

答案1

  1. 执行sudo命令的用户还必须具有该文件的执行权限

说法1不准确。执行 sudo 的用户不需要具有脚本的执行权限。

  1. 只有该文件将以 root 身份执行,而不是其中的命令

说法2也不准确。 sudo 用户调用的脚本中的所有命令都将以 sudo 用户身份运行。

这是我运行的一个简单的测试脚本,用于显示脚本/命令运行时的用户 ID。

/tmp $ id
uid=1000(danesh) gid=1000(danesh) 

/tmp $ ls -l test.sh 
-rwxr-xr-x 1 danesh danesh 24 Nov 22 10:48 test.sh*

/tmp $ ./test.sh 
uid=1000(danesh) gid=1000(danesh) 

/tmp $ sudo ./test.sh
[sudo] password for danesh: 
uid=0(root) gid=0(root) groups=0(root)

/tmp $ sudo chown root:root test.sh
/tmp $ sudo chmod 770 test.sh
/tmp $ ls -l test.sh
-rwxrwx--- 1 root root 24 Nov 22 10:48 test.sh*

/tmp $ ./test.sh
fish: The file “./test.sh” is not executable by this user

/tmp [126] $ sudo ./test.sh
uid=0(root) gid=0(root) groups=0(root)


/tmp $ cat test.sh 
#!/usr/bin/env bash
# show the user executing this script
id

希望有帮助。

答案2

两种说法

执行 sudo 命令的用户还必须具有该文件的执行权限。只有该文件才会以 root 身份执行,而不会执行其中的命令。

完全错误。

另外,shell脚本不需要执行。执行只会使它们更易于使用,因为#!顶部的用于确定解释器。但是,您可以直接告诉解释器运行该脚本。因此您只需要读取权限。

相关内容