我有一个每两天运行一次实用程序的脚本。这个实用程序在我的系统上做了一些事情。它是一款非常知名、广泛使用的开源软件。
#!/usr/bin/env bash
#...do stuff here
utility
有时(但并非总是)utility
需要我输入密码才能完成其任务。我没有看utility
run,也没有看任何输出1>/dev/null
。所以我希望任何尝试utility
都会sudo
自动失败。稍后我可以手动运行它并查看它需要超级用户访问权限来做什么。
问题是这不是我的脚本 sudoing,而是utility
.utility
定期更新,所以我不想编辑它。将 SUDO_ASKPASS 设置为无用的东西看起来很有希望,但它需要sudo
已使用-A
from进行了校准utility
。utility
手册页和在线文档也没有办法“阻止 sudo”,我也没有运气在谷歌上搜索“阻止系统范围的 sudo”。
我正在考虑使用这个fake-sudo-test.bash
:
#!/usr/bin/env bash
FAKE_SUDO="/usr/local/bin/sudo"
echo "echo 'no sudo for you $0' && exit 1" > $FAKE_SUDO
chmod u+x $FAKE_SUDO
sudo echo "I got superuser access"
\rm $FAKE_SUDO
这是有效的,因为我的 $PATH/usr/local/bin
前面有/usr/bin
.
你知道更好的方法吗?
PS: utility
是brew
,来自 macOS 的自制程序包管理器,我正在使用brew upgrade
有问题的。我认为让问题更通用会让它更有用。
$ sudo -V
Sudo version 1.8.17p1
Sudoers policy plugin version 1.8.17p1
Sudoers file grammar version 45
Sudoers I/O plugin version 1.8.17p1
答案1
在 Linux 上,您可以通过启用该标志来禁用 setuid 位对进程以及从该进程启动的所有其他进程的影响no_new_privs
(请参阅 参考资料prctl(2)
)。在 shell 脚本中,您可以使用包setpriv
中的实用程序来执行此操作util-linux
:
$ setpriv --no-new-privs sudo -v
sudo: effective uid is not 0, is /usr/bin/sudo on a file system with the 'nosuid' option set or an NFS file system without root privileges?
因此,只要您可以忍受上面嘈杂的错误消息,修改您的脚本以运行setpriv --no-new-privs utility
而不是应该可以完成这项工作。utility
(不幸的是,你提到了brew
,这可能在 macOS 上不起作用......但也许它仍然对其他人有帮助。)
答案2
如果它没有与终端关联,它就不能要求输入密码:
setsid brew < /dev/null &> /dev/null
或者,如果您想捕获其输出:
setsid brew < /dev/null |& cat
也就是说,假设你有setsid
,这显然可能无法在 MacOS 上使用。如果你想要但没有的话,这里有可用的实现。
如果你没有sedsid
但你有at
:
[ -e ~/brew_$$.log ] && rm ~/brew_$$.log
at now << eof
brew > ~/brew_$$.lo_ 2>& 1 || true
mv ~/brew_$$.lo_ ~/brew_$$.log
eof
while ! [ -e ~/brew_$$.log ]; do sleep 1; done
cat ~/brew_$$.log && rm ~/brew_$$.log
brew
将脱离终端运行now-ish,捕获输出并将其复制到脚本的输出流中。
答案3
把自己带出去
/etc/sudoers
。这将使所有 sudo 尝试失败。您可能需要注释掉这一行:
%sudo ALL=(ALL:ALL) ALL
确保您有其他获取 root 权限的方法(例如 root 密码),以便可以撤消此操作。
修改此行
/etc/sudoers
:Defaults env_reset
进入
Defaults env_reset,timestamp_timeout=-1
这使得 sudo 永远不会要求输入密码。 (来源。)
所有失败的 sudo 尝试都会记录到
/var/log/auth.log
.运行utility
,并在 中查找类似这样的行auth.log
:Jul 4 12:23:07 host sudo: test_perm : user NOT in sudoers ; TTY=pts/1 ; PWD=/home/nick ; USER=root ; COMMAND=/bin/echo
(这可能会记录到 macOS 上的其他地方;我不确定。)