I am trying to use sed to overwrite my index.php file, but I am getting an error:
$ sed -i 's@<head>@<head><script type="text/javascript" src="new.js"></script>@' index.php
sed: couldn't open temporary file ./sedmZNx8T: Permission denied
Does anyone know how to fix this?
Really no great answers here. Sorry if thread is dead, it came up in google searches and nothing really answered the question. Although altendky's answer is sort of the same as mine... There IS a workaround...find a world writable directory, say /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
Hope that helps!
While editing a file in place, sed creates a temporary file, saves the result and then finally mv the original file with the temporary one.
The problem is that you don't have write permission in the directory where sed is trying to create the temp file.
As the file is /tmp/file, check the permission of the directory where you are running the command.
Seems like you have a permission issue on the /tmp
dir. (as discussed bellow, you run command in phpshell
, so TMP dir
can be setted elsewhere than /tmp
)
It should looks like :
$ ls -ld /tmp
drwxrwxrwx 333 root root 32768 12 oct. 03:13 /tmp/
explanations
When invoking sed
with -i
flag, sed
create a temporary file in /tmp
dir.
Proof with 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 +++
I think you can you "sudo" in front of your command. Like sudo sed -i 's/geteuid/getppid/g' /usr/bin/vlc It worked for me.
Given that you do not have write access to the directory where index.php
is stored, then generally you would not have access to index.php
...? Assuming this is a 'non-standard' case and you do have write access, sed -i
is trying to create a temp file in the same directory as index.php
(just checked and it is the same directory, not the CWD). Run sed
without -i
and end the line with something like > ~/sed.out
to write the result into a file in your home directory. Then do what you will with that file.
sed 's@<head>@<head><script type="text/javascript" src="new.js"></script>@' index.php > ~/sed.out
Be aware that you while you can cp ~/sed.out index.php
you can not mv ~/sed.out index.php
. It would seem that cp
will put the contents into index.php
(not modifying the directory you do not have write permissions to) while mv
tries to change the directory (that you don't have write permissions to).
check for the /tmp
folder permission
It should have the following permission
drwxrwxrwt 7 root root 4.0K Nov 16 15:06 tmp
If it is not ok for you then run the following commands
sudo chown root:root /tmp
sudo chmod 1777 /tmp
once this is done, then put a sudo
infront of your sed
command to execute the command as a root user.
This will solve the issue
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With