【问题标题】:Detecting if a command is executable by sudo检测命令是否可由 sudo 执行
【发布时间】:2013-05-31 03:16:08
【问题描述】:

我想在 shell 脚本中检测我要通过 sudo 运行的命令是否实际上可以通过 sudo 运行。在较新版本的 sudo 上,我可以执行 sudo -l "command",这正是我想要的结果。

但是,某些系统具有旧版本的 sudo,其中 -l "Command" 不可用。我正在考虑的另一种方法是尝试运行命令,然后查看 sudo 是否提示输入密码。但是,我没有看到一个简单的方法来做到这一点,因为 sudo 将密码提示写入 TTY 而不是通过 stdout。

还有其他人知道这样做的直接方法吗?

我还应该提到“期望”在具有较旧 sudo 修订版的系统上似乎也不可用。

仅供参考,sudo 的“困难”版本出现在 1.6.8 版

【问题讨论】:

    标签: shell sudo io-redirection


    【解决方案1】:

    如果您只想检查运行命令是否需要密码,那么您应该能够运行:

    $ sudo -n <command>
    

    例如

    $ sudo -n echo
    sudo: sorry, a password is required to run sudo
    

    【讨论】:

    • 不幸的是,-n 开关似乎只存在于支持 -l 开关的相同版本的 sudo 上。
    • 您的版本可以使用哪些标志?
    【解决方案2】:

    在 Linux 上,在(至少)类似 Debian 的系统上,您可以查看/etc/sudoers(以及可选的/etc/sudoers.d/* 文件,如果已创建并包含在主/etc/sudoers 中)其他)

    • 可以发出命令的搜索路径(哪个目录)
    • sudo 用户(root)权限
    • 可以使用 sudo 的组及其权限

    这是sudoers man page了解更多信息。

    【讨论】:

    • sudoers 文件默认显示为 root:root 或 root:wheel 110,因此您将无法读取它,除非您可以sudo cat/less/view 它。
    • 至少需要一个sudo cat /etc/sudoers 才能查看文件
    • 如果我只想手动查看 sudoers 文件,我可以手动发出 sudo -l 不带参数并解析通配符。但是,我需要以自动化的方式执行此操作。我只需要新版本在旧版本上具有的 sudo 的 -n 或 -l 功能。我猜它需要做一些事情,比如获取输出 sudo -l,将其写入文件,将 sudo 模式转换为正则表达式,然后运行我想要针对正则表达式执行的命令。然后我想要更多的工作,但可能没有办法解决它:/
    • 出于明显的安全原因,root 可以读取这些文件。如果您可以访问root一次...
    猜你喜欢
    • 2019-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-18
    • 2015-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多