【问题标题】:Dry-run a potentially dangerous script?试运行一个有潜在危险的脚本?
【发布时间】:2016-04-25 03:30:42
【问题描述】:

我的前任在我继承的旧机器(运行 Linux)上安装了一个糟糕的软件。说这个糟糕的软件到处都安装了flotsam,而且非常臃肿,我希望尽快将其关闭——因为我们已经转向更好的软件,它不再具有任何功能用途。

供应商提供了一个卸载脚本。不相信这个糟糕的软件,我在编辑器中打开了卸载脚本(一个 200 多行的 Bash 怪物),它的开头是这样的:

SWROOT=`cat /etc/vendor/path.conf`
...
rm -rf $SWROOT/bin
...

原来/etc/vendor/path.conf 不见了。不知道为什么,不知道如何,但确实如此。如果我运行这个可爱的小脚本,它会删除/bin 文件夹,这会产生相当有趣的影响。当然这个脚本需要root 才能运行!

我已经通过手动运行所有合理的安装命令 (guh) 解决了这个问题。这很糟糕,因为我必须手动插入所有命令。一般来说,有没有某种方法可以让我“试运行”一个脚本,让它转储它执行的所有命令,而不实际执行它们?

【问题讨论】:

  • 不,bash 不提供任何试运行功能。
  • 制作例如一个 Python 脚本,使每一行 echo "line"。然后运行它。
  • 供应商应该被扇耳光
  • 听起来像是将您的机器克隆到虚拟机(请参阅 Virtualbox)并在那里运行以进行尝试的候选者。始终是试用可疑软件的好方法。
  • 擦除驱动器并开始全新安装。您有任何必要数据的备份,对吗? :)

标签: linux bash


【解决方案1】:

bash提供试运行功能kshzsh 或我知道的任何其他 shell 也不提供)。

在我看来,在 shell 中提供这样的功能几乎是不可能的:必须模拟状态更改并调用任何命令 - 无论是内置的或外部 - 必须了解这些模拟。

bashkshzsh 提供的最接近的功能是能够语法检查脚本而不执行它,通过选项-n

bash -n someScript  # syntax-check a script, without executing it.
  • 如果没有语法错误,则没有输出,退出码为0。
  • 如果存在语法错误,分析将在first错误处停止,将包含行号的错误消息写入stderr,退出代码为:
    • 2bash
    • 3ksh
    • 1zsh

bashkshzsh 分别提供调试选项

  • -v 打印每个原始源代码行[1] 在执行之前到 stderr。

  • -x 在执行前将每个扩展的简单命令打印到标准错误(环境变量PS4 允许调整输出格式)。


-n-v 和/或-x 结合使用并没有什么好处:

  • 在指定-n 的情况下,-x 根本没有任何效果,因为没有执行任何操作

  • 指定-n 后,-v 将有效地打印源代码。

    • 如果存在语法错误,可能将源代码打印到错误发生的地步会有好处;请记住,尽管由
      -n 生成的错误消息始终包含有问题的行号。

[1] 通常,打印的是单独的,但真正的单位是给定命令的多行 - 这可能是一个复合命令,例如while 或命令列表(例如管道) - 跨度。

【讨论】:

    【解决方案2】:

    您可以尝试在 Kornshell 下运行脚本。当您使用ksh -D 执行脚本时,它会读取命令并检查它们的语法,但不会执行它们。将其与set -xv 结合使用,您将打印出将要执行的命令。

    您也可以使用set -n 获得相同的效果。 Kornshell 和 BASH 彼此相当兼容。如果它是纯 Bourne shell 脚本,Kornshell 和 BASH 将几乎相同地执行它。

    您也可以运行ksh -u,这将导致未设置的shell 变量导致脚本失败。但是,这不会抓住不存在文件的无猫猫。在这种情况下,设置了 shell 变量。它被设置为 null。

    当然,您也可以在受限 shell 下运行脚本,但这可能不会卸载软件包。

    这可能是你能做的最好的了。

    【讨论】:

    • 哦,非常好!我从未使用过ksh,但现在是研究这个问题的好时机。
    • 实际上,研究 Kornshell 的好时机大约是 20 年前。 Kornshell 是第一个基于 Bourne shell 语法的 super shell。 Kornshell 88(如 1988 年)是第一个主要版本。 Kornshell 归 AT&T 所有,最初不是开源的(尽管免费提供)。然后,它在与 GPL 许可证不兼容的 CPL 许可证下成为开源,因此与 Linux 和 GNU 不兼容。 (不要让我开始谈论 许可证战争。)但是,有一些不错的 KSH 功能从未进入 BASH,而 dry-run 就是其中之一其中。
    • 虽然-D 暗示 -n,但它的用途不同。 bashzsh 也支持仅用于语法检查的 -n。将-x 添加到-n 根本没有任何好处,因为 - 按照设计 - 没有任何东西执行。添加-v 提供可能 提供有限 的好处:它将打印源代码直到出现语法错误(如果有) - 否则它实际上只是一个cat 的脚本。也就是说,-n 总是打印出有问题的行号。简而言之:没有空运行功能,只需要在不执行的情况下进行语法检查 - 无论是在 bashksh 还是 zsh
    猜你喜欢
    • 2011-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-09
    相关资源
    最近更新 更多