system.html

来自「BASH Shell 编程 经典教程 《高级SHELL脚本编程》中文版」· HTML 代码 · 共 4,056 行 · 第 1/5 页

HTML
4,056
字号
CLASS="TIP"WIDTH="90%"BORDER="0"><TR><TDWIDTH="25"ALIGN="CENTER"VALIGN="TOP"><IMGSRC="./images/tip.gif"HSPACE="5"ALT="Tip"></TD><TDALIGN="LEFT"VALIGN="TOP"><P>当你正在编写文本文件的时候, 在文本中间突然来了一个莫名其妙的消息, 				  你会觉得非常烦人. 在多用户的网络环境下, 如果你不想被打断, 				那么你必须关闭其他用户对你终端的写权限. 	      </P></TD></TR></TABLE></DIV></DD><DT><ANAME="WALLREF"></A><BCLASS="COMMAND">wall</B></DT><DD><P>这是一个缩写单词<SPANCLASS="QUOTE">"<AHREF="communications.html#WRITEREF">write</A> all"</SPAN>, 			 也就是, 向登录到网络上的所有终端的所有用户都发送一个消息. 			 最早这是一个管理员的工具, 很有用, 比如, 			 当系统有问题的时候, 			 管理可以警告系统上的所有人暂时离开(请参考<AHREF="here-docs.html#EX70">例子 17-1</A>). 			 </P><P>	      <TABLEBORDER="1"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="SCREEN"><SAMPCLASS="PROMPT">bash$ </SAMP><KBDCLASS="USERINPUT">wall System going down for maintenance in 5 minutes!</KBD><SAMPCLASS="COMPUTEROUTPUT">Broadcast message from bozo (pts/1) Sun Jul  8 13:53:27 2001... System going down for maintenance in 5 minutes!</SAMP>	      </PRE></FONT></TD></TR></TABLE>	    </P><DIVCLASS="NOTE"><P></P><TABLECLASS="NOTE"WIDTH="90%"BORDER="0"><TR><TDWIDTH="25"ALIGN="CENTER"VALIGN="TOP"><IMGSRC="./images/note.gif"HSPACE="5"ALT="Note"></TD><TDALIGN="LEFT"VALIGN="TOP"><P>如果某个特定终端使用<BCLASS="COMMAND">mesg</B>来禁止了写权限, 				那么<BCLASS="COMMAND">wall</B>将不会给它发消息. 	      </P></TD></TR></TABLE></DIV></DD></DL></DIV><P></P><DIVCLASS="VARIABLELIST"><P><B><ANAME="STATISTICSSYS1"></A>信息与统计类</B></P><DL><DT><BCLASS="COMMAND">uname</B></DT><DD><P>显示系统信息(OS, 内核版本, 等等.) ,输出到<TTCLASS="FILENAME">stdout</TT>上. 			  使用<CODECLASS="OPTION">-a</CODE>选项, 将会给出详细的系统信息(请参考<AHREF="moreadv.html#EX41">例子 12-5</A>). 				  使用<CODECLASS="OPTION">-s</CODE>选项只会输出OS类型. </P><TABLEBORDER="1"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="SCREEN"><SAMPCLASS="PROMPT">bash$ </SAMP><KBDCLASS="USERINPUT">uname -a</KBD><SAMPCLASS="COMPUTEROUTPUT">Linux localhost.localdomain 2.2.15-2.5.0 #1 Sat Feb 5 00:13:43 EST 2000 i686 unknown</SAMP><SAMPCLASS="PROMPT">bash$ </SAMP><KBDCLASS="USERINPUT">uname -s</KBD><SAMPCLASS="COMPUTEROUTPUT">Linux</SAMP></PRE></FONT></TD></TR></TABLE></DD><DT><BCLASS="COMMAND">arch</B></DT><DD><P>显示系统的硬件体系结构. 			  等价于<BCLASS="COMMAND">uname -m</B>. 			  请参考<AHREF="testbranch.html#CASECMD">例子 10-26</A>. </P><TABLEBORDER="1"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="SCREEN"><SAMPCLASS="PROMPT">bash$ </SAMP><KBDCLASS="USERINPUT">arch</KBD><SAMPCLASS="COMPUTEROUTPUT">i686</SAMP><SAMPCLASS="PROMPT">bash$ </SAMP><KBDCLASS="USERINPUT">uname -m</KBD><SAMPCLASS="COMPUTEROUTPUT">i686</SAMP></PRE></FONT></TD></TR></TABLE></DD><DT><BCLASS="COMMAND">lastcomm</B></DT><DD><P>给出前一个命令的信息, 存储在<TTCLASS="FILENAME">/var/account/pacct</TT>文件中. 			  命令名字和用户名字都可以通过选项来指定. 这是GNU的一个统计工具. 	      </P></DD><DT><ANAME="LASTLOGREF"></A><BCLASS="COMMAND">lastlog</B></DT><DD><P>列出系统上所有用户最后登录的时间. 			  然后保存到<TTCLASS="FILENAME">/var/log/lastlog</TT>文件中. </P><P>	      <TABLEBORDER="1"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="SCREEN"><SAMPCLASS="PROMPT">bash$ </SAMP><KBDCLASS="USERINPUT">lastlog</KBD><SAMPCLASS="COMPUTEROUTPUT">root          tty1                      Fri Dec  7 18:43:21 -0700 2001 bin                                     **Never logged in** daemon                                  **Never logged in** ... bozo          tty1                      Sat Dec  8 21:14:29 -0700 2001</SAMP><SAMPCLASS="PROMPT">bash$ </SAMP><KBDCLASS="USERINPUT">lastlog | grep root</KBD><SAMPCLASS="COMPUTEROUTPUT">root          tty1                      Fri Dec  7 18:43:21 -0700 2001</SAMP>	      </PRE></FONT></TD></TR></TABLE>	      </P><DIVCLASS="CAUTION"><P></P><TABLECLASS="CAUTION"WIDTH="90%"BORDER="0"><TR><TDWIDTH="25"ALIGN="CENTER"VALIGN="TOP"><IMGSRC="./images/caution.gif"HSPACE="5"ALT="Caution"></TD><TDALIGN="LEFT"VALIGN="TOP"><P>如果用户对于文件<TTCLASS="FILENAME">/var/log/lastlog</TT>没有读权限的话, 				  那么调用这个命令就会失败. </P></TD></TR></TABLE></DIV></DD><DT><BCLASS="COMMAND">lsof</B></DT><DD><P>列出打开的文件. 这个命令将会把所有当前打开的文件都列出到一份详细的表格中, 			  包括文件的宿主信息, 尺寸, 还有与它们相关的信息等等. 			  当然, <BCLASS="COMMAND">lsof</B>也可以通过管道输出到<AHREF="textproc.html#GREPREF">grep</A>和(或)<AHREF="awk.html#AWKREF">awk</A>中, 			  来分析它的内容. </P><P>	      <TABLEBORDER="1"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="SCREEN"><SAMPCLASS="PROMPT">bash$ </SAMP><KBDCLASS="USERINPUT">lsof</KBD><SAMPCLASS="COMPUTEROUTPUT">COMMAND    PID    USER   FD   TYPE     DEVICE    SIZE     NODE NAME init         1    root  mem    REG        3,5   30748    30303 /sbin/init init         1    root  mem    REG        3,5   73120     8069 /lib/ld-2.1.3.so init         1    root  mem    REG        3,5  931668     8075 /lib/libc-2.1.3.so cardmgr    213    root  mem    REG        3,5   36956    30357 /sbin/cardmgr ...</SAMP>	      </PRE></FONT></TD></TR></TABLE>	    </P></DD><DT><BCLASS="COMMAND">strace</B></DT><DD><P>系统跟踪(<BCLASS="COMMAND">S</B>ystem <BCLASS="COMMAND">trace</B>): 			是跟踪<ICLASS="FIRSTTERM">系统调用</I>和信号的诊断和调试工具. 			如果你想了解特定的程序或者工具包为什么运行失败的话, 			那么这个命令和下边的<BCLASS="COMMAND">ltrace</B>命令就显得非常有用了, 	       . . . 当然, 这种失败现象可能是由缺少相关的库, 或者其他问题所引起. 	      </P><P>	    <TABLEBORDER="1"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="SCREEN"><SAMPCLASS="PROMPT">bash$ </SAMP><KBDCLASS="USERINPUT">strace df</KBD><SAMPCLASS="COMPUTEROUTPUT">execve("/bin/df", ["df"], [/* 45 vars */]) = 0 uname({sys="Linux", node="bozo.localdomain", ...}) = 0 brk(0)                                  = 0x804f5e4 ...</SAMP>	    </PRE></FONT></TD></TR></TABLE>	    </P><P>这是Solaris <BCLASS="COMMAND">truss</B>命令的Linux的等价工具. </P></DD><DT><BCLASS="COMMAND">ltrace</B></DT><DD><P>库跟踪工具(<BCLASS="COMMAND">L</B>ibrary <BCLASS="COMMAND">trace</B>): 	      跟踪给定命令的<ICLASS="FIRSTTERM">调用库</I>的相关信息. 	      </P><P>	    <TABLEBORDER="1"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="SCREEN"><SAMPCLASS="PROMPT">bash$ </SAMP><KBDCLASS="USERINPUT">ltrace df</KBD><SAMPCLASS="COMPUTEROUTPUT">__libc_start_main(0x804a910, 1, 0xbfb589a4, 0x804fb70, 0x804fb68 &#60;unfinished ...&#62;: setlocale(6, "")                                 = "en_US.UTF-8"bindtextdomain("coreutils", "/usr/share/locale") = "/usr/share/locale"textdomain("coreutils")                          = "coreutils"__cxa_atexit(0x804b650, 0, 0, 0x8052bf0, 0xbfb58908) = 0getenv("DF_BLOCK_SIZE")                          = NULL ...</SAMP>	    </PRE></FONT></TD></TR></TABLE>	    </P></DD><DT><ANAME="NMAPREF"></A><BCLASS="COMMAND">nmap</B></DT><DD><P>网络映射(<BCLASS="COMMAND">N</B>etwork <BCLASS="COMMAND">map</B>per)与端口扫描程序. 			这个命令将会扫描一个服务器来定位打开的端口, 			并且定位与这些端口相关的服务. 	      这个命令也能够上报一些包过滤与防火墙的信息. 	     这是一个防止网络被黑客入侵的非常重要的安全工具. 	      </P><P><TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING">  1&nbsp;#!/bin/bash  2&nbsp;  3&nbsp;SERVER=$HOST                           # localhost.localdomain (127.0.0.1).  4&nbsp;PORT_NUMBER=25                         # SMTP端口.  5&nbsp;  6&nbsp;nmap $SERVER | grep -w "$PORT_NUMBER"  # 察看指定端口是否打开?  7&nbsp;#              grep -w 匹配整个单词.   8&nbsp;#+             这样就不会匹配类似于1025这种含有25的端口了.   9&nbsp; 10&nbsp;exit 0 11&nbsp; 12&nbsp;# 25/tcp     open        smtp</PRE></FONT></TD></TR></TABLE></P></DD><DT><BCLASS="COMMAND">nc</B></DT><DD><P><BCLASS="COMMAND">nc</B>(<EM>netcat</EM>)工具是一个完整的工具包, 			  可以用它连接和监听TCP和UDP端口. 			  它能作为诊断和测试工具, 			  也能作为基于脚本的HTTP客户端和服务器组件. 	      </P><P>	    <TABLEBORDER="1"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="SCREEN"><SAMPCLASS="PROMPT">bash$ </SAMP><KBDCLASS="USERINPUT">nc localhost.localdomain 25</KBD><SAMPCLASS="COMPUTEROUTPUT">220 localhost.localdomain ESMTP Sendmail 8.13.1/8.13.1; Thu, 31 Mar 2005 15:41:35 -0700</SAMP></PRE></FONT></TD></TR></TABLE>	    </P><DIVCLASS="EXAMPLE"><HR><ANAME="ISCAN"></A><P><B>例子 13-5. 扫描远程机器上的<EM>identd</EM>服务进程</B></P><TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING">  1&nbsp;#! /bin/sh  2&nbsp;## 使用netcat工具写的和DaveG写的ident-scan扫描器有同等功能的东西. 噢, 他会被气死的.   3&nbsp;## 参数: target port [port port port ...]  4&nbsp;## 标准输出和标准输入被混到一块.  5&nbsp;##  6&nbsp;##  优点: 运行起来比ident-scan慢, 这样使远程机器inetd进程更不易注意而不会产生警告,   7&nbsp;##+ 并且只有很少的知名端口会被指定.   8&nbsp;##  缺点: 要求数字端口参数, 输出中无法区分标准输出和标准错误,   9&nbsp;##+ 并且当远程服务监听在很高的端口时无法工作.  10&nbsp;# 脚本作者: Hobbit &#60;hobbit@avian.org&#62; 11&nbsp;# 已征得作者同意在ABS指南中使用.  12&nbsp; 13&nbsp;# --------------------------------------------------- 14&nbsp;E_BADARGS=65       # 至少需要两个参数.  15&nbsp;TWO_WINKS=2        # 睡眠多长时间.  16&nbsp;THREE_WINKS=3 17&nbsp;IDPORT=113         # indent协议的认证端口.  18&nbsp;RAND1=999 19&nbsp;RAND2=31337 20&nbsp;TIMEOUT0=9 21&nbsp;TIMEOUT1=8 22&nbsp;TIMEOUT2=4 23&nbsp;# --------------------------------------------------- 24&nbsp; 25&nbsp;case "${2}" in 26&nbsp;  "" ) echo "Need HOST and at least one PORT." ; exit $E_BADARGS ;; 27&nbsp;esac 28&nbsp; 29&nbsp;# 测试目标主机看是否运行了identd守护进程. 30&nbsp;nc -z -w $TIMEOUT0 "$1" $IDPORT || { echo "Oops, $1 isn't running identd." ; exit 0 ; } 31&nbsp;#  -z 选项扫描监听进程. 32&nbsp;#     -w $TIMEOUT = 尝试连接多长时间. 33&nbsp; 34&nbsp;# 产生一个随机的本地起点源端口. 35&nbsp;RP=`expr $$ % $RAND1 + $RAND2` 36&nbsp; 37&nbsp;TRG="$1" 38&nbsp;shift 39&nbsp; 40&nbsp;while test "$1" ; do 41&nbsp;  nc -v -w $TIMEOUT1 -p ${RP} "$TRG" ${1} &#60; /dev/null &#62; /dev/null &#38; 42&nbsp;  PROC=$! 43&nbsp;  sleep $THREE_WINKS 44&nbsp;  echo "${1},${RP}" | nc -w $TIMEOUT2 -r "$TRG" $IDPORT 2&#62;&#38;1 45&nbsp;  sleep $TWO_WINKS 46&nbsp; 47&nbsp;# 这看上去是不是像个残疾的脚本或是其他类似的东西... ? 48&nbsp;# ABS作者评注 : "这不是真的那么糟糕, 49&nbsp;#+               事实上, 做得非常聪明." 50&nbsp; 51&nbsp;  kill -HUP $PROC 52&nbsp;  RP=`expr ${RP} + 1` 53&nbsp;  shift 54&nbsp;done 55&nbsp; 56&nbsp;exit $? 57&nbsp; 58&nbsp;#  注意事项: 59&nbsp;#  --------- 60&nbsp; 61&nbsp;#  试着把第30行去掉,  62&nbsp;#+ 然后以"localhost.localdomain 25"为参数来运行脚本. 63&nbsp; 64&nbsp;#  关于Hobbit写的更多'nc'例子脚本, 65&nbsp;#+ 可以在以下文档中找到: 66&nbsp;#+ /usr/share/doc/nc-X.XX/scripts 目录.</PRE></FONT></TD></TR></TABLE><HR></DIV><P>			并且, 当然, 			这里还有Dr. Andrew Tridgell在BistKeeper事件中臭名卓著的一行脚本: 	        <TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING">  1&nbsp;echo clone | nc thunk.org 5000 &#62; e2fsprogs.dat</PRE></FONT></TD></TR></TABLE>	    </P></DD><DT><ANAME="FREEREF"></A><BCLASS="COMMAND">free</B></DT><DD><P>使用表格形式来显示内存和缓存的使用情况. 			  这个命令的输出非常适合于使用<AHREF="textproc.html#GREPREF">grep</A>, 			  <AHREF="awk.html#AWKREF">awk</A>或者<BCLASS="COMMAND">Perl</B>来分析. 			  <BCLASS="COMMAND">procinfo</B>将会显示<BCLASS="COMMAND">free</B>命令所能显示的所有信息, 而且更加详细. 	      </P><TABLEBORDER="1"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="SCREEN"><SAMPCLASS="PROMPT">bash$ </SAMP><BCLASS="COMMAND">free</B><SAMPCLASS="COMPUTEROUTPUT">                total       used       free     shared    buffers     cached   Mem:         30504      28624       1880      15820       1608       16376   -/+ buffers/cache:      10640      19864   Swap:        68540       3128      65412</SAMP></PRE></FONT></TD></TR></TABLE><P>打印出未使用的RAM内存: </P><TABLEBORDER="1"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="SCREEN"><SAMPCLASS="PROMPT">bash$ </SAMP><BCLASS="COMMAND">free | grep Mem | awk '{ print $4 }'</B>

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?