我正在尝试为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)
答案 0 :(得分:4)
正如默认sudoers
文件末尾的评论所示,您应该在/etc/sudoers.d/
中创建一个新文件。
从(Debian)软件包postinst
执行此操作似乎很可疑。 user
的价值来自哪里?
此外,此用户的任何特定原因都不会简单地添加到其中一个现有群组admin
或sudoers
?
答案 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将会正常工作。