自我删除shell脚本

RFH*_*RFH 52 bash shell

我四处寻找这个问题的答案,却找不到答案.

我编写了一个简单的脚本来执行初始服务器设置,我希望它在完成时从根目录中删除/取消链接.我已经尝试了一些我用Google搜索的解决方案(例如/ 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  
Run Code Online (Sandbox Code Playgroud)

ric*_*cho 73

rm -- "$0"
Run Code Online (Sandbox Code Playgroud)

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

  • 你不能依赖$ 0作为完整路径.如果您的脚本被调用为"sh script-name",则$ 0将完全是"script-name".(这在http://pubs.opengroup.org/onlinepubs/9699919799/utilities/sh.html#中指定) (14认同)
  • 小心这个!如果路径中有空格,rm将尝试删除直到第一个空格的路径,将该路径项的第一部分(直到第一个空格)视为文件名.最好将$ 0包装在引号中,例如,rm"$ 0" (3认同)
  • 在`bash`下,似乎就是这种情况(`$ 0`是脚本的路径); '并不总是如此(其他外壳,其他操作系统),甚至现在可能并非如此. (2认同)
  • 在 C 级,没有什么可以阻止你做:`execl("/home/you/bin/script", "/usr/bin/turpentine", "-c", "pygmalion", (char *)0 );` 它给你一个与实际命令名称无关的 `argv[0]`,至少在传统的 Unix 中是这样。尽管`bash` 似乎提供了它用来定位脚本的实际路径,但AFAIK 是`bash` 的设计决定,而不是POSIX 指定的任何内容。按照惯例,过去几年在非 Linux 系统上,如果您在命令行中输入“script”,那么 `argv[0]`(在脚本中也称为 `$0`)只是“脚本”。AFAICT,POSIX 2008 没有改变规则。 (2认同)
  • +1可移植性问题评论.另外,使用更多行情:`rm - "$ 0"` (2认同)
  • 除了@WilliamPursell之外,“source script.sh”可能会将“$0”转换为shell名称(例如“bash”),因此最好使用“${BASH_SOURCE[0]}”代替。相关:/sf/answers/2450455381/ (2认同)

zie*_*mer 22

这对我有用:

#!/bin/sh

rm test.sh
Run Code Online (Sandbox Code Playgroud)

也许你真的不想在'$ test.sh'中加上'$'?


小智 7

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

#!/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
Run Code Online (Sandbox Code Playgroud)