2012-01-24 104 views
34

我環顧四周尋找答案但找不到。自我刪除外殼腳本

我寫了一個簡單的腳本來完成初始服務器設置,我希望它在完成時從根目錄中刪除/取消鏈接。我嘗試了許多解決方案(例如/ 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: -/bin/rm}'替換'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'是腳本的路徑); '並非總是如此(其他shell,其他操作系統),甚至現在在每個系統上可能都不是這樣。 –

+0

我的印象是,它是由posix指定的,說我不是專家。(ab)在使用'#!/ bin/sh'作爲大多數主流BSD,linux,osx和solaris的解釋器的腳本中非常狂野地使用'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