我有一个由 php 执行的脚本,因此它以 www-data 用户身份运行。该脚本非常简单,它基本上将一些预制文件(例如主机和接口文件)复制到正确的目录。也许更新一些权限等。
我认为创建一个新用户并仅通过以下方式授予该用户对所需命令的访问权限visudo
可能可行,但是
- 仍然要求用户执行
.sh
密码并且 - 它显然没有授予测试用户权限。
visudo
(运行时所有权限被拒绝./script.sh
)
test ALL=(ALL) NOPASSWD:ALL
test ALL= NOPASSWD:ALL
test ALL=(ALL) NOPASSWD:/bin/cp,/bin/mv,/bin/nano,/bin/chown,/bin/mv
当我将test
用户更改为我登录的实际用户时,它就起作用了。
.sh
由登录/www-data
尝试以具有所需权限的其他用户身份执行命令的用户执行。
#!/bin/bash
sudo -H -u test cp test.txt /etc/test.txt
sudo -H -u test chown test /etc/test.txt
echo "ok"
www-data
使用户能够执行需要权限的脚本的最佳方法是什么root
?
答案1
你所展示的部分sudoers
没有意义。
test ALL=(ALL) NOPASSWD:ALL
test ALL= NOPASSWD:ALL
test ALL=(ALL) NOPASSWD:/bin/cp,/bin/mv,/bin/nano,/bin/chown,/bin/mv
您只需要其中一行,可能是最后一行。
不考虑早期命令的退出代码而执行echo "ok"
也没有多大意义。
据您显示,sudo
该用户没有任何权限www-data
。
在普通系统上sudo -H -u test cp test.txt /etc/test.txt
没有意义,因为用户test
无法在/etc
.仅当目标文件存在并且用户“test”具有写入权限时,这才有效。
然而,这sudo -H -u test chown test /etc/test.txt
永远没有意义,因为唯一可以chown
成功调用这种方式的用户是 root。
解决方案
我想你需要的是这个。一个脚本
#!/bin/bash
cp ~test/test.txt /etc/test.txt &&
chown test /etc/test.txt &&
echo 'ok' || echo 'failure'
- 将该脚本放在只能由以下人员写入的路径中
root
创建一个
sudo
这样的权限www-data ALL= NOPASSWD:/path/to/script.sh
www-data
像 这样调用脚本sudo /path/to/script.sh