“bash:!/bin/su”:未找到事件”

“bash:!/bin/su”:未找到事件”

我的脚本中有一行正在运行,但无法从命令行运行。

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

  1. su不赋予 root 特殊权力。因此阻止具有root权限的人使用它是没有意义的。
  2. 仅使用以下方式编辑sudo文件visudo:创建一个新sudo文件以扩充原始文件并将其放入/etc/sudoers.d/.
  3. 您需要转义!:"bla bla bla \! bla bla"'bla bla bla ! bla bla'.单引号将停止全部字符串的评估。

答案3

我相信这不会帮助您阻止sudo具有权限的用户执行su命令,因为任何具有sudo权限的用户都可以从其默认目录复制su然后执行它,一如既往,您不能授予用户完整的sudo权限然后阻止他做具体的事情,因为他总会想办法绕过限制,你就得反其道而行之,给他一些特权。

相关内容