我有一个场景,多个用户使用 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 替换它,否则你也无法做到......