以 sudo 身份运行此 bash 脚本如何以 root 身份执行内容

nul*_*nce -1 permissions sudo shell-script

我被告知以下两个关于以 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 {} \;
Run Code Online (Sandbox Code Playgroud)

这个脚本的权限是:

-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')

d4n*_*3sh 5

  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
Run Code Online (Sandbox Code Playgroud)

希望有帮助。