首先我知道vim
不建议使用编写二进制可执行程序。所以,我不想在这里谈论它的合理性。
我有一个二进制程序,权限为 755(所有者是 root),所以作为用户root
,我希望我可以写入它。该程序未运行,使用命令lsof
和fuser
,没有输出返回,然后我使用 打开它vi
,然后键入:wq
仅写入并退出,然后vi
警告我E45: 'readonly' option is set (add ! to override)
。问题是谁设置的readonly
选项? Linux内核?
然后我添加一个!
,这是:wq!
现在,程序现在无法运行,这是预期的。
并且在具有相同操作系统和内核版本的另一台计算机上具有相同权限的相同文件。这次,我可以用 写入它:wq
,这里的神奇之处在于我可以在这台机器上运行该程序,尽管md5sum
给出了不同的结果。
系统是RHEL 6.4。vi
事实上是vim
。
编辑:按照@ctrl-alt-delor的建议添加一些命令输出。
[root@localhost x]# uname -r
2.6.32-431.29.2.2.ky3.1.x86_64
[root@localhost x]# whoami
root
[root@localhost x]# lsof XXX
[root@localhost x]# fuser XXX
[root@localhost x]# ls -l XXX
-rwxr-xr-x. 1 root root 5178556 Apr 19 13:27 XXX
[root@localhost x]# ls -la
total 5080
drwxr-xr-x. 5 root root 4096 Apr 21 19:23 .
drwxr-xr-x. 10 root root 4096 May 18 2018 ..
-rwxr-xr-x. 1 root root 5178556 Apr 19 13:27 XXX
drwxr-xr-x. 5 root root 4096 Apr 18 17:24 blabla
drwxr-xr-x. 2 root root 4096 Apr 15 18:59 blabla2
drwxr-xr-x. 8 root root 4096 Apr 22 10:36 blabla3
编辑:根据@Wildcard 的评论。
[root@localhost x]# getfacl XXX
# file: XXX
# owner: root
# group: root
user::rwx
group::r-x
other::r-x
[root@localhost x]# lsattr XXX
-------------e- XXX
编辑:添加 SELINUX 信息
[root@localhost x]# getenforce
Permissive
[root@localhost x]# cat /etc/selinux/config
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - No SELinux policy is loaded.
SELINUX=permissive
# SELINUXTYPE= can take one of these two values:
# targeted - Targeted processes are protected,
# mls - Multi Level Security protection.
SELINUXTYPE=targeted
[root@localhost x]# ls -Z XXX
-rwxr-xr-x. root root unconfined_u:object_r:usr_t:s0 XXX
答案1
奖励应该给予@Murray Jensen。
简而言之,答案就是~/.vimrc
有所作为。
在我无法保存的机器上:wq
:
[root@localhost x]# cat ~/.vimrc
set fileencodings=utf-8,gb18030,ucs-bom,cp936
vim
将检查utf-8有效性,如果发现非法字节,则设置该readonly
选项。它不会readonly
在二进制模式下设置该选项。
注释完这一行后,我现在可以保存文件了:wq
。