让非 root 用户使用需要 root 访问权限的命令执行脚本的最佳方法?

让非 root 用户使用需要 root 访问权限的命令执行脚本的最佳方法?

我有一个由 php 执行的脚本,因此它以 www-data 用户身份运行。该脚本非常简单,它基本上将一些预制文件(例如主机和接口文件)复制到正确的目录。也许更新一些权限等。

我认为创建一个新用户并仅通过以下方式授予该用户对所需命令的访问权限visudo可能可行,但是

  1. 仍然要求用户执行.sh密码并且
  2. 它显然没有授予测试用户权限。

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'
  1. 将该脚本放在只能由以下人员写入的路径中root
  2. 创建一个sudo这样的权限

    www-data ALL= NOPASSWD:/path/to/script.sh
    
  3. www-data像 这样调用脚本

    sudo /path/to/script.sh
    

相关内容