在多用户情况下使用 SED 从文件中删除行

在多用户情况下使用 SED 从文件中删除行

我有一个场景,多个用户使用 SSH 连接到服务器。我有一个文件,所有用户都可以读取和写入。

该文件包含如下数字 -

14554
14887
23451
15135
15154
15165
1236
1516
15616
9821
98715

现在该文件由用户创建X,并且用户Y尝试执行以下命令,但出现错误:

sed -i '/14554/d' /tmp/file.txt
sed: cannot rename /tmp/sedtm3Vhx: Operation not permitted

文件权限如下 -

ls -l /tmp/file.txt
-rwxrwxrwx. 1 USERX USERX 63 Apr 25 11:58 /tmp/file.txt

但是如果用户Y打开该文件,则可以读取/写入该文件。我认为没有权限删除或重命名其他用户创建的文件。

是否有可能删除带有编号的此行14554,而无需删除或重命名文件。

笔记:Sed很好,因为当多个用户尝试读取或写入同一个文件时,它会给我原子访问权限。这是一个原因,我也不喜欢for在 bash 脚本中循环编辑此文件。

谢谢 !

答案1

Miguel 对粘贴位的看法是正确的。我在 中重现了您的问题/tmp/。不要从 中删除粘贴位/tmp。只需在 中再深入一层/tmp

    USERX$ mkdir /tmp/work
    USERX$ chmod a+rwx /tmp/work
    USERX$ echo "aaabbbcccddd" >/tmp/work/file
    USERX$ ls -l /tmp/workdir/file
    -rw-rw-r-- 1 USERX USERX 13 Apr 25 14:59 /tmp/workdir/file

    USERY$ echo "xxx" >/tmp/work/file
    bash: /tmp/workdir/file: Permission denied

这会失败,因为 '>' 尝试以 RW 访问权限打开文件并截断​​它,然后写入文本,但 USERY 对文件没有写入权限。但会sed起作用:

    USERY$ sed -i 's/a/x/g' /tmp/workdir/file
    USERY$ cat /tmp/workdir/file
    xxxbbbcccddd
    USERY$ ls -l /tmp/workdir/file
    -rw-rw-r-- 1 USERY USERY 13 Apr 25 14:59 /tmp/workdir/file

理解 Unix 文件/目录权限的好问题。

答案2

您对该文件具有 rwx 访问权限,这意味着您可以编辑其内容。但是,您尝试使用 sed 执行的操作是将内容存储到临时文件中,然后将文件 sedtm3Vhx.txt 重命名为 file.txt。您不会更改 file.txt 的内容,而是更改 file.txt 的目录条目以指向 sedtm3Vhx.txt 的内容,并且需要对父母文件夹。

另外,如果你使用的是 really /tmp(这不是示例),则需要处理特殊权限,因为/tmp/默认情况下

更新:关于粘贴和下面的评论。如果你在/tmp,我无法重现你的问题。这里:

tester@mypc:/tmp$ echo "hi" > text.txt
tester@mypc:/tmp$ chmod a+w text.txt 
tester@mypc:/tmp$ ls -l text.txt 
-rw-rw-rw- 1 tester tester 3 Apr 25 13:57 text.txt
tester@mypc:/tmp$ exit
miquel@mypc:/tmp$ echo bye > text.txt 
miquel@mypc:/tmp$ sed -i s/bye/hello/ text.txt 
miquel@mypc:/tmp$ ls -l text.txt 
-rw-rw-rw- 1 miquel miquel 6 Apr 25 13:58 text.txt
miquel@mypc:/tmp$ ls -ld /tmp
drwxrwxrwt 11 miquel miquel 3551232 Apr 25 13:58 /tmp

因此你可以更改文件中的内容用 sed 替换它,否则你也无法做到......

相关内容