2012-01-24 24 views
34

Ho cercato una risposta a questa domanda ma non la trovo.script di auto-cancellazione della shell

Ho scritto un semplice script che esegue le impostazioni iniziali del server e mi piacerebbe rimuovere/disconnettersi dalla directory principale al completamento. Ho provato un certo numero di soluzioni su Google (ad esempio/bin/rm $ test.sh) ma lo script sembra sempre rimanere sul posto. È possibile? Di seguito è riportato il mio script finora.

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

Se stai per giocare con uno script di auto-eliminazione, devi assicurarti di avere una copia di backup da qualche parte ogni volta prima di testarla. Oppure puoi sostituire 'rm' con' $ {RM: -/bin/rm} 'per i test. Il tuo codice piping 'rm' restituisce nel prossimo comando' rm' è piuttosto strano; 'rm' non legge dallo standard input a meno che non diventi interattivo (che non con' -rf'), né scrive sullo standard output. La ripetizione è cattiva. E non voglio in nessun modo che tu rimuova roba da/root sulle mie macchine. Inoltre, controlla che 'cd/root /' funzioni; 'cd/root/|| uscita 1'. –

+1

Ciao Jonathan. Grazie mille per il tuo feedback. Come puoi dire, sono abbastanza nuovo in tutto questo. Stavo facendo un errore molto semplice con il posizionamento della parte rm test.sh ma ora funziona bene. Inoltre corretto il comando rm. Grazie ancora! – RFH

+2

Perché è necessario eliminare questo script? Ad esempio, se si tratta di una cosa singola che si esegue su host remoti, è possibile eseguire 'ssh host l0b0

risposta

53
rm -- "$0" 

Dovrebbe fare il trucco. $ 0 è una variabile magica per il percorso completo dello script eseguito.

+2

Sotto 'bash', sembra essere il caso (' $ 0' è il percorso dello script); "Non è sempre così (altre shell, altri sistemi operativi), e probabilmente non è così su ogni sistema nemmeno adesso. –

+0

Avevo l'impressione che fosse stato specificato da posix, nel dire che non sono un esperto. I (ab) uso kludges come 'cd $ (dirname $ 0)' piuttosto selvaggiamente negli script che usano '#!/Bin/sh' come interprete sulla maggior parte dei BSD mainstream, linux, osx e solaris e farla franca ma non posso fare promesse su tutto. – richo

+0

grazie. anche questo ha funzionato :) – RFH

15

questo funziona per me:

#!/bin/sh 

rm test.sh 

forse non hai realmente significa avere il '$' in '$ test.sh'?

+0

ha funzionato! grazie mille. – RFH

+6

wow, davvero non l'hai provato? haha – justhalf

-2

Perché rimuovere lo script? Come altri hanno menzionato significa che devi tenere una copia altrove.

Un suggerimento è di utilizzare un approccio "firstboot" come. Basta creare un file vuoto, ad es./etc/sysconfig che attiva l'esecuzione di questo script, se presente. Quindi rimuovere quel file alla fine dello script.

Modificare lo script in modo che abbia le intestazioni necessarie di chkconfig e posizionarlo in /etc/init.d/ in modo che venga eseguito ad ogni avvio.

In questo modo è possibile rieseguire lo script in un secondo momento semplicemente ricreando lo script di trigger.

Spero che questo aiuti.

+17

Di solito non eseguo il thumbdown, ma quando lo faccio, lascio un commento. Quindi eccolo: tu "rispondi" non è una soluzione a ciò che viene chiesto. E generalmente non sono affari tuoi perché il richiedente vuole fare qualcosa. Mettere in discussione il motivo del richiedente è ridondante, irritante e fuori tema. Come in questo caso particolare: è raro ma a volte cruciale per un file cancellarsi, ad es. quando si desidera eseguire uno script di disinstallazione. la risposta di ziesemer è una soluzione perfetta in questo caso. –

+1

@TranSonHai: Scusa se sei irritato dalla risposta. Ma credo onestamente che in molti casi questo approccio sia molto utile per gli utenti che affrontano un problema simile. – Bram

+4

Non so di casi in cui il tuo approccio potrebbe essere utile. La mia comprensione è che quando vuoi, diciamo di avere qualcosa che si disinstalla da solo, non vuoi lasciare tracce in seguito. La creazione di uno script esterno per eliminare le cose porta infine a una situazione paradossale in cui è necessario creare un altro script esterno per eliminare quello script esterno e così via. Quindi, perché non accettare la risposta semplice ed elegante che le persone di cui sopra hanno fornito e smettere di rendere le cose inutilmente complicate? –

3

Lo script può cancellare se stesso tramite shred command (come una cancellazione sicura) quando si chiude.

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