LoveUnix » 编程开发 & Rational » 求解这个shell程序
让LU留住您的每

一天 让LU博客留住您的每一天
2005-1-7 00:06 yhw
最近在学习linux程序设计,shell篇。有这样一个程序,说是检查特定用户登录情况,发出警告并传递至某文件的,如下:<br /><br />#&#33;/bin/sh <br /><br />until who | grep &quot;$1&quot; &gt; /dev/null <br />do<br /> sleep 60<br /> done <br /># now ring the bell and announce the expected user. <br /><br />echo  e \\a <br />echo &quot;**** $1 has just logged in ****&quot; <br /><br />exit 0<br /><br />这本书的每个脚本都会作出比较详细的解释,偏偏这个程序什么都没说,所以一头雾水,根本就看不懂。因此向高手请教,此程序是怎么回事呀?<br /><br />先给我解释一下第一条语句的意思吧!until who | grep &quot;$1&quot; &gt; /dev/null <br />who是什么东东,好象没学???

2005-1-7 11:26 seven
<!--QuoteBegin-yhw+2005-01-07 00:06:14--><div class='quotetop'>QUOTE(yhw @ 2005-01-07 00:06:14)</div><div class='quotemain'><!--QuoteEBegin-->最近在学习linux程序设计,shell篇。有这样一个程序,说是检查特定用户登录情况,发出警告并传递至某文件的,如下:<br /><br />#&#33;/bin/sh <br /><br />until who | grep &quot;$1&quot; &gt; /dev/null&nbsp; &nbsp; &nbsp; <span style='color:red'>//who显示当前登陆的用户,这里$1是shell脚本传进来的参数,也就是你要监控的那个用户,&gt;/dev/null 查询的结果重定向到/dev/null,不显示,再until循环里,只有当条件为真时,才推出该循环,这里who | grep &quot;$1&quot;是until的判断条件。</span><br />do<br /> sleep 60&nbsp; &nbsp; &nbsp; &nbsp;  <span style='color:red'>//为什么要sleep?记住如果要监控的用户一直没有登陆,那该shell就一直死循环再这里,sleep 60降低系统资源的消耗</span><br /> done <br /># now ring the bell and announce the expected user. <br /><br />echo&nbsp; e \\a&nbsp; &nbsp; &nbsp; <span style='color:red'>//监控到了该用户,响铃</span><br />echo &quot;**** $1 has just logged in ****&quot;&nbsp; &nbsp; &nbsp;  <span style='color:red'>//提示该用户已经loggin</span><br /><br />exit 0<br /><br />这本书的每个脚本都会作出比较详细的解释,偏偏这个程序什么都没说,所以一头雾水,根本就看不懂。因此向高手请教,此程序是怎么回事呀?<br /><br />先给我解释一下第一条语句的意思吧!until who | grep &quot;$1&quot; &gt; /dev/null <br />who是什么东东,好象没学???<br />[right][snapback]428031[/snapback][/right]<br /><!--QuoteEnd--></div><!--QuoteEEnd--><br />

2005-1-7 12:37 无双
<!--emo&:rose:--><img src='style_emoticons/default/rose.gif' border='0' style='vertical-align:middle' alt='rose.gif' /><!--endemo-->  <!--emo&:rose:--><img src='style_emoticons/default/rose.gif' border='0' style='vertical-align:middle' alt='rose.gif' /><!--endemo-->  <!--emo&:rose:--><img src='style_emoticons/default/rose.gif' border='0' style='vertical-align:middle' alt='rose.gif' /><!--endemo-->

2005-1-7 18:55 yhw
先谢谢seven朋友的指点,容转到linux系统再细看。<br />谢谢&#33;

2005-1-7 23:44 yhw
seven兄(M?):<br /><br />我很笨,还是没看得太懂,当然程序的逻辑还是马马虎虎地搞懂了,就是具体的细节。这当然得多调试。所以还要请教。<br /><br />我想做试验:<br />如果我想监控root用户(要是不行,就取yhw用户),这个程序应该怎么改,再怎样运行?<br /><br />我目前只知道把它改改属性,再./运行,但根本了解不到这程序的实用性。<br /><br />请指教,谢谢!

2005-1-10 09:55 seven
./脚本名 root<br /><br /><br />另:你还是没有好好看我给你的解释$1参数是怎么进来的???

2005-1-11 10:57 congrd
难得有象seven讲的如此详细的了<br />向seven 学习!!!

2005-1-11 22:58 yhw
<!--QuoteBegin-seven+2005-01-10 09:55:02--><div class='quotetop'>QUOTE(seven @ 2005-01-10 09:55:02)</div><div class='quotemain'><!--QuoteEBegin-->./脚本名 root<br />另:你还是没有好好看我给你的解释$1参数是怎么进来的???<br />[right][snapback]428707[/snapback][/right]<br /><!--QuoteEnd--></div><!--QuoteEEnd--><br />忏悔中。。。。。<br /><br />自责30杖,但如还有不明,只有认为是资质愚钝,不能再加指责  <!--emo&:(--><img src='style_emoticons/default/sad.gif' border='0' style='vertical-align:middle' alt='sad.gif' /><!--endemo-->

2005-1-12 00:44 yhw
我不请教seven一下,为什么监控成功后,导入到/dev/null的结果看不到?<br />我用more,是不是应用其它命令?<br />谢谢!

2005-1-12 09:56 seven
<!--QuoteBegin--><div class='quotetop'>QUOTE</div><div class='quotemain'><!--QuoteEBegin--><span style='color:red'>who | grep &quot;$1&quot; &gt; /dev/null&nbsp; //这里是做检索的过程输出重定向到/dev/null,/dev/null是一个特殊文件,你可以这里理解它,就是一个黑洞:),当你不想脚本的输出默认输出到stdout(系统标准输出,一般也就是主显示器),就可以重定向到/dev/null这里来!</span> <!--QuoteEnd--></div><!--QuoteEEnd--><br /><br />另:其实这个脚本是没有生成记录文件的的<br /><!--QuoteBegin--><div class='quotetop'>QUOTE</div><div class='quotemain'><!--QuoteEBegin-->echo&nbsp; e \\a&nbsp; &nbsp; &nbsp; <span style='color:red'>//监控到了该用户,响铃</span><br />echo &quot;**** $1 has just logged in ****&quot;&nbsp; &nbsp; &nbsp; <span style='color:red'>//看这里,仅仅是在标准输出上显示了下</span><!--QuoteEnd--></div><!--QuoteEEnd--><br /><br /><br />如果你要保存到记录文件同时还在标准输出上显示可以这样<br /><!--c1--><div class='codetop'>CODE</div><div class='codemain'><!--ec1--><br />echo &#34;**** $1 has just logged in ****&#34; | tee -a &nbsp;root_login_record &nbsp; &nbsp;//这里tee命令可以将标准输出重定向到文件和标准输出里,-a 表示文件内容追加,不覆盖<br /><br />如果效果更好点,你可以再在每天记录上加上时间,那样比较好点,用date命令的适当格式就可以,自己写吧!:)<br /><!--c2--></div><!--ec2--><br />

2005-1-12 18:29 yhw
只能说:太感谢了。百问不烦。<br />谢谢,再次感谢&#33;

2005-5-12 09:15 foruok
hehe,太让人感动了.

2005-5-12 21:35 zdygk
随便找本unix的书,学习一下unix的常用命令和shell reference吧~这更有好处。<!--emo&:D--><img src='style_emoticons/default/laugh.gif' border='0' style='vertical-align:middle' alt='laugh.gif' /><!--endemo-->

2005-6-8 09:25 tututu
如果我要纪录每一个用户登陆的时间及纪录其相应的loginout时间,该怎么做呢?

2005-8-8 22:34 chauney
顶下seven兄,解说实在漂亮<!--emo&^_^--><img src='style_emoticons/default/happy.gif' border='0' style='vertical-align:middle' alt='happy.gif' /><!--endemo-->

2005-10-13 14:26 xyj889q1
hi~~~

hi

页: [1]
查看完整版本: 求解这个shell程序


Powered by Discuz! Archiver 5.5.0  © 2001-2006 Comsenz Inc.