2012-01-24 4 views
34

私はこれに対する答えを見回しましたが、見つけられませんでした。自己削除シェルスクリプト

初期のサーバー設定を行う簡単なスクリプトを作成しましたが、完了時にルートディレクトリから自身を削除/リンク解除したいと思います。私はgoogled(たとえば/ 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 
+2

自己削除スクリプトを使用する場合は、テストする前にバックアップコピーを必ず用意しておく必要があります。あるいは 'rm'を' $ {RM: -/bin/rm} 'に置き換えてテストすることもできます。 'rm'コマンドを次の' rm'コマンドに出力するコード配管はかなり奇妙です。 'rm'は、対話的に(' -rf'ではない)、標準出力に書き込まない限り、標準入力から読み込みません。繰り返しは悪いです。私のマシン上の '/ root'から削除する方法はありません。また、 'cd/root /'が動作することを確認してください。 'cd/root/||出口1 '。 –

+1

こんにちはジョナサン。あなたのフィードバックに感謝します。あなたが分かるように、私はこのすべてにかなり新しいです。私は本当にrm test.shの部分の配置で本当に基本的な間違いをしていたが、今は正常に動作します。また、rmコマンドを修正しました。再度、感謝します! – RFH

+2

なぜこのスクリプトを削除する必要がありますか?たとえば、リモートホスト上で実行することは一度だけの場合、 'ssh host l0b0

答えて

53
rm -- "$0" 

すべきことです。 $ 0は実行されたスクリプトのフルパスの魔法の変数です。

+2

'bash'の下では、そうであるようです(' $ 0'はスクリプトへのパスです)。 (他のシェル、他のオペレーティングシステム)、おそらく今のところすべてのシステムにそうではありません。 –

+0

私はそれがposixによって指定された印象を受けました、私は専門家ではないと言っていました。 BSD、linux、osx、solarisのほとんどでインタープリタとして '#!/ bin/sh'を使うスクリプトでは、' cd $(dirname $ 0) 'のようなkludgesをかなり乱暴に使って、しかし、私はすべてについて約束することはできません。ありがとう。 – richo

+0

ありがとう。これはうまくいった:) – RFH

15

これは私の作品:

#!/bin/sh 

rm test.sh 

たぶん、あなたは本当に '$のtest.sh' に '$' を持つことを意味するものではありませんでしたか?

+0

それは働いた!どうもありがとう。 – RFH

+6

うわー、あなたは本当にこれを試していないのですか? haha – justhalf

-2

なぜスクリプトを削除するのですか?他の人が言いましたように、あなたはコピーを別の場所に保管しなければならないということです。

"firstboot"のようなアプローチを使用することをお勧めします。たとえば、空のファイルを作成するだけです。このスクリプトの実行をトリガーする/ etc/sysconfig次に、スクリプトの最後にそのファイルを削除します。

必要なchkconfigヘッダーがあるようにスクリプトを変更して、/etc/init.d/に置き、起動するたびに実行されるようにします。

この方法で、後でトリガースクリプトを再作成するだけでスクリプトを再実行できます。

これが役に立ちます。

+17

私は通常親指ではなく、私がコメントを残しています。それで、ここにあります。あなたは「答えます」は何が求められているかに対する解決策ではありません。そして、一般に、あなたのビジネスのどれも、質問者が何かをしたいのではありません。質問者の動機に疑問を呈することは、冗長で、刺激的で、話題外です。この特定の場合と同じように、ファイル自体が削除されることはまれですが、重要な場合があります。アンインストールスクリプトを実行するときに使用します。 ziesemerの答えは、この場合の完璧な解決策です。 –

+1

@TranSonHai:あなたが答えに苛まれている場合は申し訳ありません。しかし、多くの場合、このアプローチは、同様の問題に直面しているユーザーにとって非常に有用であると正直に信じています。 – Bram

+4

あなたのアプローチが有益である場合は私は知らない。私が理解しておいてほしいのは、何か自分自身をアンインストールしたいと思ったら、後でトレースを残したいということです。外部スクリプトを作成して削除すると、その外部スクリプトを削除するための別の外部スクリプトを作成するなど、逆説的な状況に陥ります。 なぜ、上記の人々が提供したシンプルでエレガントな答えを受け入れ、不必要に複雑にすることをやめるのはなぜですか? –

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 
関連する問題