如何绕过sudo

Mik*_*raf 2 bash sudo

我正在尝试编写Meteor(JS 框架)的非交互式安装脚本和部分脚本提示 sudo 。我似乎无法通过我的脚本技能来克服它。

安装是: curl https://install.meteor.com | /bin/sh

在脚本的稍后点,它会提示输入 Sudo 密码。 我希望这一步失败。然后我可以围绕分辨率编写脚本。

注意:我无法将用户添加到 sudoers 文件,它在不允许我的用户提升访问权限的共享环境中运行。

Par*_*hot 10

这将用“sudo -n”(无引号)替换字符串“sudo”(无引号)的任何实例:

curl https://install.meteor.com | sed 's/sudo/sudo -n/g' | /bin/sh
Run Code Online (Sandbox Code Playgroud)

sudo 联机帮助页

-n' -n(非交互式)选项可防止 sudo 提示用户输入密码。如果命令运行需要密码,sudo 将显示错误消息并退出。

但是,值得指出的是,这在系统提示您输入密码时才有效。换句话说,如果您最近运行了 sudo,并且这些凭据允许您在 15 分钟内(默认值)无需输入密码即可运行 sudo,并且您在 15 分钟内运行此命令,则上述命令仍将成功运行 sudo。或者,如果您通常从未被提示输入密码,那也将导致成功。

要使最近输入 sudo 凭据创建的会话无效,请运行sudo -k. 再次,从手册:

-k [命令]

单独使用时,sudo 的 -k(kill)选项会使用户的缓存凭据无效。下次运行 sudo 时将需要密码。此选项不需要密码,添加此选项是为了允许用户从 .logout 文件中撤销 sudo 权限。并非所有安全策略都支持凭据缓存。

当与可能需要密码的命令或选项结合使用时,-k 选项将导致 sudo 忽略用户的缓存凭据。因此,sudo 将提示输入密码(如果安全策略需要密码)并且不会更新用户的缓存凭据。

如果这对您不起作用(例如,如果您的安全策略不会要求输入密码),您可以尝试:

curl https://install.meteor.com | sed 's/sudo/sudo \/bin\/false/g' | /bin/sh
Run Code Online (Sandbox Code Playgroud)

如果程序 sudo 运行失败,则 sudo 将失败。从手册页中获取 false

以指示失败的状态代码退出。

...都是假的。

这意味着,它不会运行它试图用 sudo 运行的任何命令,而是将 run /bin/false,传递打算在其下运行的原始程序的名称sudo作为第一个参数。

注意:如果您确实希望包含 sudo 调用的整个第一失败,这些解决方案不会(必然)实现这一点。sudo 调用本身会失败,但如果它的参数是在子 shell 中创建的,或者在同一行上有以前的命令,这些将照常工作。因此,如果原始命令是:

sudo exterminate "$(ls /humans)"
Run Code Online (Sandbox Code Playgroud)

那将变成:

sudo /bin/false exterminate "$(ls /humans)"
Run Code Online (Sandbox Code Playgroud)

而且ls /humans还是会跑。可能很明显,这可能无关紧要,但以防万一,我想我会提到。