干涸一个有潜在危险的剧本?

时间:2014-04-09 04:44:24

标签: linux bash

我的前任在我继承的旧机器(运行Linux)上安装了一个糟糕的软件。这个蹩脚的软件安装了整个地方的flotsam,并且还充分膨胀,我希望它尽快消失 - 它已经不再有任何功能目的,因为我们已经转向更好的软件。

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

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

事实证明/etc/vendor/path.conf缺失。不知道为什么,不知道怎么样,但确实如此。如果我运行了这个可爱的小脚本,它就会删除/bin文件夹,这会产生相当有趣的含义。当然这个脚本需要运行root

我通过手动运行所有安装命令(guh)来处理这个问题。这种情况很糟糕,因为我不得不手动插入所有命令。一般来说,是否有某种方法可以“干运”一个脚本,让它转储出 执行的所有命令,而不是实际执行它们?

2 个答案:

答案 0 :(得分:8)

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

您也可以使用set -n获得相同的效果。 Kornshell和BASH相互兼容。如果它是一个纯粹的Bourne shell脚本,Kornshell和BASH都会执行它几乎相同。

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

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

这是你可能做的最好的事情。

答案 1 :(得分:4)

bash 提供干运行功能kshzsh或任何其他shell都不是知道)。

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

bashkshzsh提供的最接近的内容是 语法检查脚本的能力执行它,通过选项-n

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

另外,bashkshzsh提供调试选项

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

  • -x在执行之前将每个扩展的简单命令打印到stderr(env.var。PS4允许调整输出格式)。

-n-v和/或-x相结合几乎没有任何好处:

  • 如果指定-n,则-x完全没有效果,因为已执行

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

    • 如果存在语法错误,则可能在源代码中受益,直到发生错误;请记住,虽然这是由。产生的错误信息 -n始终包含有问题的行号。

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