• 软件测试技术
  • 软件测试博客
  • 软件测试视频
  • 开源软件测试技术
  • 软件测试论坛
  • 软件测试沙龙
  • 软件测试资料下载
  • 软件测试杂志
  • 软件测试人才招聘
    暂时没有公告

字号: | 推荐给好友 上一篇 | 下一篇

/usr目录和文件owner被改后的解决方案(原创)

发布: 2007-6-08 22:43 | 作者: seanhe | 来源: | 查看: 19次 | 进入软件测试论坛讨论

领测软件测试网
一个朋友昨天在工作的时候不小心把/usr目录下的所有文件和子目录的owner用chown -R命令改成了他自己,机器立马就登录不进去了。万幸的是,他还有一个root的console没有关掉。根据上述的情况,写了一个脚本,现在与大家分享。脚本名:ckown

[code:1:7a7edddf48]#!/bin/sh
mkdir /tmp/recd  #在/tmp下建立临时目录recd以存放脚本产生的文件
fn=$1        #fn作为调用的参数,本文中即为/usr
tmpd=/tmp/recd
tmpf=${tmpd}/tmpfout #输出文本
err=${tmpd}/tmpferr #错误文本
cmd=${tmpd}/tmpfcmd #正确的文本
notfound=${tmpd}/tmpfnotfound #没找到的文本


if grep "^$fn " /var/sadm/install/contents  > $tmpf 2>&1 #察看文件名或者目录名是否存在/var/sadm/install/contents中
then
  ln=`wc -l  $tmpf  | awk '{ print $1}'` #确保没有重复的文件名
  if [ $ln = 1 ] 
  then 
     awk '{ print "chown",$5":"$6,$1 }' $tmpf >> $cmd #将找到的文件名写入文本,并且做好chown的格式
  else #有重复的一般都是联接以及目录
     echo "======$fn======="  >> $err
     cat $tmpf  >> $err
     echo  >> $err
#将重复的目录名写入文本
awk '$2=="d" {print "chown",$5":"$6,$1 }' $err >> $cmd
   fi
else 
   echo "$fn"  >> $notfound
fi 

echo $fn      
[/code:1:7a7edddf48]

只所以要将输出存入文本是为了安全,然后在仔细检查了tmpfcmd文件后
[code:1:7a7edddf48]/bin/sh tmpfcmd[/code:1:7a7edddf48]

这个脚本其实是利用了/var/sadm/install/contents文件的性质:所有系统安装文件都在该文件中留有记录。
当然,如果是/home目录被改了的话,这个脚本就帮不上忙了。

 C.Arthur 回复于:2003-12-04 18:41:06
精品啊

 nanaskylead 回复于:2003-12-04 20:34:06
嘿嘿,被偶像一夸,立马体重减轻了50%。。。。。。

 予默 回复于:2003-12-04 20:43:11
大侠

 nanaskylead 回复于:2003-12-05 08:06:02
被你们都夸的不好意思了,谁不知道iricyan和C.Arthur是CU的两面旗帜啊。

 beginner-bj 回复于:2003-12-05 08:51:00
各位大侠,
上面的脚本还有个小问题,就是没有做递归。

 朽木可雕 回复于:2003-12-05 09:17:28
走召弓虽

 sunmarmot 回复于:2003-12-05 09:33:47
[quote:ca0645ed54="nanaskylead"]被你们都夸的不好意思了,谁不知道iricyan和C.Arthur是CU的两面旗帜啊。[/quote:ca0645ed54]


iricyan也是偶的偶像呀!!好崇拜 :mrgreen:

 metor78 回复于:2003-12-05 09:36:06
不错!顶!

 beginner-bj 回复于:2003-12-05 09:41:41
MY GOD!
自己都不试试,就说好?

 nanaskylead 回复于:2003-12-05 09:53:44
sorry,漏了点东西,寒自己一个。。。。。。

[code:1:e26eba6651]find /usr -user xxx > /tmp/xxx
/tmp/ckown /tmp/xxx[/code:1:e26eba6651]

把所有被改过的文件写到/tmp/xxx中,然后对这个文件做操作。这样就递归了,:),上文中我说对整个/usr做操作是错的,我道歉。
郁闷,做的时候倒是很有条理,写出来的时候就忘了。

谢谢beginner-bj,你总是很仔细认真哦。

 beginner-bj 回复于:2003-12-05 10:41:40
[code:1:98249fceab]#!/bin/sh 
mkdir /tmp/recd  #在/tmp下建立临时目录recd以存放脚本产生的文件 
tmpd=/tmp/recd 
tmpf=${tmpd}/tmpfout #输出文本 
err=${tmpd}/tmpferr #错误文本 
cmd=${tmpd}/tmpfcmd #正确的文本 
notfound=${tmpd}/tmpfnotfound #没找到的文本 
find $1 > /tmp/xxx

for fn in `cat /tmp/xxx`
do
if grep "^$fn " /var/sadm/install/contents  > $tmpf 2>&1 #察看文件名或者目录名是否存在/var/sadm/install/contents中 
then 
  ln=`wc -l  $tmpf  | awk '{ print $1}'` #确保没有重复的文件名 
  if [ $ln = 1 ] 
  then 
     awk '{ print "chown",$5":"$6,$1 }' $tmpf >> $cmd #将找到的文件名写入文本,并且做好chown的格式 
  else #有重复的一般都是联接以及目录 
     echo "======$fn======="  >> $err 
     cat $tmpf  >> $err 
     echo  >> $err 
#将重复的目录名写入文本 
   awk '$2=="d" {print "chown",$5":"$6,$1 }' $err >> $cmd 
   fi 
else 
   echo "$fn"  >> $notfound 
fi 

echo $fn   
done[/code:1:98249fceab]

 brucewoo 回复于:2003-12-05 10:44:05
Solaris 5.8

01. find /usr -user root > /tmp/abc.txt
02. ckown /tmp/abc.txt
03. cat /tmp/recd/tmpfcmd
该文件没有任何内容,该脚本好像有问题吧

 beginner-bj 回复于:2003-12-05 10:45:58
find $1 > /tmp/xxx
改成
find $1  -user xxx > /tmp/xxx
比较好

 C.Arthur 回复于:2003-12-05 10:59:42
[quote:c690efa15b="beginner-bj"]find $1 > /tmp/xxx
改成
find $1  -user xxx > /tmp/xxx
比较好[/quote:c690efa15b]
果然是强者,没机器实验啊,郁闷

 brucewoo 回复于:2003-12-05 11:17:22
修改后的脚本好像可以了,不过执行速度很慢,
contents中记录数乘以/tmp/xxx文件中的
记录数值,数目很大,需要一定的时间

 nanaskylead 回复于:2003-12-05 11:26:20
cat /tmp/xxx |while read line
do
/tmp/ckown $line
done

当初因为要的急,我没在脚本里做循环。当初是这么做的,总算我回忆起来了,我这脑子。。。。。。
beginner-bj,brucewoo,对不起了。
谢谢beginner-bj给我做的修改,这样一来脚本更加健壮了。

 beginner-bj 回复于:2003-12-05 11:43:46
互相学习。你的思路很好,我又学到不少东西。:D

 czyf2001 回复于:2003-12-08 22:38:54
/sadm/这个目录是在哪里啊?谢谢!   tru 64 5.1b

 nanaskylead 回复于:2004-12-28 16:55:42
/var下面.我只在solaris6/8上试验过

 3x3eyes 回复于:2004-12-28 21:11:26
还记得我曾问过的那个关于在根目录下chmod -R xxx *后如何改回来的问题吗??
我觉得这个问题和你朋友的chown性质是一样的,解决方法也应该差不多,通过脚本使用循环对contents里的文件进行比较,觉得可以也写一个类似的.

 lightspeed 回复于:2004-12-29 02:15:29
[quote:56fea5542d="nanaskylead"]
一个朋友昨天在工作的时候不小心把/usr目录下的所有文件和子目录的owner用chown -R命令改成了他自己,机器立马就登录不进去了。万幸的是,他还有一个root的console没有关掉。根据上述的情况,写了一个脚本,现在与大家分享。脚本名:ckown[/quote:56fea5542d]

不用这么麻烦。

find /usr  -exec  pkgchk -f -p {} \;

当然, 此方法有一个限制,请自行查找。

 3x3eyes 回复于:2004-12-29 09:48:19
版主,如果换成我的问题呢:在/下把所有的文件权限都chmod -R xxx了后有没有这样的方法改回来啊???

 nanaskylead 回复于:2004-12-29 10:32:16
楼上的,你的问题基本是不可能解决的。/usr能救回来是因为我们对发生灾难之前的/usr状态在系统中有文件备案的,但/下的所有东西,除了/usr /var等系统目录之外,别的目录我们是无法知道当初的权限设置的,所以救不回来

 nanaskylead 回复于:2004-12-29 10:35:22
lightspeed:
我执行了你说的命令,但所有的返回都是warning,比如
WARNING: no information associated with pathname </usr/lib/sparcv9/libami.so.1>,找不到任何有用的信息,
而且速度非常慢,一分钟两到三个文件,(我在E450,2G Memory,2*440 MHz CPU上测的)
是不是有什么问题?

 3x3eyes 回复于:2004-12-29 11:35:59
多谢楼主,但是如果只是对/var 和/usr下的执行权限进行修复,应该可以了吧
还有楼主
 ln=`wc -l  $tmpf  | awk '{ print $1}'` #确保没有重复的文件名 
  if [ $ln = 1 ] 
这一段我有点不明白
 ln=`wc -l  $tmpf  | awk '{ print $1}'` 
应该是取得$tmpf这个文件有多少行,确保没有重复文件名是怎么实现的
还有 if [ $ln = 1 ] 
这个条件我看不懂,$ln得到的是$tmpf的行数,和1有什么关系?这里的1究竟应该看成一个数字还是一个字符,如果和数字比较的话用=号可以吗?好像是用-eq吧.反正这个1把我弄糊涂了
不好意思,正在学习shell中,很多东西知道一点却又模模糊糊,所以问的问题多些
麻烦楼主了

 lightspeed 回复于:2004-12-29 12:48:45
[quote:7830ba40b2="3x3eyes"]版主,如果换成我的问题呢:在/下把所有的文件权限都chmod -R xxx了后有没有这样的方法改回来啊???[/quote:7830ba40b2]

只要是 pkgadd 安装的文件都有办法。 但用 cp, tar, vi 等工具产生的文件就
没办法了, 除非你已保存了这些文件的属性。 

[quote:7830ba40b2="nanaskylead"]lightspeed:
我执行了你说的命令,但所有的返回都是warning,比如
WARNING: no information associated with pathname </usr/lib/sparcv9/libami.so.1>,找不到任何有用的信息,
而且速度非常慢,一分钟两?..........[/quote:7830ba40b2]

没有那么慢。 因为 pkgchk 会检查文件的所有属性并改正(mod, size, owner ..)
一般 1 ~ 3 秒一个文件。 我没有加 -l , 因此如没有错误,就无输出。你看到
的是用 Stream pkgage 格式安装的文件.  pkgchk 无法确定此格式文件
是否正确. 所以和有问题的文件报同样的错.

 3x3eyes 回复于:2004-12-30 10:07:12


延伸阅读

文章来源于领测软件测试网 https://www.ltesting.net/


关于领测软件测试网 | 领测软件测试网合作伙伴 | 广告服务 | 投稿指南 | 联系我们 | 网站地图 | 友情链接
版权所有(C) 2003-2010 TestAge(领测软件测试网)|领测国际科技(北京)有限公司|软件测试工程师培训网 All Rights Reserved
北京市海淀区中关村南大街9号北京理工科技大厦1402室 京ICP备2023014753号-2
技术支持和业务联系:info@testage.com.cn 电话:010-51297073

软件测试 | 领测国际ISTQBISTQB官网TMMiTMMi认证国际软件测试工程师认证领测软件测试网