恢复/etc目录下文件和子目录权限

由于朋友误操作将/etc目录下的全部文件和子目录权限改变,导致系统故障,也无法远程登陆。为了让系统临时恢复登陆和有限度的可用,便于拷贝出重要文件,需要恢复原有权限。思路是:在另外一个同版本的系统中生成一个含有权限信息的文件列表,再用sed、awk等工具拼接成shell语句脚本,把这个脚本拷贝到被破坏的系统,执行一下,大部分功能就能恢复。待重要文件备份后还是需要重装系统,继续使用面临不可预估的风险,毕竟不可能两台服务器拥有的文件都相同。

### 操作系统: CentOS 7.7
### 进入临时文件目录
cd /tmp

### 设置输出语言为英文,避免语句拼接出现问题。
unset LANG

### 列出/etc目录下所有文件和文件夹创建列表文件etc.list,-o参数比-l参数少一项所属组的输出,-d会列出目录本身而非目录下的文件和文件夹
ls -o -d  `find /etc` > etc.list

### etc.list内容如下,共有8个字段(按空格分段),
#----1-----  -2 -3--  -4-- -5- -6 --7-- ----------8---------------
drwxr-xr-x.   2 root    24 Apr 10  2019 /etc/hp
-rw-r--r--.   1 root   930 Aug  2  2017 /etc/hp/hplip.conf
-rw-r--r--.   1 root  4849 Apr 11  2018 /etc/idmapd.conf
lrwxrwxrwx.   1 root    11 Dec 10  2018 /etc/init.d -> rc.d/init.d
-rw-r--r--.   1 root   327 Jan 20 15:37 /etc/init.post
-rw-r--r--.   1 root   511 Oct 31  2018 /etc/inittab
-rw-r--r--.   1 root   942 Jun  7  2013 /etc/inputrc
...省略...

### 备注:ubuntu的权限位比centos少一个,centos在第一字段的最后一位有个点,这在后面处理时,centos会多一个处理步骤,以便去掉这个点
#-----1---  -2 -3--  -4-- -5- -6 --7-- ----------8---------------------
drwxr-xr-x  64 root  2288 Feb 29 16:11 /etc
-rw-------   1 root     0 Jul 25  2018 /etc/.pwd.lock
drwxr-xr-x   2 root  4096 Feb 26 10:58 /etc/ImageMagick-6
-rw-r--r--   1 root   842 Sep 29  2018 /etc/ImageMagick-6/coder.xml
-rw-r--r--   1 root  1383 Sep 29  2018 /etc/ImageMagick-6/colors.xml
-rw-r--r--   1 root  3292 Sep 29  2018 /etc/ImageMagick-6/delegates.xml
...省略...

### 第一个字符代表的是文件类型  -普通文件,d目录文件,l链接文件,b设备文件,c字符设备文件,p管道文件
### /etc目录只存在3种文件: -普通文件,d目录文件,l链接文件
### 删除l开头的行(l开头代表链接文件,不需要改权限,这些记录留在列表文件中需要单独处理,会增加脚本复杂度,因此直接剔除)
sed -i '/^l/d' etc.list

### 删除2至7字段,只留下1字段(权限信息)和8字段(文件绝对路径),生成新列表文件etc.list2
awk '{print $1 " " $8}' etc.list > etc.list2
### etc.list2内容如下
drwxr-xr-x. /etc/hp
-rw-r--r--. /etc/hp/hplip.conf
-rw-r--r--. /etc/idmapd.conf
-rw-r--r--. /etc/init.post
-rw-r--r--. /etc/inittab
-rw-r--r--. /etc/inputrc
...省略...

### 在第七个字符后面加上,o=三个字符,代表other权限
sed -i -e 's/^......./&,o=/' etc.list2
### 此时etc.list2内容如下
drwxr-x,o=r-x. /etc/hp
-rw-r--,o=r--. /etc/hp/hplip.conf
-rw-r--,o=r--. /etc/idmapd.conf
-rw-r--,o=r--. /etc/init.post
-rw-r--,o=r--. /etc/inittab
-rw-r--,o=r--. /etc/inputrc
...省略...

### 在第四个字符后面加上,g=三个字符,代表group权限
sed -i -e 's/^..../&,g=/' etc.list2
### 此时etc.list2内容如下
drwx,g=r-x,o=r-x. /etc/hp
-rw-,g=r--,o=r--. /etc/hp/hplip.conf
-rw-,g=r--,o=r--. /etc/idmapd.conf
-rw-,g=r--,o=r--. /etc/init.post
-rw-,g=r--,o=r--. /etc/inittab
-rw-,g=r--,o=r--. /etc/inputrc
...省略...

### 替换第一个字符为chmod u=八个字符,组装成赋权语句
sed -i -e 's/^./chmod u=/g' etc.list2 
### 此时etc.list2内容如下
chmod u=rwx,g=r-x,o=r-x. /etc/hp
chmod u=rw-,g=r--,o=r--. /etc/hp/hplip.conf
chmod u=rw-,g=r--,o=r--. /etc/idmapd.conf
chmod u=rw-,g=r--,o=r--. /etc/init.post
chmod u=rw-,g=r--,o=r--. /etc/inittab
chmod u=rw-,g=r--,o=r--. /etc/inputrc
...省略...

### 现在的问题是,权限位中的-和.需要删除掉,这样语句才能正确执行。
### 可以将列表看作用空格分隔的三个字段,将第二个字段里的-和.删除,因此用下面两条语句依次删除第二字段里的-和.
awk '{gsub(/-/,"",$2);print $0}'  etc.list2 > etc.list3
awk '{gsub(/\./,"",$2);print $0}' etc.list3 > etc.list4

### 此时etc.list4内容如下,可以作为脚本执行了
chmod u=rwx,g=rx,o=rx /etc/hp
chmod u=rw,g=r,o=r /etc/hp/hplip.conf
chmod u=rw,g=r,o=r /etc/idmapd.conf
chmod u=rw,g=r,o=r /etc/init.post
chmod u=rw,g=r,o=r /etc/inittab
chmod u=rw,g=r,o=r /etc/inputrc
...省略...

将etc.list4拷贝到被破坏的服务器上,用root执行一次“sh etc.list4”,就能恢复部分功能。个别文件会提示不存在,可能命名有改变,需要单独处理。

posted @ 2020-03-17 17:53  会游泳的鱼·bytefish  阅读(1976)  评论(0编辑  收藏  举报