2012-01-24 19 views
34

He buscado una respuesta a esta pregunta pero no he podido encontrarla.secuencia de comandos de shell autodetectable

He escrito una secuencia de comandos simple que hace la configuración inicial del servidor y me gustaría que se elimine/desvincule del directorio raíz al finalizar. He intentado una serie de soluciones que busqué en Google (por ejemplo,/bin/rm $ test.sh) pero el script siempre parece permanecer en su lugar. es posible? A continuación está mi script hasta ahora.

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

Si va a jugar con un script de eliminación automática, debe asegurarse de tener una copia de seguridad en algún lugar cada vez antes de probarlo. O puede reemplazar la 'rm' con' $ {RM: -/bin/rm} 'para probar. Las salidas de 'rm' de su código en el siguiente comando' rm' son bastante extrañas; 'rm' no lee de la entrada estándar a menos que sea interactivo (lo que no ocurre con' -rf'), ni escribe en la salida estándar. La repetición es mala. Y no hay forma de que quiera que elimines cosas de '/ root' en mis máquinas. Además, verifique que 'cd/root /' funcione; 'cd/root/|| salida 1'. –

+1

Hola Jonathan. Muchas gracias por sus comentarios. Como puedes ver, soy bastante nuevo en todo esto. Estaba cometiendo un error muy básico con la colocación de la pieza rm test.sh pero funciona bien ahora. También corrigió el comando rm. ¡Gracias de nuevo! – RFH

+2

¿Por qué necesita eliminar este script? Por ejemplo, si se ejecuta una sola vez en hosts remotos, puede ejecutar 'ssh host l0b0

Respuesta

53
rm -- "$0" 

Debe hacer el truco. $ 0 es una variable mágica para la ruta completa del script ejecutado.

+2

En 'bash', ese parece ser el caso (' $ 0' es la ruta al script); 'no siempre es así (otras conchas, otros sistemas operativos), y probablemente no lo sea en todos los sistemas, incluso ahora. –

+0

Tenía la impresión de que fue especificado por posix, al decir que no soy un experto. Yo (ab) utilizo kludges como 'cd $ (dirname $ 0)' bastante locamente en scripts que usan '#!/Bin/sh' como el intérprete en la mayoría de BSD, linux, osx y solaris y me salgo con la suya eso, pero no puedo hacer promesas sobre todo. – richo

+0

gracias. esto también funcionó :) – RFH

15

Esto funciona para mí:

#!/bin/sh 

rm test.sh 

Tal vez en realidad no significa tener el '$' en '$ test.sh'?

+0

funcionó! muchas gracias. – RFH

+6

guau, ¿realmente no has probado esto? haha – justhalf

-2

¿Por qué eliminar el script en absoluto? Como otros lo han mencionado, significa que debe guardar una copia en otro lugar.

Una sugerencia es utilizar un enfoque similar al "firstboot". Simplemente crea un archivo vacío, p./etc/sysconfig que desencadena la ejecución de este script si está presente. A continuación, elimine ese archivo al final del script.

Modifique la secuencia de comandos para que tenga los encabezados chkconfig necesarios y colóquela en /etc/init.d/ para que se ejecute en cada arranque.

De esta manera puede volver a ejecutar el script más adelante simplemente recreando el script de activación.

Espero que esto ayude.

+17

Normalmente no pulgar hacia abajo, pero cuando lo hago, dejo un comentario. Así que aquí está: tu "respuesta" no es una solución a lo que se te pide. Y, en general, no es asunto tuyo por qué el asker quiere hacer algo. Cuestionar el motivo del asker es redundante, irritante y fuera de tema. Como en este caso particular: es raro, pero a veces es crucial que un archivo se elimine solo, p. cuando desee ejecutar un script de desinstalación. La respuesta de ziesemer es una solución perfecta en este caso. –

+1

@TranSonHai: Lo siento si te irrita la respuesta. Pero honestamente creo que en muchos casos este enfoque es muy útil para los usuarios que enfrentan un problema similar. – Bram

+4

No conozco ningún caso en el que su enfoque sea beneficioso. Según tengo entendido, cuando quieras, digamos que tienes algo para desinstalar, no querrás dejar rastros después. La creación de una secuencia de comandos externa para eliminar cosas finalmente conduce a una situación paradójica en la que necesita crear otra secuencia de comandos externa para eliminar la secuencia de comandos externa, y así sucesivamente. Entonces, ¿por qué no aceptar la respuesta simple y elegante que las personas de arriba han proporcionado y dejar de hacer las cosas innecesariamente complicadas? –

3

La secuencia de comandos puede eliminarse a través del shred command (como una eliminación segura) cuando se cierra.

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