由於朋友誤操作將/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”,就能恢復部分功能。個別文件會提示不存在,可能命名有改變,需要單獨處理。
