覆盖文件时拒绝sed权限

时间:2012-10-12 01:09:48

标签: linux sed

我正在尝试使用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

有谁知道如何解决这个问题?

10 个答案:

答案 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将字符串分成两行
  • 您可以使用要生成的任何构造并将其通过管道传输到输入中(echo,printf等)

标准输入字符串:

%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)

您需要对要更改其文件的文件夹具有写入权限。

如此处所述:https://stackoverflow.com/a/36404569/5381704