我需要在一个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用户不能写入脚本。