在Debian Linux上允许复杂的sudo命令

我需要在一个Debian Linux机器上为一个用户提供一个特定的命令。 我已经在/etc/sudoers文件中试过了:

 # User privilege specification zabbix ALL=NOPASSWD: /usr/bin/apt-get --print-uris -qq -y upgrade 2>/dev/null |awk '{print $2}' | wc | awk '{print $1}' 

这不像预期的那样工作。 如果我用sudo作为用户zabbix运行该命令,它要求input密码(尽pipe我已经指定了NOPASSWD选项)。

但是,这工作:

 # User privilege specification zabbix ALL=NOPASSWD: /usr/bin/apt-get 

但是有apt-get所有子命令都允许的缺点。 有没有办法如何解决这个只允许一个特定的命令?

我不同意。 虽然它可以工作,但不需要awk以root身份运行。 我不会对此感到满意,因为你可能会以某种方式攻击awk 。 毕竟这是一个完整的编程语言翻译器。

当运行sudo /usr/bin/apt-get --print-uris -qq -y upgrade 2>/dev/null |awk '{print $2}' | wc | awk '{print $1}' sudo /usr/bin/apt-get --print-uris -qq -y upgrade 2>/dev/null |awk '{print $2}' | wc | awk '{print $1}' sudo /usr/bin/apt-get --print-uris -qq -y upgrade 2>/dev/null |awk '{print $2}' | wc | awk '{print $1}' ,他们实际上正在运行sudo /usr/bin/apt-get --print-uris -qq -y upgrade ,然后作为调用用户pipe道/redirect。

试试这个: zabbix ALL=NOPASSWD: /usr/bin/apt-get --print-uris -qq -y upgrade

顺便说一下,把这个放在脚本中没有什么不对的,你仍然可以这样做。 如果可能的话,我会避免以root身份运行awk。

您可能正在与redirect与sudo进行交互的方式犯规。 redirect在主叫用户而不是特权用户处执行。 你可能会更容易将你的命令封装在脚本中,然后允许zabbix用户运行该脚本

 #!/bin/bash /usr/bin/apt-get --print-uris -qq -y upgrade 2>/dev/null |awk '{print $2}' | wc | awk '{print $1}' 

集合sudoers为

 zabbix ALL=NOPASSWD: /path/to/script 

现在,整个脚本将作为特权用户运行,而不仅仅是特定的apt-get命令。 尽pipe确保zabbix用户不能写入脚本。