我正在尝试使用 sed 覆盖我的 index.php 文件,但出现错误:
$ sed -i 's@<head>@<head><script type="text/javascript" src="new.js"></script>@' index.php
sed: couldn't open temporary file ./sedmZNx8T: Permission denied
有谁知道如何解决这一问题?
这里真的没有很好的答案。抱歉,如果线程死了,它出现在谷歌搜索中,没有真正回答这个问题。虽然 altendky 的回答和我的有点像......有一个解决方法......找到一个世界可写目录,比如 /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
希望有帮助!
在原地编辑文件时,sed 创建一个临时文件,保存结果,然后最后用临时文件 mv 原始文件。
问题是您在 sed 尝试创建临时文件的目录中没有写权限。
由于文件是/tmp/file,请检查您运行命令的目录的权限。
好像您在/tmp
目录上有权限问题。(如下所述,您在 中运行命令phpshell
,因此TMP dir
可以在 以外的其他地方设置/tmp
)
它应该看起来像:
$ ls -ld /tmp
drwxrwxrwx 333 root root 32768 12 oct. 03:13 /tmp/
解释
sed
使用-i
flag调用时,在dirsed
中创建一个临时文件。/tmp
证明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 +++
我认为你可以在你的命令前“sudo”。就像 sudo sed -i 's/geteuid/getppid/g' /usr/bin/vlc 它对我有用。
鉴于您没有对index.php
存储目录的写访问权限,那么通常您将无权访问index.php
...?假设这是一个“非标准”案例并且您确实具有写访问权限,sed -i
则尝试在与index.php
(刚刚检查过的,它是同一个目录,而不是 CWD)相同的目录中创建一个临时文件。sed
在没有运行的情况下运行并以将结果写入主目录中的文件之-i
类的方式结束该行。> ~/sed.out
然后对那个文件做你想做的事。
sed 's@<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
如果使用 sed 不是硬性要求,您可能可以使用高度忽略的命令ed
。
ed -s index.php <<< $'%s@<head>@<head><script type="text/javascript" src="new.js"></script>@\nwq'
<command> <<< '<my_input_string>'
构造将通过管道将“<my_input_string>”<command>
作为标准输入$'...'
构造将被解析为特殊字符。在这种情况下,\n
将字符串分成两行标准输入字符串:
%s@<head>@<head><script type="text/javascript" src="new.js"></script>@
wq
第一行是您的正则表达式搜索和替换为ed
. 第二行告诉ed
写入更改并退出。您可以从 vi 中识别这些命令。
来源:mrbluecoat.blogspot.com/2014/03/in-place-editing-right-way-hint-dont.html
我认为有一个更简单的解决方案。您可以将文件打印到标准输出,然后sed
在流上使用。之后,您只需将流重定向到同一个文件。显然,这是一个有风险的解决方案,因为如果您不能 100% 确定您知道自己在做什么,您可能会丢失相关文件的全部内容。
cat index.php | sed 's@<head>@<head><script type="text/javascript" src="new.js"></script>@' > index.php
检查/tmp
文件夹权限它应该具有以下权限
drwxrwxrwt 7 root root 4.0K Nov 16 15:06 tmp
如果不适合您,请运行以下命令
sudo chown root:root /tmp
sudo chmod 1777 /tmp
完成此操作后,sudo
请sed
在命令前面添加一个以 root 用户身份执行命令。
这将解决问题
简短的回答:
$ chmod +w .
并重新运行sed
。
长答案:
如前所述,问题来自您没有.
(您运行的当前目录sed
)的写权限这一事实。如果您在自己的机器/驱动器上,那么您当然可以授予自己在此目录上写入的权限,这就是在chmod
这里所做的,除非您出于某种原因想要保护它。但是,如果您在网络驱动器上并且无法更改您对它的权限,那么您应该要求拥有该目录的人来执行此操作,或者使用解决方法解决方案,例如在其他地方复制-修改-粘贴文件。
您需要对要更改其文件的文件夹具有写入权限。