Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2038874
  • 博文数量: 220
  • 博客积分: 8531
  • 博客等级: 中将
  • 技术积分: 4976
  • 用 户 组: 普通用户
  • 注册时间: 2007-07-18 13:33
文章分类

全部博文(220)

文章存档

2017年(1)

2015年(1)

2014年(5)

2013年(6)

2012年(6)

2011年(30)

2010年(37)

2009年(53)

2008年(41)

2007年(40)

分类: LINUX

2012-06-18 16:32:02

    很早之前(当时还DC4.1的时候)就听mlsx说在用户那边碰到用户chmod 777 -R /;chown root.root -R /之后系统无法启动,然后通过写脚本从另一台正常的机器上获得所有文件的权限和属主组,并在救援模式下将出问题的机器上所有文件设置正常。后来很长时间我都想:如何写这个脚本呢?如何将rwxrwxrwx转换成777或者交给chmod用呢?因为没有真实遇到这个问题,所以一直没有动手写这个脚本,也没有跟mlsx要这个脚本。
    这两天终于遇到了,一模一样的操作。解决起来却很简单,如果不想看之前相关技术,可以直接跳到文章末尾。
    上周和琦文去上地那边解决一个HA,周五让他们chmod 777 -R /;chown root.root  -R /给搞瘫痪了。本来我感觉系统都启动不了,不过现场是系统能启动(看来AX3已经比DC4.1健壮很多了),只是HA启动不了了。日志中有一些权限不够的提示,让他们将提示的一些文件对着正常的机器修改过来,不过还是不正常。
    今天早上看到邮件是drbd有问题,日志已经不报权限不足了。我想到之前mlsx说过在中组部遇到过类似的情况,他当时从另一台机器获得所有文件的属主组和权限,在这边设置上去就可以了。先在网上搜索了一下,发现有一个人提供了一个简单将rwxrwxrwx换算成777的脚本:

点击(此处)折叠或打开

  1. fan3838@fan3838-HP-425:~$ cat aa.sh
  2. #!/bin/ksh
  3. typeset aa=`ls -dl e1000*|awk '{print substr($1, 2)}'|sed 's/-/0/g'|sed 's/r/1/g'|sed 's/w/1/g'|sed 's/x/1/g'`
  4. typeset bb=$(echo "obase=8;ibase=2;$aa"|bc)

  5. echo $bb
    然后我修改了一下,基本可以实现,不过当有suid位的时候就会发生错误,取不出来。修改结果如下:

点击(此处)折叠或打开

  1. fan3838@fan3838-HP-425:~$ cat getmod.sh
  2. #!/bin/sh
  3. #by dffan@redflag-linux.com

  4. find /etc -ls |awk '{print $11"_G_"$3"_G_"$5"_G_"$6}'>/tmp/list.txt


  5. for i in `cat /tmp/list.txt`
  6. do
  7. file_name=`echo $i|awk -F_G_ '{print $1}'`
  8. mod8=`echo $i|awk -F_G_ '{print substr($2, 2)}'|sed 's/-/0/g'|sed 's/r/1/g'|sed 's/w/1/g'|sed 's/x/1/g'`
  9. mod=$(echo "obase=8;ibase=2;$mod8"|bc)
  10. own=`echo $i|awk -F_G_ '{print $3":"$4}'`

  11. echo "chmod $mod $file_name" >>changemod.sh
  12. echo "chown $own $file_name" >>changemod.sh
  13. chmod +x changemod.sh
  14. done
    再在网上一搜索,发现有人提供一个c脚本能正确实现获取权限位,suid都能正确获取:

点击(此处)折叠或打开

  1. fan3838@fan3838-HP-425:~$ cat get.c
  2. #include
  3. #include

  4. int list(const char *name, const struct stat *status, int type)
  5. {
  6. if(type == FTW_NS)
  7. return 0;

  8. printf("%s 0%3o\n", name, status->st_mode & 07777);
  9. return 0;
  10. }

  11. int main(int argc, char *argv[])
  12. {
  13. if(argc == 1)
  14. ftw(".", list, 1);
  15. else
  16. ftw(argv[1], list, 1);
  17. exit(0);
  18. }
    不过呢,光获取权限之外,还有属主组信息呢,这些信息还需要通过shell取出来,比较麻烦。
    再后来发现可以用getfacl和setfacl设置用户的属主组和权限,简单很多,只不过suid需要单独处理一下:

点击(此处)折叠或打开

  1. 在HA1正常机上执行
  2. getfacl / -R >/root/facl.txt
  3. find / -type f -perm -04000 >/root/file400.txt
  4. find / -type f -perm -02000 >/root/file200.txt

  5. 将HA1上/root下的 facl.txt, file400.txt, file200.txt三个文件拷贝到HA2的/root目录下
  6. 在HA2上执行
  7. cd /
  8. setfacl --restore=/root/facl.txt
  9. 在HA2上下载附件changemod.sh脚本到/root目录下
  10. cd /root
  11. dos2unix changemod.sh
  12. chmod +x changemod.sh
  13. ./changemod.sh

  14. 所有操作执行完毕之后,HA2将与HA1中文件的权限属主组完全相同。
  15. fan3838@fan3838-HP-425:~$ cat /tmp/changemod.sh
  16. #!/bin/bash
  17. for i in `cat /root/file400.txt`
  18. do
  19. chmod u+s $i
  20. done

  21. for j in `cat /root/file200.txt`
  22. do
  23. chmod g+s $i
  24. done
  25. chmod o+t /tmp /var/tmp







阅读(6460) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~