无法写入具有写权限的文件

无法写入具有写权限的文件

我有这个文件:

$ ls -lrta ~/.bash_profile
-rwxr-x---. 1 xxx xxx 904 May 23 15:36 /home/xxx/.bash_profile
$

我是该文件的所有者并且我有写权限。当我尝试编辑(例如删除最后一行)文件时出现错误,

$ sed -i '$ d' .bash_profile
sed: cannot rename ./sedxkZezg: Operation not permitted
$

使用 cat 追加文本可以成功写入文件。

$ cat >> .bash_profile
  writing
  ^D
$

我这样查看附加文本,

$ cat .bash_profile
... <some text> ...
writing
$

当我使用文本编辑器 (vi) 编辑文件时也会出现错误。

谁能解释为什么我有写权限却不能写文件?

以下是我正在使用的系统的一些信息:

$ uname -svr
Linux 2.6.32-279.el6.x86_64 #1 SMP Fri Jun 22 12:19:21 UTC 2012

更新:

这是我到目前为止所尝试过的:

$ sed -i '$ d' .bash_profile > file && mv file .bash_profile
sed: cannot rename ./sedm89Ym2: Operation not permitted

$ lsattr ~/.bash_profile
lsattr: Inappropriate ioctl for device While reading flags on /home/xxx/.bash_profile

$ getfact ~/.bash_profile
getfacl: Removing leading '/' from absolute path names
# file: xxx/xxx/.bash_profile
# owner: xxx
# group: xxx
user::rwx
group::r-x
other::---
$

答案1

这 '。'在权限输出的末尾ls表示有某种扩展数据。chattr(1)给出 ext 的属性列表?文件系统,lsattr(1)列出当前的文件系统。还要检查文件的 ACL ( getfacl(1))。安全策略(如 SELinux)也可以禁止对文件进行某些操作。

答案2

sed -i ... file

实际上做了类似的事情:

sed ... file > some-temp-file &&
  mv some-temp-file file

最后mv一个执行了rename.也就是说,sed -i不会就地编辑文件,而是将其替换为自身的修改副本。

这是被阻止的重命名。它不会因为权限问题而被阻止(你会得到一个没有权限错误消息(如果是),但看起来有一些管理限制,要么取消 ~/.bash_profile 的 inode 链接(如某些 SELinux 类型的强制访问控制),要么取消链接到该文件的路径(如某些 AppArmor 类型 MAC )。

您可能可以在日志中的某个位置找到更多线索。

getfattr -dm- ~/.bash_profile

将列出文件的所有扩展属性(ACL、安全上下文)。

lsattr ~/.bash_profile

了解更多潜在的 Linux 属性。

答案3

可能您没有父目录的写权限(这很奇怪,因为它是您的家)

无论如何,你能做到吗:

$ ls -la ~

相关内容