自删除shell脚本

ccgok5k5  于 2022-11-16  发布在  Shell
关注(0)|答案(7)|浏览(278)

我四处寻找这个问题的答案,但没有找到。
我写了一个简单的脚本来初始化服务器设置,我想让它在完成时从根目录中删除/取消链接。我试过很多我在谷歌上搜索的解决方案(例如/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
balp4ylt

balp4ylt1#

rm -- "$0"

应该可以。$0是一个魔术变量,表示已执行脚本的完整路径。

mwkjh3gx

mwkjh3gx2#

这对我很有效:

#!/bin/sh

rm test.sh

也许您并不是真的想要在'$test.sh'中有'$'?

3qpi33ja

3qpi33ja3#

脚本退出时可以通过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
mrphzbgm

mrphzbgm4#

最简单的一个:

#!/path/to/rm

用法:./path/to/the/script/above
注意:/path/to/rm不能有空白字符。

8iwquhpp

8iwquhpp5#

我编写了一个小脚本,它基于
用户742030答案https://stackoverflow.com/a/34303677/10772577

function selfShred {
    SHREDDING_GRACE_SECONDS=${SHREDDING_GRACE_SECONDS:-5}
    if (( $SHREDDING_GRACE_SECONDS > 0 )); then
        echo -e "Shreding ${0} in $SHREDDING_GRACE_SECONDS seconds \e[1;31mCTRL-C TO KEEP FILE\e[0m"
        BOMB="●"
        FUZE='~'
        SPARK="\e[1;31m*\e[0m"
        SLEEP_LEFT=$SHREDDING_GRACE_SECONDS
        while (( $SLEEP_LEFT > 0 )); do
            LINE="$BOMB"
            for (( j=0; j < $SLEEP_LEFT - 1; j++ )); do
                LINE+="$FUZE"
            done
            LINE+="$SPARK"
            echo -en $LINE "\r"
            sleep 1
            (( SLEEP_LEFT-- ))
        done
    fi
    shred -u "${0}"
}

trap selfShred EXIT


请在此处查看存储库:https://github.com/reedHam/self-shred

9rygscc1

9rygscc16#

在某些情况下,$0可能不包含脚本的名称/路径。请检查以下内容:https://stackoverflow.com/a/35006505/5113030(* 在$0和BASH_SOURCE之间选择 *...)
在这些情况下,以下脚本应按预期工作:

  • source script.sh--脚本来源;
  • ./script.sh-交互执行;
  • /bin/bash -- script.sh-作为参数传递给shell程序。
#!/usr/bin/env bash

# ...

rm --  "$( readlink -f -- "${BASH_SOURCE[0]:-$0}" 2> '/dev/null'; )";

请检查以下有关shell脚本源代码阅读和执行的信息,因为在运行过程中删除脚本可能会影响行为:https://unix.stackexchange.com/a/121025/133353(* Linux如何处理shell脚本?...)
相关:https://stackoverflow.com/a/246128/5113030
如何从 *...获取Bash脚本的源目录)

eufgjt7s

eufgjt7s7#

为什么要删除脚本呢?正如其他人所提到的,这意味着你必须在其他地方保留一份副本。
建议使用类似“firstboot”的方法。只需在/etc/sysconfig中创建一个空文件,如果存在该文件,则触发此脚本的执行。然后在脚本结束时删除该文件。
修改脚本,使其具有必要的chkconfig头文件,并将其放在/etc/init.d/中,以便在每次 Boot 时运行。
这样,以后只需重新创建触发器脚本即可重新运行该脚本。
希望这对你有帮助。

相关问题