Разрешение sed запрещено при перезаписывании файла
Я пытаюсь использовать sed для перезаписи моего файла index.php, но я получаю сообщение об ошибке:
$ sed -i '[email protected]<head>@<head><script type="text/javascript" src="new.js"></script>@' index.php
sed: couldn't open temporary file ./sedmZNx8T: Permission denied
Кто-нибудь знает, как это исправить?
Ответы
Ответ 1
Похоже, у вас есть проблема с разрешением в директории /tmp
. (как описано ниже, вы запускаете команду в phpshell
, поэтому TMP dir
можно установить в другом месте, кроме /tmp
)
Он должен выглядеть так:
$ ls -ld /tmp
drwxrwxrwx 333 root root 32768 12 oct. 03:13 /tmp/
объяснения
При вызове sed
с флагом -i
sed
создайте временный файл в /tmp
dir.
Доказательство с strace
:
$ strace -f -e trace=file sed -i 's/a/z/' /tmp/a
execve("/bin/sed", ["sed", "-i", "s/a/z/", "/tmp/a"], [/* 94 vars */]) = 0
access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
(...)
open("/tmp/sedPSBTPG", O_RDWR|O_CREAT|O_EXCL, 0600) = 4
rename("/tmp/sedPSBTPG", "/tmp/a") = 0
+++ exited with 0 +++
Ответ 2
На самом деле здесь нет больших ответов. Извините, если поток мертв, он попал в поисковые запросы Google и ничего не ответил на вопрос. Хотя alendky ответ вроде такого же, как у меня... Там есть обходной путь... найти всемирный доступный для записи каталог, скажем /tmp
cp /etc/file_to_mod /tmp
sed -i -e 's/foo/bar/g' /tmp/file_to_mod
cat /tmp/file_to_mod >/etc_file_to_mod
Надеюсь, что это поможет!
Ответ 3
Учитывая, что у вас нет доступа на запись в каталог, где хранится index.php
, обычно у вас не будет доступа к index.php
...? Предполагая, что это "нестандартный" случай, и у вас есть доступ на запись, sed -i
пытается создать временный файл в том же каталоге, что и index.php
(только что отмечен, и это тот же каталог, а не CWD). Запустите sed
без -i
и завершите строку чем-то вроде > ~/sed.out
, чтобы записать результат в файл в вашем домашнем каталоге. Затем сделайте то, что вы сделаете с этим файлом.
sed '[email protected]<head>@<head><script type="text/javascript" src="new.js"></script>@' index.php > ~/sed.out
Помните, что вы, когда можете cp ~/sed.out index.php
, не можете mv ~/sed.out index.php
. Казалось бы, cp
помещает содержимое в index.php
(не изменяя каталог, в котором у вас нет прав на запись), а mv
пытается изменить каталог (с которым у вас нет прав на запись).
Ответ 4
У вас должны быть права на запись в папку, файл которой вы меняете.
Как описано здесь: fooobar.com/questions/35917/...
Ответ 5
Я думаю, вы можете "судиться" перед своей командой. подобно
sudo sed -i 's/geteuid/getppid/g'/usr/bin/vlc
Это сработало для меня.