当在服务器中执行 chmod 777 /xxx -R 命令后,会导致该目录下的大部分目录或文件的权限出现异常,进而导致服务器无法正常使用,接下来就分享下遇到此类情况后修复的方法,本文以修改 /etc目录下文件的权限为777时的情况作为案例修复;
一、现象
当在系统中执行命令 chmod 777 /etc -R 命令后,服务器可以正常重启、远程,但是登录时会提示密码不正确;
二、修复过程
1、创建一台与故障服务器系统相同的服务器;
2、在新建服务器中创建一个 .c文件,将其命名为 chmodfix.c,在该文件中输入如下内容;
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
#include <ftw.h>
int list(const char *name, const struct stat *status, int type)
{
if(type == FTW_NS)
return 0;
printf("%s 0%3on", name, status->st_mode & 07777);
return 0;
}
int main(int argc, char *argv[])
{
if(argc == 1)
ftw(".", list, 1);
else
ftw(argv[1], list, 2);
exit(0);
}
3、执行如下命令生成一个名为 chmodfix.com 的可执行文件;
gcc chmodfix.c -o chmodfix.com
4、在新建服务器上新建 .sh文件,将其命名为 chmodfix.sh,将如下内容写入该脚本文件;
#!/bin/sh
if [ $# != 1 ]
then
echo Usage : $0 <filename>
exit
fi
PERMFILE=$1
cat $PERMFILE | while read LINE
do
FILE=`echo $LINE | awk '{print $1}'`
PERM=`echo $LINE | awk '{print $2}'`
chmod $PERM $FILE
#echo "chmod $PERM $FILE"
done
echo "change perm finished! "
5、执行如下命令,从新建服务器中将你故障服务器中损坏的那个目录的正确权限获取出来,此案例中为 /etc 目录;
./chmodfix.com /etc >> chmodfix.txt
6、由于故障服务器目前可能已经登录不进去了,可以通过控制台的“救援模式”进入服务器,救援模式使用参考文档:
https://cloud.tencent.com/document/product/213/66678
7、进入救援模式后,将故障服务器的系统盘挂载到 /mnt 目录下;
mount /dev/vda1 /mnt/
8、执行chroot命令,将 /mnt 目录指定为root目录
chroot /mnt/
9、从新建服务器中,将 chmodfix.sh 和 chmodfix.txt 文件传输到故障服务器救援模式中某个目录下;
scp chmodfix.sh xx.xx.xx.xx:/mnt/data
scp chmodfix.txt xx.xx.xx.xx:/mnt/data
10、进入上面2个文件所在的目录,开始权限还原操作:
cd /mnt/data
bash chmodfix.sh chmodfix.txt
11、退出救援模式,操作参考步骤6中的文档;
12、测试服务器登陆。
参考文档:https://blog.csdn.net/weixin_34272308/article/details/93060916