2012-01-24 16 views
34

Szukałem odpowiedzi na to, ale nie mogłem go znaleźć.self-usuwanie skryptu powłoki

Napisałem prosty skrypt, który wykonuje wstępne ustawienia serwera i chciałbym, aby usunął/odłączył się od katalogu głównego po zakończeniu. Próbowałem już wielu rozwiązań, z których googlowałem (na przykład/bin/rm $ test.sh), ale skrypt wydaje się zawsze działać. czy to możliwe? Poniżej znajduje się mój dotychczasowy scenariusz.

#! /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

Jeśli zamierzasz odtworzyć samopasujący skrypt, musisz upewnić się, że masz kopię zapasową za każdym razem, zanim ją przetestujesz. Lub możesz zamienić 'rm' na' $ {RM: -/bin/rm} 'na potrzeby testowania. Wyprowadzanie przez Ciebie kodu 'rm' do następnego polecenia' rm' jest dość dziwne; 'rm' nie czyta ze standardowego wejścia, chyba że przejdzie ono w interakcję (co nie będzie z' -rf'), ani nie zapisze na standardowe wyjście. Powtarzanie jest złe. I nie ma mowy, żebym chciał, żebyś usunął rzeczy z '/ root' na moich maszynach. Sprawdź także, czy 'cd/root /' działa; 'cd/root/|| zjazd 1'. –

+1

Cześć Jonathan. Wielkie dzięki za opinię. Jak możesz stwierdzić, jestem całkiem nowy w tym wszystkim. Robiłem naprawdę podstawowy błąd przy umieszczaniu części rm test.sh, ale teraz działa dobrze. Poprawiono również polecenie rm. Dzięki jeszcze raz! – RFH

+2

Dlaczego musisz usunąć ten skrypt? Na przykład, jeśli jest to jednorazowa operacja na zdalnych hostach, możesz uruchomić 'ssh host l0b0

Odpowiedz

53
rm -- "$0" 

Trzeba to załatwić. 0 USD to magiczna zmienna dla pełnej ścieżki wykonywanego skryptu.

+2

Pod 'bash', wydaje się, że tak jest (' $ 0' to ścieżka do skryptu); "nie zawsze tak (inne powłoki, inne systemy operacyjne) i prawdopodobnie nie jest tak w każdym systemie nawet teraz. –

+0

Miałem wrażenie, że zostało to określone przez Posixa, mówiąc, że nie jestem ekspertem. I (ab) używa kludges takich jak 'cd $ (dirname $ 0)' dość dziko w skryptach, które używają '#!/Bin/sh' jako interpretera w większości popularnych BSD, linux, osx i solaris i uciekają z ale nie mogę obiecać wszystkiego. – richo

+0

dzięki. to też zadziałało :) – RFH

15

Działa to dla mnie:

#!/bin/sh 

rm test.sh 

Może tak naprawdę nie znaczy mieć '$' w '$ test.sh'?

+0

zadziałało! Dziękuję bardzo. – RFH

+6

Wow, naprawdę tego nie próbowałeś? haha – justhalf

-2

Dlaczego usunąć skrypt w ogóle? Jak wspomnieli inni, oznacza to, że musisz zachować kopię w innym miejscu.

Sugerujemy użycie podejścia podobnego do "firstboot". Po prostu stwórz pusty plik np./etc/sysconfig, który uruchamia wykonanie skryptu, jeśli jest obecny. Następnie usuń ten plik na końcu skryptu.

Zmodyfikuj skrypt, tak aby zawierał niezbędne nagłówki chkconfig i umieść go w /etc/init.d/, aby był uruchamiany przy każdym rozruchu.

W ten sposób można ponownie uruchomić skrypt w późniejszym czasie, po prostu odtwarzając skrypt wyzwalacza.

Mam nadzieję, że to pomoże.

+17

Zazwyczaj nie kciam, ale kiedy to robię, zostawiam komentarz. Oto więc: "odpowiedź" nie jest rozwiązaniem tego, o co się pytamy. I generalnie to nie twoja firma, dlaczego pytający chce coś zrobić. Kwestionowanie motywu pytającego jest zbędne, irytujące i nietypowe. Jak w tym konkretnym przypadku: jest to rzadkie, ale czasami bardzo ważne, aby plik sam się usuwał, np. kiedy chcesz uruchomić skrypt odinstalowujący. Odpowiedź ziesemera jest idealnym rozwiązaniem w tym przypadku. –

+1

@TranSonHai: Przepraszam, jeśli irytuje cię odpowiedź. Ale szczerze wierzę, że w wielu przypadkach takie podejście jest bardzo przydatne dla użytkowników stojących przed podobnym problemem. – Bram

+4

Nie znam żadnych przypadków, w których Twoje podejście może być korzystne. Rozumiem, że jeśli chcesz, powiedz, że chcesz coś odinstalować, nie chcesz pozostawiać żadnych śladów. Tworzenie zewnętrznego skryptu do usuwania rzeczy prowadzi do paradoksalnej sytuacji, w której trzeba utworzyć inny zewnętrzny skrypt, aby usunąć ten zewnętrzny skrypt, i tak dalej. Dlaczego więc nie zaakceptować prostej, eleganckiej odpowiedzi, którą dostali ludzie powyżej, i przestać robić niepotrzebnie skomplikowane rzeczy? –

3

Skrypt może usunąć się poprzez shred command (jako bezpieczne usunięcie) po jego zakończeniu.

#!/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 
Powiązane problemy