通过shell脚本为用户添加sudo权限sudoers

时间:2013-04-29 15:43:45

标签: linux bash shell ubuntu sudoers

我正在尝试为Linux创建一个安装后脚本,我想让脚本编辑sudoers文件,以便用户不需要执行sudo visudo并手动编辑它。

在脚本中我有:

if [[ ! `sudo -l -U "$user" 2>&1 | grep "ALL"` ]]; then
    su -c "echo '$user ALL=(ALL) ALL' >> /etc/sudoers"
    su -c "echo '$user ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers"
fi

问题在于,当我运行脚本后sudo whoami时,我得到了这个输出:

  

sudo:>>> / etc / sudoers:第31行附近的语法错误<<<   sudo:在第31行附近的/ etc / sudoers中解析错误   sudo:找不到有效的sudoers来源,戒烟   sudo:无法初始化策略插件

如何在不破坏我的sudoers文件的情况下执行此操作?

修改 这里要求的是我的sudoers文件:

Defaults    env_reset
Defaults    mail_badpass
Defaults    secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"

# Host alias specification

# User alias specification

# Cmnd alias specification

# User privilege specification
root    ALL=(ALL:ALL) ALL

# Members of the admin group may gain root privileges
%admin ALL=(ALL) ALL

# Allow members of group sudo to execute any command
%sudo   ALL=(ALL:ALL) ALL

# See sudoers(5) for more information on "#include" directives:

#includedir /etc/sudoers.d

请注意,在脚本运行后无法执行cat /etc/sudoers

编辑2: 解决方案是将$ user定义为user=$(whoami)

3 个答案:

答案 0 :(得分:4)

正如默认sudoers文件末尾的评论所示,您应该在/etc/sudoers.d/中创建一个新文件。

从(Debian)软件包postinst执行此操作似乎很可疑。 user的价值来自哪里?

此外,此用户的任何特定原因都不会简单地添加到其中一个现有群组adminsudoers

答案 1 :(得分:1)

我的解决方案是让脚本要求用户输入密码并将值存储在要与 Expect 一起使用的变量中。如果没有安装,脚本将安装Expect,然后脚本执行:

read -p "Please enter your password: " PASSWD
export PASSWD
username=$USER
export username

if [[ ! `sudo -l -U "$USER" 2>&1 | grep "ALL"` ]]; then
  expect -c '
      spawn "su -c \"cat <<EOF >> /etc/sudoers.d/$env(username)
          $env(username) ALL=(ALL:ALL) ALL
          $env(username) ALL=(ALL) NOPASSWD:ALL
EOF
\"
      "
      expect "Password:\r"
      send $env(PASSWD)
      interact
  '
fi

答案 2 :(得分:0)

您可以通过“ pkexec visudo ”编辑文件 / etc / sudoers ,之后当您删除错误的行时,sudo将会正常工作。