Разрешение 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 Это сработало для меня.