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)
-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还是会跑。可能很明显,这可能无关紧要,但以防万一,我想我会提到。