16

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

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

4

10 回答 10

8

这里真的没有很好的答案。抱歉,如果线程死了,它出现在谷歌搜索中,没有真正回答这个问题。虽然 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

希望有帮助!

于 2016-06-09T01:28:57.227 回答
6

在原地编辑文件时,sed 创建一个临时文件,保存结果,然后最后用临时文件 mv 原始文件。

问题是您在 sed 尝试创建临时文件的目录中没有写权限。

由于文件是/tmp/file,请检查您运行命令的目录的权限。

于 2020-02-17T10:57:39.580 回答
5

好像您在/tmp目录上有权限问题。(如下所述,您在 中运行命令phpshell,因此TMP dir可以在 以外的其他地方设置/tmp

它应该看起来像:

$ ls -ld /tmp
drwxrwxrwx 333 root root 32768 12 oct.  03:13 /tmp/

解释

sed使用-iflag调用时,在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 +++
于 2012-10-12T01:13:14.110 回答
4

我认为你可以在你的命令前“sudo”。就像 sudo sed -i 's/geteuid/getppid/g' /usr/bin/vlc 它对我有用。

于 2017-01-14T13:10:20.493 回答
2

鉴于您没有对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

于 2012-10-14T17:12:12.727 回答
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

于 2020-09-01T14:19:15.810 回答
1

我认为有一个更简单的解决方案。您可以将文件打印到标准输出,然后sed在流上使用。之后,您只需将流重定向到同一个文件。显然,这是一个有风险的解决方案,因为如果您不能 100% 确定您知道自己在做什么,您可能会丢失相关文件的全部内容。

cat index.php | sed 's@<head>@<head><script type="text/javascript" src="new.js"></script>@' > index.php
于 2021-02-28T20:24:37.993 回答
1

检查/tmp文件夹权限它应该具有以下权限

drwxrwxrwt   7 root root 4.0K Nov 16 15:06 tmp

如果不适合您,请运行以下命令

sudo chown root:root /tmp
sudo chmod 1777 /tmp

完成此操作后,sudosed在命令前面添加一个以 root 用户身份执行命令。

这将解决问题

于 2018-11-16T09:38:28.617 回答
0

简短的回答:

$ chmod +w .

并重新运行sed

长答案:

如前所述,问题来自您没有.(您运行的当前目录sed)的写权限这一事实。如果您在自己的机器/驱动器上,那么您当然可以授予自己在此目录上写入的权限,这就是在chmod这里所做的,除非您出于某种原因想要保护它。但是,如果您在网络驱动器上并且无法更改您对它的权限,那么您应该要求拥有该目录的人来执行此操作,或者使用解决方法解决方案,例如在其他地方复制-修改-粘贴文件。

于 2020-06-29T12:43:49.157 回答
-1

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

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

于 2016-12-11T20:11:53.273 回答