一个朋友昨天在工作的时候不小心把/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
该文档没有任何内容,该脚本似乎有问题吧

文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!