如何在linux中设置sed命令的临时文件目录?

我有这样修改文件的bash脚本

sed -i "/hello world/d" /etc/postfix/virtual 

我从web应用程序运行这个脚本。 sed命令在该目录中创build临时文件,但在其下运行的Web应用程序的用户无权在该目录中创build文件。 我不想给该文件夹的用户更多的权限。 是否有可能为sed命令指定临时文件位置?

我是在Linux新,所以很抱歉,如果我的问题太容易,但我没有find任何解决scheme。

谢谢!

Solutions Collecting From Web of "如何在linux中设置sed命令的临时文件目录?"

该文件必须通过临时文件进行修改,这实际上是sed在做什么,但它缺乏权限。

在处理这种情况时,我们只是手动完成这个过程。

 ## TEMP File TFILE=`mktemp --tmpdir tfile.XXXXX` trap "rm -f $TFILE" 0 1 2 3 15 ## sed 's_XXX_YYY_' /etc/example > "$TFILE" cat "$TFILE" > /etc/example ## trap Deletes TFILE on Exit 

您可以始终避免内联编辑:

 sed "/hello world/d" /etc/postfix/virtual > /tmp/_foo # mv /tmp/_foo /etc/postfix/virtual 

但是让我们告诫一个编辑/etc/postfix/virtual的web用户是相当危险的。

AFAIK,你不能配置sed。 所以,你必须用所需的权限运行你的命令。

  • 创建一个名为例如update-postfix(可以有参数)的脚本,并放入/ usr / local / bin

     #!/bin/bash sed -i "/$1/d" /etc/postfix/virtual 
  • 在/etc/sudoers.d/中创建一个文件(不管它的名字是什么,可以是update-postfix或者更通用的东西),用调用脚本的用户替换_user_

     _user_ ALL = (root) NOPASSWD: /usr/local/bin/update-postfix 

    它允许_user_root身份运行update-postfix(和ony这个命令)

  • 在脚本中,调用sudo update-postfix helloworld而不是sed命令。 update-postfix脚本被称为root用户。

注意:因此,你的脚本(update-postfix)有权做任何事情,所以要小心你的输入,并清理参数(我在这里没有做简单的事情)。

简单的自定义临时文件解决方案,类似于不想使用陷阱的@techzilla解决方案 –

 sed "/hello world/d" /etc/postfix/virtual > /tmp/temp_postfix_update && cat /tmp/temp_postfix_update > /etc/postfix/virtual && rm -f /tmp/temp_postfix_update 

根据@EdwinW的说法,使用cat管道输入不会删除文件,因此文件的写入权限仍然存在。