【问题标题】:self-deleting shell script自删除shell脚本
【发布时间】:2012-01-24 01:53:10
【问题描述】:

我四处寻找这个问题的答案,但找不到。

我编写了一个简单的脚本来进行初始服务器设置,我希望它在完成时从根目录中删除/取消链接。我已经尝试了一些我在谷歌上搜索过的解决方案(例如 /bin/rm $test.sh),但脚本似乎总是保留在原处。这可能吗?以下是我目前的脚本。

#! /bin/bash
cd /root/
wget -r -nH -np --cut-dirs=1 http://myhost.com/install/scripts/
rm -f index.html* *.gif */index.html* */*.gif robots.txt
ls -al /root/

if [ -d /usr/local/psa ]
    then
        echo plesk > /root/bin/INST_SERVER_TYPE.txt
    chmod 775 /root/bin/*
    /root/bin/setting_server_ve.sh
    rm -rf /root/etc | rm -rf /root/bin | rm -rf /root/log | rm -rf /root/old
    sed -i "75s/false/true/" /etc/permissions/jail.conf
        exit 1;
elif [ -d /var/webmin ]
    then
    echo webmin > /root/bin/INST_SERVER_TYPE.txt
    chmod 775 /root/bin/*
    /root/bin/setting_server_ve.sh
    rm -rf /root/etc | rm -rf /root/bin | rm -rf /root/log | rm -rf /root/old
    sed -i "67s/false/true/" /etc/permissions/jail.conf
        break
    exit 1;
else
    echo no-gui > /root/bin/INST_SERVER_TYPE.txt
    chmod 775 /root/bin/*
    /root/bin/setting_server_ve.sh
    rm -rf /root/etc | rm -rf /root/bin | rm -rf /root/log | rm -rf /root/old
    sed -i "67s/false/true/" /etc/permissions/jail.conf
        break
    exit 1;
fi  

【问题讨论】:

  • 如果您要使用自删除脚本,则必须确保每次在测试之前都有备份副本。或者您可以将rm 替换为${RM:-/bin/rm} 进行测试。你的代码管道rm 输出到下一个rm 命令很奇怪; rm 既不从标准输入读取,除非它进行交互(它不会与 -rf),也不写入标准输出。重复很糟糕。而且我绝不希望你从我的机器上的/root 中删除东西。另外,检查cd /root/ 是否有效; cd /root/ || exit 1.
  • 嗨乔纳森。非常感谢您的反馈。正如你所知道的,我对这一切都很陌生。我在放置 rm test.sh 部分时犯了一个非常基本的错误,但现在它工作正常。还更正了 rm 命令。再次感谢!
  • 为什么要删除这个脚本?例如,如果它是你在远程主机上运行的一次性的东西,你可以运行ssh host < script.sh 而不用复制它。
  • @RFH:这不是这个特定问题的答案,但也许可以帮助您以不同的方式解决问题。如果您正在尝试管理一组服务器的配置,您可能需要查看合适的配置管理工具,例如 puppet (puppetlabs.com)、cfengine (cfengine.com)、salt (saltstack.com) 等。那些工具不仅可以进行初始设置,还可以保证之后的配置保持正确。

标签: bash shell


【解决方案1】:
rm -- "$0"

应该做的伎俩。 $0 是执行脚本的完整路径的魔术变量。

【讨论】:

  • bash下,好像是这样($0是脚本的路径); 'twas 并非总是如此(其他 shell,其他操作系统),甚至现在可能并非每个系统都如此。
  • 在 C 级别,没有什么可以阻止你做的:execl("/home/you/bin/script", "/usr/bin/turpentine", "-c", "pygmalion", (char *)0); 它给你一个与实际命令名称无关的argv[0],至少在传统的 Unix 中是这样。尽管bash 似乎提供了它用于定位脚本的实际路径,但这是 AFAIK 的设计决策,由 bash 决定,而不是 POSIX 指定的任何内容。按照惯例,在过去的几年中,在非 Linux 系统上,如果您在命令行上键入“脚本”,那么 argv[0](在脚本中也称为 $0)只是“脚本”。 AFAICT, POSIX 2008 没有改变规则。
  • 您不能依赖 $0 作为完整路径。如果您的脚本被调用为“sh script-name”,那么 $0 将完全是“script-name”。 (这是在pubs.opengroup.org/onlinepubs/9699919799/utilities/sh.html# 中指定的)
  • +1 表示可移植性问题 cmets。另外,使用更多报价:rm -- "$0"
  • 小心这个!如果路径中有空格,rm 将尝试删除直到第一个空格的路径,将该路径项的第一部分(直到第一个空格)视为文件名。最好将 $0 用引号括起来,例如 rm "$0"
【解决方案2】:

这对我有用:

#!/bin/sh

rm test.sh

也许您并不是真的要在“$test.sh”中包含“$”?

【讨论】:

    【解决方案3】:

    脚本可以在退出时通过shred command 删除自身(作为安全删除)。

    #!/bin/bash
    
    currentscript="$0"
    
    # Function that is called when the script exits:
    function finish {
        echo "Securely shredding ${currentscript}"; shred -u ${currentscript};
    }
    
    # Do your bashing here...
    
    # When your script is finished, exit with a call to the function, "finish":
    trap finish EXIT
    

    【讨论】:

      【解决方案4】:

      最简单的一个:

      #!/path/to/rm
      

      用法:./path/to/the/script/above

      注意:/path/to/rm 绝对不能有空白字符。

      【讨论】:

        【解决方案5】:

        为什么要删除脚本?正如其他人所提到的,这意味着您必须在其他地方保留一份副本。

        建议使用类似“firstboot”的方法。只需在例如创建一个空文件/etc/sysconfig 如果存在则触发此脚本的执行。然后在脚本末尾删除该文件。

        修改脚本,使其具有必要的 chkconfig 标头,并将其放在 /etc/init.d/ 中,以便在每次启动时运行。

        这样您就可以在稍后重新运行脚本,只需重新创建触发脚本即可。

        希望这会有所帮助。

        【讨论】:

        • 我通常不会拒绝,但当我这样做时,我会留下评论。所以这里是:你“回答”不是对所问问题的解决方案。通常,询问者为什么想做某事与您无关。质疑提问者的动机是多余的、令人恼火的和离题的。就像在这种特殊情况下一样:文件删除自身很少但有时至关重要,例如当您想运行卸载脚本时。在这种情况下,ziesemer 的回答是一个完美的解决方案。
        • @TranSonHai:对不起,如果你对这个答案感到恼火。但我真诚地相信,在许多情况下,这种方法对于面临类似问题的用户非常有用。
        • 我不知道您的方法可能有益的任何情况。我的理解是,当你想,说有一些东西自己卸载时,你不想留下任何痕迹。创建外部脚本来删除内容最终会导致一种矛盾的情况,您需要创建另一个外部脚本来删除该外部脚本,依此类推。那么,为什么不接受上面的人提供的简单、优雅的答案,不要让事情变得不必要的复杂呢?
        猜你喜欢
        • 2014-06-27
        • 1970-01-01
        • 2015-10-06
        • 2018-06-23
        • 2019-02-03
        • 2012-08-14
        • 1970-01-01
        • 1970-01-01
        • 2011-06-24
        相关资源
        最近更新 更多