![作为 sudo 运行这个 bash 脚本如何以 root 身份执行内容](https://linux22.com/image/164439/%E4%BD%9C%E4%B8%BA%20sudo%20%E8%BF%90%E8%A1%8C%E8%BF%99%E4%B8%AA%20bash%20%E8%84%9A%E6%9C%AC%E5%A6%82%E4%BD%95%E4%BB%A5%20root%20%E8%BA%AB%E4%BB%BD%E6%89%A7%E8%A1%8C%E5%86%85%E5%AE%B9.png)
我被告知以下两个有关以 sudo 身份运行脚本的声明:
- 执行sudo命令的用户还必须具有该文件的执行权限
- 只有该文件将以 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
- 执行sudo命令的用户还必须具有该文件的执行权限
说法1不准确。执行 sudo 的用户不需要具有脚本的执行权限。
- 只有该文件将以 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脚本不需要执行。执行只会使它们更易于使用,因为#!
顶部的用于确定解释器。但是,您可以直接告诉解释器运行该脚本。因此您只需要读取权限。