一个朋友昨天在工作的时候不小心把/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/