kavin

Linux下报错E212: Can't open file for writing解决方法

kavin linux 2018-05-24 55263浏览 0

之前有朋友问我,在修改文件的时候提示报错E212: Can't open file for writing(如果你系统安装了中文语言包会提示“无法打开并写入文件”),奇怪的是我是用的root账号,改文件也有执行权限,为何不能修改呢!

下面我说下我的思路:当前root账户编辑/etc/ssh/sshd_config却提示没有权限修改,报错如上描述。既然是有权限又提示这个过肯定是这个文件被赋予了其他特殊的权限。我们首先要检查下该文件的完整权限。

通常我们使用这两个命令来检查文件的特殊权限:

getfacl
lsattr

执行getfscl结果如下:

root@94ip $ getfacl  /etc/ssh/sshd_config
getfacl: Removing leading '/' from absolute path names
# file: etc/ssh/sshd_config
# owner: root
# group: root
user::rw-
group::---
other::---

一般系统在执行lsattr这个命令的时候会提示-bash: lsattr: command not found 没有该命令,那就尝试安装下这个命令。

查找得知lsattrchattr属于安装包e2fsprogs,用yum安装下:

root@94ip $ yum install -y e2fsprogs
设置安装进程
解决依赖关系
--> 执行事务检查
---> Package e2fsprogs.x86_64 0:1.41.12-18.el6_5.1 will be 升级
---> Package e2fsprogs.x86_64 0:1.41.12-23.el6 will be an update
--> 处理依赖关系 libss = 1.41.12-23.el6,它被软件包 e2fsprogs-1.41.12-23.el6.x86_64 需要
... ...
更新完毕:
 e2fsprogs.x86_64 0:1.41.12-23.el6
作为依赖被升级:
 e2fsprogs-libs.x86_64 0:1.41.12-23.el6  libcom_err.x86_64 0:1.41.12-23.el6  libcom_err-devel.x86_64 0:1.41.12-23.el6
 libss.x86_64 0:1.41.12-23.el6

命令安装好了就使用lsattr来 检查下文件吧

root@94ip $ lsattr /etc/ssh/sshd_config

----i--------e- /etc/ssh/sshd_config

这里的i 表示immutable,在文件上启用这个属性时,我们不能更改、重命名或者删除这个文件。(这就是之所以会出现这个错误的原因)

这里的e 表示extent format,它表明该文件使用磁盘上的块的映射扩展。属于“正常”规则。

接下来我们用chattr命令删除这个不可修改的属性。

root@94ip $ chattr -i /etc/ssh/sshd_config
root@94ip $ lsattr /etc/ssh/sshd_config
-------------e- /etc/ssh/sshd_config
root@94ip $ vim /etc/ssh/sshd_config

这里显示我们现在可以修改并保存该文件,完成修改你也可以用这个命令恢复不可修改的属性:

chattr +i /etc/ssh/sshd_config

问题解决!

或许你也可以尝试下下面这个方法:(由于小弟很懒没有亲自测试这个方法是否可行,如可使用请回复下高速小弟!)

 保存文件时用  : w ! sudo tee %

tee 用于读取输入文件,同时保存

 %表示当前编辑文件

(不过这种方法有个要求就是当前编辑用户必须在 sudoers这个文件中,这也是执行sudo命令的要求)


继续浏览有关 Linux报错E212 的文章
发表评论