我有bash脚本修改了这样的文件
sed -i "/hello world/d" /etc/postfix/virtual
我从Web应用程序运行此脚本。 sed命令在该目录中创建临时文件,但Web应用程序工作的用户无权在该目录中创建文件。我不想为该文件夹的用户授予更多权限。是否可以为sed命令指定临时文件位置?
我是linux的新手,很抱歉,如果我的问题太容易了,但我找不到任何解决方案。
谢谢!
答案 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
$