0

我正在尝试为 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)

4

3 回答 3

4

sudoers正如默认文件末尾的注释所建议的那样,您应该在/etc/sudoers.d/.

但是,从(Debian)软件包中执行此操作postinst似乎很可疑。的价值user从何而来?

此外,该用户没有简单地添加到现有组之一的任何特殊原因,admin或者sudoers

于 2013-04-29T16:24:45.110 回答
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
于 2014-01-29T00:03:46.720 回答
0

您可以通过“ pkexec visudo ”编辑文件/etc/sudoers,当您删除坏行后,sudo 将起作用。

于 2015-06-28T09:04:30.483 回答