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

时间:2013-11-22 13:36:36

标签: linux bash sed

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

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

我从Web应用程序运行此脚本。 sed命令在该目录中创建临时文件,但Web应用程序工作的用户无权在该目录中创建文件。我不想为该文件夹的用户授予更多权限。是否可以为sed命令指定临时文件位置?

我是linux的新手,很抱歉,如果我的问题太容易了,但我找不到任何解决方案。

谢谢!

7 个答案:

答案 0 :(得分:5)

该文件必须通过临时文件进行修改,这实际上是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

答案 1 :(得分:1)

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

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

# mv /tmp/_foo /etc/postfix/virtual

但请注意,编辑/etc/postfix/virtual的网络用户风险很大。

答案 2 :(得分:1)

AFAIK,你不能为此配置sed。 因此,您必须使用所需的权限运行命令。

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

    $criteria->condition
  • 在/etc/sudoers.d/中创建一个文件(无论名称是什么,它可以是update-postfix或更通用的东西),将 _user _ 替换为调用脚本的文件:

    #!/bin/bash
    sed -i "/$1/d" /etc/postfix/virtual
    

    它允许 _user _ 以root身份运行update-postfix(以及此命令)

  • 在您的脚本中,调用_user_ ALL = (root) NOPASSWD: /usr/local/bin/update-postfix 而不是sed命令。 update-postfix脚本以root用户身份调用。

NB:这样调用,你的脚本(update-postfix)有权做任何事情,所以要小心你放入的内容,并清理参数(为简洁起见,我没有在这里做)。 /强>

答案 3 :(得分:1)

您可以使用moreutils中的“海绵”。

sed  "/hello world/d" /etc/postfix/virtual | sponge /etc/postfix/virtual

答案 4 :(得分:0)

简单的自定义临时文件解决方案,类似于@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管道输入不会删除文件,因此对文件的写入权限仍然存在。

答案 5 :(得分:0)

一个老问题,但是我很惊讶地发现没有人建议通过变量使用一些良好的RAM。这就是我最终要做的,根本不需要临时文件:

TEMP_SED=sed "/hello world/d" /etc/postfix/virtual
echo "$TEMP_SED" > /etc/postfix/virtual
unset $TEMP_SED

注意echo时变量周围的引号。 This is needed to preserve any newlines in the file.

答案 6 :(得分:0)

我找不到解决方案,但如果 /etc/postfix/virtual 是软链接并且您对底层有权限,请在底层执行 sed

$ cat  /etc/postfix/virtual
### :-)
hello world
$ ls -lda /etc/postfix/virtual /etc/postfix
dr-xr-xr-x. 2 root root 21 Apr 10 10:39 /etc/postfix
lrwxrwxrwx. 1 root root 27 Apr 10 10:39 /etc/postfix/virtual -> /home/user1/postfix/virtual
$ sed -i "/hello world/d" /etc/postfix/virtual
sed: couldn't open temporary file /etc/postfix/sedmVfrMC: Permission denied
$ sed -i "/hello world/d" /home/user1/postfix/virtual
$ cat  /etc/postfix/virtual
### :-)
$ ls -lda /etc/postfix/virtual /etc/postfix
dr-xr-xr-x. 2 root root 21 Apr 10 10:39 /etc/postfix
lrwxrwxrwx. 1 root root 27 Apr 10 10:39 /etc/postfix/virtual -> /home/user1/postfix/virtual
$