Как заставить скрипт удалить себя после завершения работы?
редактировать:
Это для моего сценария установки, я хочу, чтобы он удалился по соображениям безопасности (так что злоумышленник не сможет перезаписать существующий сайт).
Я забыл упомянуть, что у него есть свой каталог «includes», который я тоже хотел бы удалить … Может ли кто-нибудь добавить, как удалить этот каталог? Включает каталог подкаталога в той же папке, где установлен скрипт установки.
Вы можете использовать unlink
для удаления файла и __FILE__
чтобы получить полный путь к текущему файлу:
unlink(__FILE__);
Как «доказательство»:
squale@shark:~/developpement/tests/temp $ ll | grep 'remove-myself.php' -rw-r--r-- 1 squale squale 25 2009-08-01 17:01 remove-myself.php
=> Файл существует
squale@shark:~/developpement/tests/temp $ cat remove-myself.php <?php unlink(__FILE__);
=> Он содержит код, который я дал
squale@shark:~/developpement/tests/temp $ php ./remove-myself.php
=> Я запускаю скрипт
squale@shark:~/developpement/tests/temp $ ll | grep 'remove-myself.php'
=> Он больше не существует
Чтобы это работало, вы должны быть уверены, что у вас есть необходимые привилегии … это означает, что пользователь, пытающийся удалить файл, должен иметь право доступа в каталоге, содержащем его.
Когда вы находитесь в командной строке, это вообще нормально; но если вы пытаетесь сделать это через Apache, вам нужно будет предоставить доступ к записи Apache в этот каталог / файл – Apache обычно не имеет такого рода привилегии по умолчанию (не защищен и вообще не нужен)
Не уверен, что это будет возможно в Windows, хотя … Это работает на Linux, но Windows может «заблокировать» файл, когда он выполняется …
Попробуйте отключить связь . Пользователю веб-сервера понадобятся права на запись для каталога / скрипта.
Замечание к другим ответам:
Я бы рекомендовал переименовать файл или поместить оператор exit в начало файла, удаление IMHO не является хорошим вариантом. Пользователь может захотеть прочитать ваш сценарий установки или повторно запустить его. Возможно, это может быть лучшим решением:
$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 );
Вы могли бы также переименовать его в нечто, что веб-сервер не будет передавать клиентам, или даже лучше, переместить его где-то, на котором веб-сервер не имеет доступа, или даже оба:
rename(__FILE__, '/tmp/' . basename(__FILE__) . '.bak');
Не забудьте указать место, в котором сценарий установки был перенесен в сценарий установки, хотя …
Об удалении каталогов: это делается с помощью rmdir()
, однако каталог должен быть пустым. Перемещение папок совпадает с файлами, функция называется rename()
.
unlink($_SERVER['SCRIPT_FILENAME']);
или
unlink(__FILE__);