我的脚本中有一行正在运行,但无法从命令行运行。
echo "User ALL = NOPASSWD: ALL, !/bin/su" | sudo tee -a /etc/sudoers
[user@localhost ~]$ echo "test ALL = NOPASSWD: ALL, !/bin/su" | sudo tee -a /etc/sudoers
bash: !/bin/su": event not found
[user@localhost ~]$
编辑:我正在尝试添加一个没有su
命令权限的 sudo 用户,并且 sudo 用户可以使用sudo -i
.我只是检查该脚本中的每个命令,看看它们如何在命令行中工作。
我在命令行中找到了一个解决方法,我必须使用"'!'"/bin/su
.那么有人可以帮助解释为什么这在命令行中不起作用吗?
答案1
[请仔细阅读与您的问题相关的评论,因为您似乎没有以正确的方式做事sudo
]
在 中bash
,有一种称为“历史替换”的机制,可以在命令行上启用。它允许您在正在编辑的命令中插入先前命令的全部或部分(因此称为“历史记录”)。
触发历史替换的字符是!
。例如!WORD
替换为以 开头的最后一个命令WORD
。如果您没有这样的命令,bash
则会抱怨您收到的错误消息:bash: !WORD: event not found
。
如果您必须!
在不激活历史替换机制的情况下输入 a ,则必须将其转义\!
或用单引号括起来'!'
。
例如:echo 'User ALL = NOPASSWD: ALL, !/bin/su' | ...
如果历史记录扩展对您来说很麻烦,您也可以使用 禁用它set +H
,键入命令时不引用!
,然后稍后使用 重新启用它set -H
。
答案2
su
不赋予 root 特殊权力。因此阻止具有root权限的人使用它是没有意义的。- 仅使用以下方式编辑
sudo
文件visudo
:创建一个新sudo
文件以扩充原始文件并将其放入/etc/sudoers.d/
. - 您需要转义
!
:"bla bla bla \! bla bla"
或'bla bla bla ! bla bla'
.单引号将停止全部字符串的评估。
答案3
我相信这不会帮助您阻止sudo
具有权限的用户执行su
命令,因为任何具有sudo
权限的用户都可以从其默认目录复制su
然后执行它,一如既往,您不能授予用户完整的sudo
权限然后阻止他做具体的事情,因为他总会想办法绕过限制,你就得反其道而行之,给他一些特权。