【问题标题】:Correct way to use Linux commands in bash script在 bash 脚本中使用 Linux 命令的正确方法
【发布时间】:2018-11-07 19:45:17
【问题描述】:

就路径而言,在 bash 脚本中使用 Linux 命令的最佳和最正确的方法是什么?仅使用 ip addr show 是否正确,依赖于 shell 路径,还是我应该先找到命令的路径(如使用 whereis ipcommand -v ip),将输出分配给某个变量然后使用它?

【问题讨论】:

  • 这两个都使用PATH 来确定绝对路径,所以这是一个无用的中间步骤。
  • 我希望我有时间写一个详细的答案。悬崖笔记:使用简单的命令,不要担心$PATH。在变量中存储绝对命令路径是一种常见的反模式。 $PATH 是在用户的控制之下,所以如果设置不正确,那是他们自己的错。他们没有什么可以通过改变来利用的;毕竟,他们总是可以手动运行脚本的命令;或者只是编辑脚本然后运行它。如果您提升权限,您只需要小心$PATH。例如,您会看到 susudo 具有防止漏洞利用的保护措施。
  • 感谢您的评论,@JohnKugelman

标签: bash shell scripting


【解决方案1】:

就个人而言,我只是依赖 PATH 并调用“裸”命令。

如果您不信任用户的 PATH,可以将其重置为最小默认值:

PATH=$(/usr/bin/getconf PATH)

grep "$pattern" "$file"

【讨论】:

    【解决方案2】:

    我倾向于在路径顶部设置实用程序的路径,避免对 PATH 的任何依赖。一种潜在的攻击是在运行 bash 脚本之前设置 PATH。为每个实用程序设置路径很痛苦,但它可以防止这种攻击。

    如果您正在为多个环境创作,其中实用程序位于不同的位置,例如Debian和MacOS,我检查路径,例如

    [ -f /usr/bin/grep ] && GREP=/usr/bin/grep || GREP=/bin/grep
    

    【讨论】:

    • 您希望预防哪些攻击?
    • 如果您不信任 PATH,您可以简单地在脚本开始时将其设置为已知的良好值。比这种将命令名称存储在我经常看到的变量中的货物崇拜反模式要好。
    • 或者,不受信任的用户可以编辑您的脚本以使用他们选择的grep。如果有的话,这样做会更容易,因为只需更改一项作业。
    • @JohnKugelman 是的,将 PATH 设置在顶部是一种方法。攻击将是 PATH 在脚本之外以某种方式更改,并且通常做一件事的脚本可能会做一些完全不同的事情。
    猜你喜欢
    • 2015-09-03
    • 2015-10-10
    • 2013-10-18
    • 2018-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多