filearchiv.html
来自「BASH Shell 编程 经典教程 《高级SHELL脚本编程》中文版」· HTML 代码 · 共 3,680 行 · 第 1/5 页
HTML
3,680 行
><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> 到目前为止, 已经有128-bit的<BCLASS="COMMAND">md5sum</B>被破解的报告了, 所以现在更安全的160-bit的<BCLASS="COMMAND">sha1sum</B>非常受欢迎, 这个命令已经被加入到checksum工具包中了. </P><P>一些安全顾问认为即使是<BCLASS="COMMAND">sha1sum</B>也是一种折衷的做法. 所以, 下一个工具是什么呢? -- 512-bit的checksum工具? </P><TABLEBORDER="1"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="SCREEN"><SAMPCLASS="PROMPT">bash$ </SAMP><KBDCLASS="USERINPUT">md5sum testfile</KBD><SAMPCLASS="COMPUTEROUTPUT">e181e2c8720c60522c4c4c981108e367 testfile</SAMP><SAMPCLASS="PROMPT">bash$ </SAMP><KBDCLASS="USERINPUT">sha1sum testfile</KBD><SAMPCLASS="COMPUTEROUTPUT">5d7425a9c08a66c3177f1e31286fa40986ffc996 testfile</SAMP> </PRE></FONT></TD></TR></TABLE></TD></TR></TABLE></DIV></DD><DT><ANAME="SHREDREF"></A><BCLASS="COMMAND">shred</B></DT><DD><P>用随机字符填充文件, 使得文件无法恢复, 这样就可以保证文件安全的被删除. 这个命令的效果与<AHREF="extmisc.html#BLOTOUT">例子 12-55</A>一样, 但是使用这个命令是一种更优雅更彻底的方法. </P><P>这是GNU的<EM>文件工具</EM>之一. </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>即使使用了<BCLASS="COMMAND">shred</B>命令, 高级的辨别技术也还是能够恢复文件的内容. </P></TD></TR></TABLE></DIV></DD></DL></DIV><P></P><DIVCLASS="VARIABLELIST"><P><B><ANAME="FAENCENCR1"></A>编码和解码</B></P><DL><DT><BCLASS="COMMAND">uuencode</B></DT><DD><P>这个工具用来把二进制文件编码成ASCII字符串, 这个工具适用于编码e-mail消息体, 或者新闻组消息. </P></DD><DT><BCLASS="COMMAND">uudecode</B></DT><DD><P>这个工具用来把uuencode后的ASCII字符串恢复为二进制文件. </P><DIVCLASS="EXAMPLE"><HR><ANAME="EX52"></A><P><B>例子 12-35. Uudecode编码后的文件</B></P><TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING"> 1 #!/bin/bash 2 # 在当前目录下用Uudecode解码所有用uuencode编码的文件. 3 4 lines=35 # 允许读头部的35行(范围很宽). 5 6 for File in * # 测试所有$PWD下的文件. 7 do 8 search1=`head -$lines $File | grep begin | wc -w` 9 search2=`tail -$lines $File | grep end | wc -w` 10 # 用Uuencode编码过的文件在文件开始的地方都有个"begin", 11 #+ 在文件结尾的地方都有"end". 12 if [ "$search1" -gt 0 ] 13 then 14 if [ "$search2" -gt 0 ] 15 then 16 echo "uudecoding - $File -" 17 uudecode $File 18 fi 19 fi 20 done 21 22 # 小心不要让这个脚本运行自己, 23 #+ 因为它也会把自身也认为是一个经过uuencode编码过的文件, 24 #+ 这都是因为这个脚本自身也包含"begin"和"end". 25 26 # 练习: 27 # ----- 28 # 修改这个脚本, 让它可以检查一个新闻组的每个文件, 29 #+ 并且如果下一个没找到的话就跳过. 30 31 exit 0</PRE></FONT></TD></TR></TABLE><HR></DIV><DIVCLASS="TIP"><P></P><TABLECLASS="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><AHREF="textproc.html#FOLDREF">fold -s</A>命令在处理从Usenet新闻组下载下来的长的uudecode文本消息的时候可能会有用(可能在管道中). </P></TD></TR></TABLE></DIV></DD><DT><BCLASS="COMMAND">mimencode</B>, <BCLASS="COMMAND">mmencode</B></DT><DD><P><BCLASS="COMMAND">mimencode</B>和<BCLASS="COMMAND">mmencode</B>命令用来处理多媒体编码的email附件. 虽然<EM>mail用户代理</EM>(比如<BCLASS="COMMAND">pine</B>或<BCLASS="COMMAND">kmail</B>)通常情况下都会自动处理, 但是这些特定的工具允许从命令行或shell脚本中来手动操作这些附件. </P></DD><DT><BCLASS="COMMAND">crypt</B></DT><DD><P>这个工具曾经是标准的UNIX文件加密工具. <ANAME="AEN9617"HREF="#FTN.AEN9617"><SPANCLASS="footnote">[3]</SPAN></A> 政府由于政策上的动机规定禁止加密软件的输出, 这样导致了<BCLASS="COMMAND">crypt</B>命令从UNIX世界消失, 并且在大多数的Linux发行版中也没有这个命令. 幸运的是, 程序员们想出了一些替代它的方法, 在这些方法中有作者自己的<AHREF="ftp://metalab.unc.edu/pub/Linux/utils/file/cruft-0.2.tar.gz"TARGET="_top">cruft</A> (请参考<AHREF="contributed-scripts.html#ENCRYPTEDPW">例子 A-4</A>). </P></DD></DL></DIV><P></P><DIVCLASS="VARIABLELIST"><P><B><ANAME="FAMISC1"></A>Miscellaneous</B></P><DL><DT><ANAME="MKTEMPREF"></A><BCLASS="COMMAND">mktemp</B></DT><DD><P>使用一个<SPANCLASS="QUOTE">"唯一"</SPAN>的文件名来创建一个<ICLASS="FIRSTTERM">临时文件</I>. <ANAME="AEN9640"HREF="#FTN.AEN9640"><SPANCLASS="footnote">[4]</SPAN></A> 如果不带参数的在命令行下调用这个命令时, 将会在<TTCLASS="FILENAME">/tmp</TT>目录下产生一个零长度的文件. </P><P> <TABLEBORDER="1"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="SCREEN"><SAMPCLASS="PROMPT">bash$ </SAMP><KBDCLASS="USERINPUT">mktemp</KBD><SAMPCLASS="COMPUTEROUTPUT">/tmp/tmp.zzsvql3154</SAMP> </PRE></FONT></TD></TR></TABLE> </P><P><TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING"> 1 PREFIX=filename 2 tempfile=`mktemp $PREFIX.XXXXXX` 3 # ^^^^^^ 在这个临时的文件名中 4 #+ 至少需要6个占位符. 5 # 如果没有指定临时文件的文件名, 6 #+ 那么默认就是"tmp.XXXXXXXXXX". 7 8 echo "tempfile name = $tempfile" 9 # tempfile name = filename.QA2ZpY 10 # 或者一些其他的相似的名字... 11 12 # 使用600为文件权限 13 #+ 来在当前工作目录下创建一个这样的文件. 14 # 这样就不需要"umask 177"了. 15 # 但不管怎么说, 这也是一个好的编程风格. </PRE></FONT></TD></TR></TABLE></P></DD><DT><BCLASS="COMMAND">make</B></DT><DD><P>build(建立)和compile(编译)二进制包的工具. 当源文件被增加或修改时就会触发一些操作, 这个工具用来控制这些操作. </P><P><ANAME="MAKEFILEREF"></A></P><P><BCLASS="COMMAND">make</B>命令会检查<TTCLASS="FILENAME">Makefile</TT>, makefile是文件的依赖和操作列表. </P></DD><DT><BCLASS="COMMAND">install</B></DT><DD><P>特殊目的的文件拷贝命令, 与<BCLASS="COMMAND">cp</B>命令相似, 但是具有设置拷贝文件的权限和属性的能力. 这个命令看起来是为了安装软件包所定制的, 而且就其本身而言, 这个命令经常出现在<TTCLASS="FILENAME">Makefiles</TT>中(在<TTCLASS="REPLACEABLE"><I>make install :</I></TT> 区域中). 在安装脚本中也会看到这个命令的使用. </P></DD><DT><BCLASS="COMMAND">dos2unix</B></DT><DD><P>这个工具是由Benjamin Lin及其同事共同编写的, 目的是将DOS格式的文本文件(以CR-LF为行结束符)转换为UNIX格式(以LF为行结束符), 反过来也一样. </P></DD><DT><BCLASS="COMMAND">ptx</B></DT><DD><P><BCLASS="COMMAND">ptx [targetfile]</B>命令将输出目标文件的序列改变索引(交叉引用列表). 如果必要的话, 这个命令可以在管道中进行更深层次的过滤和格式化. </P></DD><DT><BCLASS="COMMAND">more</B>, <BCLASS="COMMAND">less</B></DT><DD><P>分页显示文本文件或<TTCLASS="FILENAME">stdout</TT>, 一次一屏. 可以用来过滤<TTCLASS="FILENAME">stdout</TT>的输出 . . . 或过滤一个脚本的输出. </P><P> <BCLASS="COMMAND">more</B>命令的一个有趣的应用就是测试一个命令序列的执行, 这样做的目的是避免可能发生的糟糕的结果. <TABLEBORDER="0"BGCOLOR="#E0E0E0"WIDTH="90%"><TR><TD><FONTCOLOR="#000000"><PRECLASS="PROGRAMLISTING"> 1 ls /home/bozo | awk '{print "rm -rf " $1}' | more 2 # ^^^^ 3 4 # 检查下边(灾难性的)命令行的效果: 5 # ls /home/bozo | awk '{print "rm -rf " $1}' | sh 6 # 推入shell中执行 . . . ^^</PRE></FONT></TD></TR></TABLE> </P></DD></DL></DIV></DIV><H3CLASS="FOOTNOTES">注意事项</H3><TABLEBORDER="0"CLASS="FOOTNOTES"WIDTH="100%"><TR><TDALIGN="LEFT"VALIGN="TOP"WIDTH="5%"><ANAME="FTN.AEN8734"HREF="filearchiv.html#AEN8734"><SPANCLASS="footnote">[1]</SPAN></A></TD><TDALIGN="LEFT"VALIGN="TOP"WIDTH="95%"><P>在这里所讨论的<ICLASS="FIRSTTERM">归档文件</I>, 只不过是存储在一个单一位置上的一些相关文件的集合. </P></TD></TR><TR><TDALIGN="LEFT"VALIGN="TOP"WIDTH="5%"><ANAME="FTN.AEN8744"HREF="filearchiv.html#AEN8744"><SPANCLASS="footnote">[2]</SPAN></A></TD><TDALIGN="LEFT"VALIGN="TOP"WIDTH="95%"><P> <BCLASS="COMMAND">tar czvf archive_name.tar.gz *</B><EM>可以</EM>包含当前目录<EM>下</EM>的点文件. 这是一个未文档化的GNU<BCLASS="COMMAND">tar</B>的<SPANCLASS="QUOTE">"特性"</SPAN>. </P></TD></TR><TR><TDALIGN="LEFT"VALIGN="TOP"WIDTH="5%"><ANAME="FTN.AEN9617"HREF="filearchiv.html#AEN9617"><SPANCLASS="footnote">[3]</SPAN></A></TD><TDALIGN="LEFT"VALIGN="TOP"WIDTH="95%"><P>这是一个对称的块密码, 过去曾在单系统或本地网络中用来加密文件, 用来对抗<SPANCLASS="QUOTE">"public key"</SPAN>密码类, <BCLASS="COMMAND">pgp</B>就是一个众所周知的例子. </P></TD></TR><TR><TDALIGN="LEFT"VALIGN="TOP"WIDTH="5%"><ANAME="FTN.AEN9640"HREF="filearchiv.html#AEN9640"><SPANCLASS="footnote">[4]</SPAN></A></TD><TDALIGN="LEFT"VALIGN="TOP"WIDTH="95%"><P>使用<CODECLASS="OPTION">-d</CODE>选项可以创建一个临时的<EM>目录</EM>. </P></TD></TR></TABLE><DIVCLASS="NAVFOOTER"><HRALIGN="LEFT"WIDTH="100%"><TABLESUMMARY="Footer navigation table"WIDTH="100%"BORDER="0"CELLPADDING="0"CELLSPACING="0"><TR><TDWIDTH="33%"ALIGN="left"VALIGN="top"><AHREF="textproc.html"ACCESSKEY="P">前一页</A></TD><TDWIDTH="34%"ALIGN="center"VALIGN="top"><AHREF="index.html"ACCESSKEY="H">首页</A></TD><TDWIDTH="33%"ALIGN="right"VALIGN="top"><AHREF="communications.html"ACCESSKEY="N">下一页</A></TD></TR><TR><TDWIDTH="33%"ALIGN="left"VALIGN="top">文本处理命令</TD><TDWIDTH="34%"ALIGN="center"VALIGN="top"><AHREF="external.html"ACCESSKEY="U">上一级</A></TD><TDWIDTH="33%"ALIGN="right"VALIGN="top">通讯命令</TD></TR></TABLE></DIV></BODY></HTML>
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?