2009-08-01 13 views
6

¿Cómo hago para que el script se elimine después de que termine su trabajo?Cómo hacer que el script php se elimine (e incluye el directorio)

edición:

Es para mi script de instalación, lo quiero a borrarse a sí mismo por razones de seguridad (por lo que el atacante no será capaz de sobreescribir centro actual).

me olvidó mencionar que Tiene su 'incluye' directorio que me gustaría ser eliminado también ... Podría alguien añadir cómo eliminar también este dir? Incluye el directorio es el subdirectorio de la misma carpeta donde se encuentra el script de instalación.

+0

¿En qué SO estás trabajando? – Freddy

+6

En los sistemas Unix Like se puede eliminar el archivo de sí mismo, ya que básicamente la eliminación solo desvincula el archivo inode del directorio, cuando el programa deja de ejecutarse, el último desenlace (el programa mismo) se elimina y el inodo ya no tiene más enlaces (por lo que se elimina). En Windows, como los sistemas operativos, esto no se puede hacer, ya que la eliminación verifica si hay otros programas accediendo a ella (lo cual será) y no se puede eliminar a menos que tenga un hilo externo que será activado por el programa llamante. – Freddy

Respuesta

4

Probar unlink. El usuario del servidor web necesitará permisos de escritura para el directorio/script.

11

Puede utilizar unlink para eliminar un archivo, y __FILE__ para obtener la ruta completa del archivo actual:

unlink(__FILE__); 

Como "prueba":

[email protected]:~/developpement/tests/temp 
$ ll | grep 'remove-myself.php' 
-rw-r--r-- 1 squale squale  25 2009-08-01 17:01 remove-myself.php 

=> existe el archivo

[email protected]:~/developpement/tests/temp 
$ cat remove-myself.php 
<?php 

unlink(__FILE__); 

=> contiene el código di

[email protected]:~/developpement/tests/temp 
$ php ./remove-myself.php 

=> pongo en marcha el guión

[email protected]:~/developpement/tests/temp 
$ ll | grep 'remove-myself.php' 

=> No existe más


Para que esto funcione, usted tiene que asegurarse de que tiene las necesarias privilegies ... esto significa que el usuario que intenta eliminar el archivo debe tener acceso a la derecha en el directorio que lo contiene.

Cuando está en línea de comandos, generalmente está bien; pero si está intentando hacer esto a través de Apache, tendrá que dar acceso de escritura a Apache a ese directorio/archivo - Apache generalmente no tiene ese tipo de privilegio de manera predeterminada (no es seguro, y generalmente no es necesario)


No estoy seguro de que sería posible en las ventanas, aunque ... funciona en Linux, pero es posible que windows un poco "bloquear" el archivo cuando está siendo ejecutado ...

+0

Genial, lo probaré. Estoy en Linux y tengo que decir que evito los servidores de Windows, así que no te preocupes por Windows :) – Phil

1

unlink($_SERVER['SCRIPT_FILENAME']);
o
unlink(__FILE__);

3

Nota al margen de otras respuestas:

recomendaría cambiar el nombre del archivo, o poner una declaración de salida en el principio del archivo, la eliminación no es mi humilde opinión, una buena opción. El usuario puede querer leer su script de instalación o volver a ejecutarlo.Tal vez esto podría ser una solución mejor:

$contents = file_get_contents(__FILE__); 
file_put_contents(__FILE__, 
    "<?php # Remove this line and the next line to re-configure the application 
    die('The application has already been configured.'); ?>\n" . $contents 
); 

Se podría así cambiar el nombre a algo que el servidor web no pasará a los clientes, o incluso mejor, mover alguna parte del servidor web no tiene acceso a, o incluso ambos:

rename(__FILE__, '/tmp/' . basename(__FILE__) . '.bak'); 

no se olvide de mencionar el lugar el script de instalación se ha movido en el script de instalación, aunque ...

sobre el borrado de directorios: Esto se hace con rmdir(), el el directorio debe estar vacío, sin embargo. Mover carpetas es el mismo que con los archivos, la función se llama rename().

Cuestiones relacionadas