我正在尝试编写Meteor(JS Framework)的非交互式安装脚本,并提供sudo脚本的一部分提示。 我似乎无法通过它与我的脚本技能。
安装是: curl https://install.meteor.com | /bin/sh curl https://install.meteor.com | /bin/sh
在稍后的脚本中,它会提示inputSudo密码。 我想要这一步失败 。 然后,我可以在解决scheme中编写脚本。
注意:我不能将用户添加到sudoers文件,它运行在不允许我的用户提升访问权限的共享环境中。
这将用“sudo -n”(无引号)replacestring“sudo”(无引号)的任何实例:
curl https://install.meteor.com | sed 's/sudo/sudo -n/g' | /bin/sh
从sudo手册页 :
-n'-n(非交互式)选项可防止sudo提示用户input密码。 如果命令运行需要密码,sudo将显示一条错误消息并退出。
不过值得指出的是,这只有在你被提示input密码时才有效 。 换句话说,如果您最近运行了sudo,并且这些凭据允许您在15分钟内(默认)不input密码的情况下运行sudo,并在15分钟内运行该命令,则上述命令仍然可以成功运行sudo。 或者,如果您通常没有提示input密码,那也会导致成功。
要使最近input的sudo凭证创build的会话无效,请运行sudo -k 。 再次,从手册:
-k [命令]
单独使用时,“sudo”的-k(kill)选项会使用户的caching凭据无效。 下一次sudo运行密码将是必需的。 此选项不需要密码,并且已被添加以允许用户从.logout文件中撤销sudo权限。 并非所有的安全策略都支持凭证caching。
当与可能需要密码的命令或选项一起使用时,-k选项将导致sudo忽略用户的caching凭据。 因此,sudo会提示input密码(如果安全策略需要),并且不会更新用户的caching凭据。
如果这对您不起作用(例如,如果您的安全策略不会请求密码),则可以尝试:
curl https://install.meteor.com | sed 's/sudo/sudo \/bin\/false/g' | /bin/sh
如果程序sudo运行失败,sudo将会失败。 并从手册页中获取false :
退出时显示状态码表示失败。
…都是假的。
这意味着,而不是运行任何命令试图与sudo运行,而是运行/bin/false ,传递打算在sudo下运行的原始程序的名称作为第一个参数。
注意:如果您确实需要包含sudo呼叫的整个第一行失败,则这些解决scheme不会(必然)发生这种情况。 sudo调用本身将失败,但是如果它的参数是在一个子shell中创build的,或者在同一行上有前面的命令,那么这些命令将像往常一样工作。 所以,如果原来的命令是:
sudo exterminate "$(ls /humans)"
那会变成:
sudo /bin/false exterminate "$(ls /humans)"
而且ls /humans仍然会跑。 可能很明显,这可能无所谓,但以防万一,我想我会提到。
为什么在使用它之前不要修改脚本: curl https://install.meteor.com > /tmp/script ,在/ tmp / script中修改它,然后运行它/bin/sh /tmp/script
编辑:或者,如果密码被问,只需键入一个错误的密码三次,你将被拒绝