我正在尝试使用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
有谁知道如何解决这个问题?
答案 0 :(得分:5)
在原位编辑文件时,sed创建一个临时文件,保存结果,然后最终用该临时文件制作原始文件。
问题是您在sed试图创建临时文件的目录中没有写权限。
由于文件是/ tmp / file,因此请检查运行命令的目录的权限。
答案 1 :(得分:2)
好像您在/tmp
目录上有权限问题。 (如下所述,您在phpshell
中运行命令,因此TMP dir
可以设置在/tmp
以外的地方
应该看起来像:
$ ls -ld /tmp
drwxrwxrwx 333 root root 32768 12 oct. 03:13 /tmp/
<强>解释强>
使用sed
标记调用-i
时,sed
会在/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 +++
答案 2 :(得分:2)
这里真的没有很好的答案。对不起,如果线程已经死了,它出现在谷歌搜索中,并没有真正回答这个问题。虽然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
希望有所帮助!
答案 3 :(得分:2)
我想你可以&#34; sudo&#34;在你的命令面前。喜欢 sudo sed -i&#39; s / geteuid / getppid / g&#39;在/ usr / bin中/ VLC 它对我有用。
答案 4 :(得分:1)
如果对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
答案 5 :(得分:0)
鉴于您对存储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
尝试更改目录(您没有)写权限)。
答案 6 :(得分:0)
检查/tmp
文件夹权限
它应该具有以下权限
drwxrwxrwt 7 root root 4.0K Nov 16 15:06 tmp
如果您认为不合适,请运行以下命令
sudo chown root:root /tmp
sudo chmod 1777 /tmp
完成此操作后,然后在sudo
命令的前面放置sed
,以root用户身份执行命令。
这将解决问题
答案 7 :(得分:0)
简短回答:
$ chmod +w .
然后重新运行sed
。
长答案:
如上所述,问题出在您对.
(运行sed
的当前目录)没有写权限的事实。如果您在自己的计算机/驱动器上,则可以肯定地授予自己在此目录上写入的权限,这就是chmod
在此处执行的操作,除非出于某种原因想要对其进行保护。但是,如果您在网络驱动器上并且无法更改其权限,则应要求拥有该目录的驱动器执行此操作,或使用替代方法,例如将文件复制-修改-粘贴到其他位置。
答案 8 :(得分:0)
我认为有一个更简单的解决方案。您可以将文件打印到标准输出,然后在流上使用 sed
。之后,您只需将流重定向到同一个文件。显然,这是一个有风险的解决方案,因为如果您不能 100% 确定自己知道自己在做什么,则可能会丢失相关文件的全部内容。
cat index.php | sed 's@<head>@<head><script type="text/javascript" src="new.js"></script>@' > index.php
答案 9 :(得分:-1)
您需要对要更改其文件的文件夹具有写入权限。