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 <unfinished ...>: 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 #!/bin/bash 2 3 SERVER=$HOST # localhost.localdomain (127.0.0.1). 4 PORT_NUMBER=25 # SMTP端口. 5 6 nmap $SERVER | grep -w "$PORT_NUMBER" # 察看指定端口是否打开? 7 # grep -w 匹配整个单词. 8 #+ 这样就不会匹配类似于1025这种含有25的端口了. 9 10 exit 0 11 12 # 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 #! /bin/sh 2 ## 使用netcat工具写的和DaveG写的ident-scan扫描器有同等功能的东西. 噢, 他会被气死的. 3 ## 参数: target port [port port port ...] 4 ## 标准输出和标准输入被混到一块. 5 ## 6 ## 优点: 运行起来比ident-scan慢, 这样使远程机器inetd进程更不易注意而不会产生警告, 7 ##+ 并且只有很少的知名端口会被指定. 8 ## 缺点: 要求数字端口参数, 输出中无法区分标准输出和标准错误, 9 ##+ 并且当远程服务监听在很高的端口时无法工作. 10 # 脚本作者: Hobbit <hobbit@avian.org> 11 # 已征得作者同意在ABS指南中使用. 12 13 # --------------------------------------------------- 14 E_BADARGS=65 # 至少需要两个参数. 15 TWO_WINKS=2 # 睡眠多长时间. 16 THREE_WINKS=3 17 IDPORT=113 # indent协议的认证端口. 18 RAND1=999 19 RAND2=31337 20 TIMEOUT0=9 21 TIMEOUT1=8 22 TIMEOUT2=4 23 # --------------------------------------------------- 24 25 case "${2}" in 26 "" ) echo "Need HOST and at least one PORT." ; exit $E_BADARGS ;; 27 esac 28 29 # 测试目标主机看是否运行了identd守护进程. 30 nc -z -w $TIMEOUT0 "$1" $IDPORT || { echo "Oops, $1 isn't running identd." ; exit 0 ; } 31 # -z 选项扫描监听进程. 32 # -w $TIMEOUT = 尝试连接多长时间. 33 34 # 产生一个随机的本地起点源端口. 35 RP=`expr $$ % $RAND1 + $RAND2` 36 37 TRG="$1" 38 shift 39 40 while test "$1" ; do 41 nc -v -w $TIMEOUT1 -p ${RP} "$TRG" ${1} < /dev/null > /dev/null & 42 PROC=$! 43 sleep $THREE_WINKS 44 echo "${1},${RP}" | nc -w $TIMEOUT2 -r "$TRG" $IDPORT 2>&1 45 sleep $TWO_WINKS 46 47 # 这看上去是不是像个残疾的脚本或是其他类似的东西... ? 48 # ABS作者评注 : "这不是真的那么糟糕, 49 #+ 事实上, 做得非常聪明." 50 51 kill -HUP $PROC 52 RP=`expr ${RP} + 1` 53 shift 54 done 55 56 exit $? 57 58 # 注意事项: 59 # --------- 60 61 # 试着把第30行去掉, 62 #+ 然后以"localhost.localdomain 25"为参数来运行脚本. 63 64 # 关于Hobbit写的更多'nc'例子脚本, 65 #+ 可以在以下文档中找到: 66 #+ /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 echo clone | nc thunk.org 5000 > 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 + -
显示快捷键?