﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-josson.jin-随笔分类-Linux</title><link>http://www.blogjava.net/josson/category/23457.html</link><description>天地生人,有一人应有一人之业;人生在世,生一日当尽一日之勤!</description><language>zh-cn</language><lastBuildDate>Sat, 15 Aug 2009 02:18:34 GMT</lastBuildDate><pubDate>Sat, 15 Aug 2009 02:18:34 GMT</pubDate><ttl>60</ttl><item><title>linux 问题记录.</title><link>http://www.blogjava.net/josson/archive/2009/08/13/291058.html</link><dc:creator>josson</dc:creator><author>josson</author><pubDate>Thu, 13 Aug 2009 10:34:00 GMT</pubDate><guid>http://www.blogjava.net/josson/archive/2009/08/13/291058.html</guid><wfw:comment>http://www.blogjava.net/josson/comments/291058.html</wfw:comment><comments>http://www.blogjava.net/josson/archive/2009/08/13/291058.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/josson/comments/commentRss/291058.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/josson/services/trackbacks/291058.html</trackback:ping><description><![CDATA[1、ssh 登录linux时，报: ssh_exchange_identification: Connection closed by remote host<br />
<br />
google了好一阵，才找到线索。主要由于我前晚写shell脚本调试的时候，误将一些系统文件的宿主为新用户了。后来新的会话怎么都登录不上去了，好在还有一个root登录的会话，找到/var/empty/sshd，修改宿主及权限。<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">chown&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">R&nbsp;root:root&nbsp;</span><span style="color: #000000;">/</span><span style="color: #000000;">var</span><span style="color: #000000;">/</span><span style="color: #000000;">empty</span><span style="color: #000000;">/</span><span style="color: #000000;">sshd<br />
chmod&nbsp;</span><span style="color: #000000;">700</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">/</span><span style="color: #000000;">var</span><span style="color: #000000;">/</span><span style="color: #000000;">empty</span><span style="color: #000000;">/</span><span style="color: #000000;">sshd</span></div>
<br />
2、su 切换用户，输入密码总是提示：密码不正确。<br />
<br />
也是权限问题，root切到其他账号时没有问题；其他账号之间切换就是不行，密码输入也正确。后来其到/bin/su 文件的权限不正确，调整如下解决问题:<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">-</span><span style="color: #000000;">rwsr</span><span style="color: #000000;">-</span><span style="color: #000000;">xr</span><span style="color: #000000;">-</span><span style="color: #000000;">x&nbsp;&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">&nbsp;root&nbsp;root&nbsp;</span><span style="color: #000000;">61144</span><span style="color: #000000;">&nbsp;Jul&nbsp;</span><span style="color: #000000;">30</span><span style="color: #000000;">&nbsp;&nbsp;</span><span style="color: #000000;">2007</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">/</span><span style="color: #000000;">bin</span><span style="color: #000000;">/</span><span style="color: #000000;">su</span></div>
<br />
<img src ="http://www.blogjava.net/josson/aggbug/291058.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/josson/" target="_blank">josson</a> 2009-08-13 18:34 <a href="http://www.blogjava.net/josson/archive/2009/08/13/291058.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Linux 环境apache对中文文件名的支持</title><link>http://www.blogjava.net/josson/archive/2009/03/13/259633.html</link><dc:creator>josson</dc:creator><author>josson</author><pubDate>Fri, 13 Mar 2009 13:37:00 GMT</pubDate><guid>http://www.blogjava.net/josson/archive/2009/03/13/259633.html</guid><wfw:comment>http://www.blogjava.net/josson/comments/259633.html</wfw:comment><comments>http://www.blogjava.net/josson/archive/2009/03/13/259633.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/josson/comments/commentRss/259633.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/josson/services/trackbacks/259633.html</trackback:ping><description><![CDATA[近日，有同事遇到一个奇怪问题：在开发环境，apache能正常支持中文文件下载，但切换到测试环境就404错误，找不文件，两个环境都是linux系统。我起先怀疑的是linux下需要对apache进行配置，以支持中文名。但研究了一下两个环境的配置，开发环境除apache版本高了点外，并没有其他特殊配置。所以怀疑版本问题，又把开发环境的apache及配置同步到了测试环境，重启依然无效。<br />
<br />
折腾半天，基本上可以判定这个问题应该与apache配置和版本无关了。<br />
<br />
网上google了一把，有很多关于mod_encoding.so模块实现中文支持和IE浏览器中取消"发送UTF-8 URL"的设置，考虑到开发环境并没有加入额外的module，也没设置IE选项，所以也没在意这些方案，况且这两个方案也不便于生产环境布署或实际应用。<br />
<br />
后来，又请教了SA和其他同学，还是没有结果。只能继续摸索，查找原因。通过两个环境的反复比较，终于发现了问题所在：<br />
<br />
通过 locale 查看了系统的字符集，开发机上是en_US.UTF-8，而测试机上是zh_CN.GBK；开发机上显示的中文文件名是乱码，测试机上显示正常，但反而显示为乱码的开发机上能被下载，而测试机上显示正常的文件不能被下载。后来，将测试环境的字符集也设为:en_US.UTF-8，并从svn重新迁出了中文名的文件，发现确实可以被读取到。<br />
<br />
分析一下原因，ie客户是发送"UTF-8 URL"到apache，apache以utf-8编码的文件名查找相关目录下的文件，如果此时中文文件是以GBK或其他字符集保存时，就无法找到匹配的文件。所以网上说的IE浏览器中取消"发送UTF-8 URL"的设置就有效的说法就可以解释了。<br />
<br />
<strong>结论：linux环境下apache中文文件下载支持与该文件的字符集有关，只要创建或从svn迁出中文文件文件时，linux系统为UTF-8的字符集，或中文文件名以UTF-8编码的文件，即能被apache正确读取。</strong>网上有资料说，apache 2.x 以上版本即支持中文文件名，虽然未经验证，但至少可以肯定apache 2.0.55、2.0.63是没有问题的。 
<img src ="http://www.blogjava.net/josson/aggbug/259633.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/josson/" target="_blank">josson</a> 2009-03-13 21:37 <a href="http://www.blogjava.net/josson/archive/2009/03/13/259633.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Linux启动级别&amp;Samba服务自启动设置</title><link>http://www.blogjava.net/josson/archive/2009/01/07/250293.html</link><dc:creator>josson</dc:creator><author>josson</author><pubDate>Wed, 07 Jan 2009 03:14:00 GMT</pubDate><guid>http://www.blogjava.net/josson/archive/2009/01/07/250293.html</guid><wfw:comment>http://www.blogjava.net/josson/comments/250293.html</wfw:comment><comments>http://www.blogjava.net/josson/archive/2009/01/07/250293.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/josson/comments/commentRss/250293.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/josson/services/trackbacks/250293.html</trackback:ping><description><![CDATA[<strong>1、LINUX系统启动级别</strong><br />
<br />
查看/etc/inittab文件，其主要内容如下：<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">#&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;halt&nbsp;(Do&nbsp;NOT&nbsp;set&nbsp;initdefault&nbsp;to&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">)&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />#&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;Single&nbsp;user&nbsp;mode&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />#&nbsp;</span><span style="color: #000000">2</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;Multiuser,&nbsp;without&nbsp;NFS&nbsp;(The&nbsp;same&nbsp;as&nbsp;</span><span style="color: #000000">3</span><span style="color: #000000">,&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;you&nbsp;</span><span style="color: #0000ff">do</span><span style="color: #000000">&nbsp;not&nbsp;have&nbsp;networking)&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />#&nbsp;</span><span style="color: #000000">3</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;Full&nbsp;multiuser&nbsp;mode&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />#&nbsp;</span><span style="color: #000000">4</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;unused&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />#&nbsp;</span><span style="color: #000000">5</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;X11&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />#&nbsp;</span><span style="color: #000000">6</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;reboot&nbsp;(Do&nbsp;NOT&nbsp;set&nbsp;initdefault&nbsp;to&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">)&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />#&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />id:</span><span style="color: #000000">5</span><span style="color: #000000">:initdefault:<br />
... ...<br />
&nbsp;</span></div>
<br />
0：停机(不要设置为启动默认级别) <br />
1：单用户模式 <br />
2：多用户，无NFS(如果您没有配置网络，该级别与3一样) <br />
3：完全多用户模式 <br />
4：不使用 <br />
5：X11图形模式 <br />
6：重启(不要设置为启动默认级别)<br />
<br />
如果想让系统不用图形模式登陆可将id:5:initdefault: 中的5改为3即可。<br />
<br />
<strong>2、Linux运行级别<br />
</strong><br />
Linux 启动时，运行一个叫做init 的程序，然后由它来启动后面的任务，包括多用户环境，网络等。<br />
<br />
那么，到底什么是运行级别呢？简单的说，运行级就是操作系统当前正在运行的功能级别。这个级别从1 到6 ，具有不同的功能。这些级别在/etc/inittab 文件里指定。这个文件是init 程序寻找的主要文件，最先运行的服务是那些放在/etc/rc.d 目录下的文件。<br />
<br />
大多数的Linux 发行版本中，启动脚本放在/etc/rc.d/init.d，这些脚本被ln 命令来连接到 /etc/rc.d/rcn.d 目录(这里的n 就是运行级0-6)。如：/etc/rc.d/rc5.d 下面的S10network 就是连接到/etc/rc.d/init.d下的network 脚本的。因此，我们可以知道，rc5.d 下面的文件就是和运行级5 有关的。<br />
<br />
<strong>3、Samba的自启动</strong><br />
<br />
samba安装完后，默认是不会自启动的。通过查看/etc/rc.d/rcn.d/目录下的文件或通过chkconfig命令查询，如：<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">[alisoft@kplan</span><span style="color: #000000">-</span><span style="color: #000000">dev8&nbsp;</span><span style="color: #000000">~</span><span style="color: #000000">]$&nbsp;ll&nbsp;</span><span style="color: #000000">/</span><span style="color: #000000">etc</span><span style="color: #000000">/</span><span style="color: #000000">rc.d</span><span style="color: #000000">/</span><span style="color: #000000">rc5.d<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />总用量&nbsp;</span><span style="color: #000000">272</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><img alt="" src="http://www.blogjava.net/Images/dot.gif" />&nbsp;<img alt="" src="http://www.blogjava.net/Images/dot.gif" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />lrwxrwxrwx&nbsp;&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">&nbsp;root&nbsp;root&nbsp;</span><span style="color: #000000">22</span><span style="color: #000000">&nbsp;&nbsp;8月&nbsp;</span><span style="color: #000000">13</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">11</span><span style="color: #000000">:</span><span style="color: #000000">17</span><span style="color: #000000">&nbsp;K30spamassassin&nbsp;</span><span style="color: #000000">-&gt;</span><span style="color: #000000">&nbsp;..</span><span style="color: #000000">/</span><span style="color: #000000">init.d</span><span style="color: #000000">/</span><span style="color: #000000">spamassassin<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><strong><span style="color: #008000"><strong>lrwxrwxrwx&nbsp;&nbsp;</strong><strong>1&nbsp;root&nbsp;root&nbsp;13&nbsp;&nbsp;8月&nbsp;18&nbsp;21:59&nbsp;K35smb&nbsp;-&gt;&nbsp;../init.d/</strong><strong>smb<br />
</strong></span></strong></span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />lrwxrwxrwx&nbsp;&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">&nbsp;root&nbsp;root&nbsp;</span><span style="color: #000000">19</span><span style="color: #000000">&nbsp;&nbsp;8月&nbsp;</span><span style="color: #000000">13</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">11</span><span style="color: #000000">:</span><span style="color: #000000">17</span><span style="color: #000000">&nbsp;K35vncserver&nbsp;</span><span style="color: #000000">-&gt;</span><span style="color: #000000">&nbsp;..</span><span style="color: #000000">/</span><span style="color: #000000">init.d</span><span style="color: #000000">/</span><span style="color: #000000">vncserver<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />lrwxrwxrwx&nbsp;&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">&nbsp;root&nbsp;root&nbsp;</span><span style="color: #000000">17</span><span style="color: #000000">&nbsp;&nbsp;8月&nbsp;</span><span style="color: #000000">13</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">11</span><span style="color: #000000">:</span><span style="color: #000000">17</span><span style="color: #000000">&nbsp;S10network&nbsp;</span><span style="color: #000000">-&gt;</span><span style="color: #000000">&nbsp;..</span><span style="color: #000000">/</span><span style="color: #000000">init.d</span><span style="color: #000000">/</span><span style="color: #000000">network<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><img alt="" src="http://www.blogjava.net/Images/dot.gif" />&nbsp;<img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span></div>
文件开头的S 代表start 就是启动服务，K代表kill。后面的数字10 就是启动的顺序。例如，有S80postfix 文件，80 就是顺序在 10 以后，表示postfix启动需先启动网络。/etc/rc.d/rc5.d/K35smb ，K 代表 kill。标准的Linux运行级别为3 或者5 ，Linux启动时,init 就会执行 K35smb 脚本。<br />
<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">[alisoft@kplan</span><span style="color: #000000">-</span><span style="color: #000000">dev8&nbsp;</span><span style="color: #000000">~</span><span style="color: #000000">]$&nbsp;</span><span style="color: #000000">/</span><span style="color: #000000">sbin</span><span style="color: #000000">/</span><span style="color: #000000">chkconfig&nbsp;</span><span style="color: #000000">--</span><span style="color: #000000">list&nbsp;</span><span style="color: #000000">|</span><span style="color: #000000">&nbsp;grep&nbsp;smb<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />smb&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">:off&nbsp;&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">:off&nbsp;&nbsp;</span><span style="color: #000000">2</span><span style="color: #000000">:off&nbsp;&nbsp;</span><span style="color: #000000">3</span><span style="color: #000000">:off&nbsp;&nbsp;</span><span style="color: #000000">4</span><span style="color: #000000">:off&nbsp;&nbsp;</span><span style="color: #000000">5</span><span style="color: #000000">:off&nbsp;&nbsp;</span><span style="color: #000000">6</span><span style="color: #000000">:off</span></div>
0~6 表示运行级别。on 表示启动；off 表示关闭。<br />
<br />
要设置Samba自启动，需通过chkconfig命令进行设置：<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">[alisoft@kplan</span><span style="color: #000000">-</span><span style="color: #000000">dev8&nbsp;</span><span style="color: #000000">~</span><span style="color: #000000">]</span><span style="color: #000000">/</span><span style="color: #000000">sbin</span><span style="color: #000000">/</span><span style="color: #000000">chkconfig&nbsp;</span><span style="color: #000000">--</span><span style="color: #000000">level&nbsp;</span><span style="color: #000000">35</span><span style="color: #000000">&nbsp;smb&nbsp;on<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />[alisoft@kplan</span><span style="color: #000000">-</span><span style="color: #000000">dev8&nbsp;</span><span style="color: #000000">~</span><span style="color: #000000">]$&nbsp;</span><span style="color: #000000">/</span><span style="color: #000000">sbin</span><span style="color: #000000">/</span><span style="color: #000000">chkconfig&nbsp;</span><span style="color: #000000">--</span><span style="color: #000000">list&nbsp;</span><span style="color: #000000">|</span><span style="color: #000000">&nbsp;grep&nbsp;smb<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />smb&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">:off&nbsp;&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">:off&nbsp;&nbsp;</span><span style="color: #000000">2</span><span style="color: #000000">:off&nbsp;&nbsp;</span><span style="color: #000000">3</span><span style="color: #000000">:on&nbsp;&nbsp;</span><span style="color: #000000">4</span><span style="color: #000000">:off&nbsp;&nbsp;</span><span style="color: #000000">5</span><span style="color: #000000">:on&nbsp;&nbsp;</span><span style="color: #000000">6</span><span style="color: #000000">:off</span></div>
<br />
Linux系统运行级别为3 或者5时，系统就会自启动Samba服务。
<img src ="http://www.blogjava.net/josson/aggbug/250293.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/josson/" target="_blank">josson</a> 2009-01-07 11:14 <a href="http://www.blogjava.net/josson/archive/2009/01/07/250293.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>rsync + ssh – 完成服务器之间的批量数据同步</title><link>http://www.blogjava.net/josson/archive/2008/10/15/234473.html</link><dc:creator>josson</dc:creator><author>josson</author><pubDate>Wed, 15 Oct 2008 08:50:00 GMT</pubDate><guid>http://www.blogjava.net/josson/archive/2008/10/15/234473.html</guid><wfw:comment>http://www.blogjava.net/josson/comments/234473.html</wfw:comment><comments>http://www.blogjava.net/josson/archive/2008/10/15/234473.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/josson/comments/commentRss/234473.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/josson/services/trackbacks/234473.html</trackback:ping><description><![CDATA[现有需求如下：需对若干服务器做相同的环境配置，且配置工作相当复杂，若人工一台一台的处理比较耗时且容易出错。我们可以考虑先完成一台服务器的配置工作，确认配置无误后，再通过脚本，将相应的配置工作同步到其他所有的服务器中。设有已完成配置的服务器：A (192.168.0.2) 和 待配置的服务器B ~ Z(192.168.0.101 ~ 126)。<br />
<br />
实现上述需求，关键有两点：1). 通过ssh信任登录，避免每次同步时要求输入密码；2). 通过rsync命令实现服务器之间文件的同步。具体实现细节如下：<br />
<br />
1. 完成单向Trusted SSH Authorized<br />
首先在A产生public/private dsa key pair：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;</span><br />
<span style="color: #000000;">[root</span><span style="color: #800080;">@kplan</span><span style="color: #000000;">-</span><span style="color: #000000;">test3&nbsp;</span><span style="color: #000000;">.</span><span style="color: #000000;">ssh]</span><span style="color: #008000;">#</span><span style="color: #008000;">&nbsp;ssh-keygen&nbsp;-d</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">Generating&nbsp;public</span><span style="color: #000000;">/</span><span style="color: #000000;">private&nbsp;dsa&nbsp;key&nbsp;pair</span><span style="color: #000000;">.</span><span style="color: #000000;"><br />
Enter&nbsp;file&nbsp;in&nbsp;which&nbsp;to&nbsp;save&nbsp;the&nbsp;key&nbsp;(</span><span style="color: #000000;">/</span><span style="color: #000000;">root</span><span style="color: #000000;">/.</span><span style="color: #000000;">ssh</span><span style="color: #000000;">/</span><span style="color: #000000;">id_dsa)</span><span style="color: #000000;">:</span><span style="color: #000000;"><br />
Enter&nbsp;passphrase&nbsp;(empty&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">no</span><span style="color: #000000;">&nbsp;passphrase)</span><span style="color: #000000;">:</span><span style="color: #000000;"><br />
Enter&nbsp;same&nbsp;passphrase&nbsp;again</span><span style="color: #000000;">:</span><span style="color: #000000;"><br />
Your&nbsp;identification&nbsp;has&nbsp;been&nbsp;saved&nbsp;in&nbsp;</span><span style="color: #000000;">/</span><span style="color: #000000;">root</span><span style="color: #000000;">/.</span><span style="color: #000000;">ssh</span><span style="color: #000000;">/</span><span style="color: #000000;">id_dsa</span><span style="color: #000000;">.</span><span style="color: #000000;"><br />
Your&nbsp;public&nbsp;key&nbsp;has&nbsp;been&nbsp;saved&nbsp;in&nbsp;</span><span style="color: #000000;">/</span><span style="color: #000000;">root</span><span style="color: #000000;">/.</span><span style="color: #000000;">ssh</span><span style="color: #000000;">/</span><span style="color: #000000;">id_dsa</span><span style="color: #000000;">.</span><span style="color: #000000;">pub</span><span style="color: #000000;">.</span><span style="color: #000000;"><br />
The&nbsp;key&nbsp;fingerprint&nbsp;is</span><span style="color: #000000;">:</span><span style="color: #000000;"><br />
f3</span><span style="color: #000000;">:</span><span style="color: #800000;">47</span><span style="color: #000000;">:</span><span style="color: #000000;">3b</span><span style="color: #000000;">:</span><span style="color: #000000;">b0</span><span style="color: #000000;">:</span><span style="color: #000000;">2a</span><span style="color: #000000;">:</span><span style="color: #800000;">50</span><span style="color: #000000;">:</span><span style="color: #000000;">f8</span><span style="color: #000000;">:</span><span style="color: #800000;">77</span><span style="color: #000000;">:</span><span style="color: #000000;">7e</span><span style="color: #000000;">:</span><span style="color: #000000;">ca</span><span style="color: #000000;">:</span><span style="color: #800000;">29</span><span style="color: #000000;">:</span><span style="color: #800000;">85</span><span style="color: #000000;">:</span><span style="color: #000000;">e8</span><span style="color: #000000;">:</span><span style="color: #000000;">d9</span><span style="color: #000000;">:</span><span style="color: #800000;">05</span><span style="color: #000000;">:</span><span style="color: #000000;">9b&nbsp;root</span><span style="color: #800080;">@kplan</span><span style="color: #000000;">-</span><span style="color: #000000;">test3<br />
[root</span><span style="color: #800080;">@kplan</span><span style="color: #000000;">-</span><span style="color: #000000;">test3&nbsp;</span><span style="color: #000000;">.</span><span style="color: #000000;">ssh]</span><span style="color: #008000;">#<br />
</span><span style="color: #000000;">&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;</span><br />
</div>
<br />
完成上述命令后，会在系统/root/.ssh目录生成两个文件:id_dsa与id_dsa.pub。现在复制id_dsa.pub到B服务器，并更名为 authorized_keys2<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;<br />
[root</span><span style="color: #800080;">@kplan</span><span style="color: #000000;">-</span><span style="color: #000000;">test3&nbsp;</span><span style="color: #000000;">.</span><span style="color: #000000;">ssh]</span><span style="color: #008000;">#</span><span style="color: #008000;">&nbsp;scp&nbsp;id_dsa.pub&nbsp;192.168.0.101:/root/.ssh/authorized_keys2</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">root@</span><span style="color: #800000;">192.168</span><span style="color: #000000;">.</span><span style="color: #800000;">0.101</span><span style="color: #000000; font-weight: bold;">'</span><span style="color: #000000; font-weight: bold;">s&nbsp;password:<br />
id_dsa.pub&nbsp;100%&nbsp;|*****************************************************|&nbsp;612&nbsp;00:00<br />
[root@kplan-test3&nbsp;.ssh]#<br />
&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;</span></div>
<br />
如果上述步骤顺利完成的话，现在您可以执行&#8221;ssh 192.168.0.101&#8221;，无需输入登录密码，即可登录到B服务器了。<br />
<br />
2.使用rsync 做Remote sync﹕<br />
rsync特性简介: rsync是unix-like系统下的数据镜像备份工具，从命名上就可以看出来了remote sync。它的特性如下： <br />
1、可以镜像保存整个目录树和文件系统。 <br />
2、可以很容易做到保持原来文件的权限、时间等等。 <br />
3、无须特殊权限即可安装。 <br />
4、优化的流程，文件传输效率高。 <br />
5、可以使用rcp、ssh等方式来传输文件，当然也可以通过直接的socket连接。 <br />
6、支持匿名传输。 <br />
<br />
参数意义如下﹕<br />
-a, --archive<br />
It is a quick way of saying you want recursion and want to preserve almost everything.<br />
-v, --verbose<br />
This option increases the amount of information you are given during the transfer.<br />
-l, --links<br />
When symlinks are encountered, recreate the symlink on the destination.<br />
-R, --relative<br />
Use relative paths. 保留相对路径...才不会让子目录跟 parent 挤在同一层...<br />
--delete<br />
是指如果Server端删除了一文件，那客户端也相应把这一文件删除，保持真正的一致。 <br />
-e ssh<br />
建立起加密的连接。 <br />
3、同步脚本<br />
创建脚本，实现自动配置工作。<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;<br />
[root</span><span style="color: #800080;">@kplan</span><span style="color: #000000;">-</span><span style="color: #000000;">test3&nbsp;backup]</span><span style="color: #008000;">#</span><span style="color: #008000;">&nbsp;vi&nbsp;install_env.sh<br />
#!/bin/bash</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">WEBSERVER</span><span style="color: #000000;">=</span><span style="color: #000000; font-weight: bold;">'</span><span style="color: #000000; font-weight: bold;">kplan-test1&nbsp;kplan-test2&nbsp;kplan-test3</span><span style="color: #000000; font-weight: bold;">'</span><span style="color: #000000;"><br />
echo&nbsp;</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000; font-weight: bold;">auto&nbsp;install&nbsp;envirment&nbsp;&#8230;&nbsp;------------------------</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;webserver&nbsp;in&nbsp;</span><span style="color: #800080;">$WEBSERVER</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">do</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000; font-weight: bold;">install&nbsp;server:$webserver's&nbsp;envirment.</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;</span><span style="color: #000000; font-weight: bold;">'</span><span style="color: #000000; font-weight: bold;">transport&nbsp;file&nbsp;:&nbsp;/etc/profile&nbsp;&amp;&nbsp;/etc/hosts</span><span style="color: #000000; font-weight: bold;">'</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;rsync&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">v&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">r&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">l&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">H&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">p&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">g&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">t&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">S&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">e&nbsp;ssh&nbsp;</span><span style="color: #000000;">--</span><span style="color: #0000ff;">delete</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">/</span><span style="color: #000000;">etc</span><span style="color: #000000;">/</span><span style="color: #000000;">profile&nbsp;root@</span><span style="color: #800080;">$webserver</span><span style="color: #000000;">:/</span><span style="color: #000000;">etc</span><span style="color: #000000;">/</span><span style="color: #000000;">profile<br />
&nbsp;&nbsp;&nbsp;&nbsp;rsync&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">v&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">r&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">l&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">H&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">p&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">g&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">t&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">S&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">e&nbsp;ssh&nbsp;</span><span style="color: #000000;">--</span><span style="color: #0000ff;">delete</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">/</span><span style="color: #000000;">etc</span><span style="color: #000000;">/</span><span style="color: #000000;">hosts&nbsp;root@</span><span style="color: #800080;">$webserver</span><span style="color: #000000;">:/</span><span style="color: #000000;">etc</span><span style="color: #000000;">/</span><span style="color: #000000;">hosts<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;</span><span style="color: #000000; font-weight: bold;">'</span><span style="color: #000000; font-weight: bold;">run&nbsp;shell&nbsp;command&nbsp;:&nbsp;/home/init_env.sh</span><span style="color: #000000; font-weight: bold;">'</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;ssh&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">q&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">o&nbsp;StrictHostKeyChecking</span><span style="color: #000000;">=</span><span style="color: #0000ff;">no</span><span style="color: #000000;">&nbsp;root@</span><span style="color: #800080;">$webserver</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000; font-weight: bold;">/home/init_env.sh</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;ssh&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">q&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">o&nbsp;StrictHostKeyChecking</span><span style="color: #000000;">=</span><span style="color: #0000ff;">no</span><span style="color: #000000;">&nbsp;&nbsp;root@</span><span style="color: #800080;">$webserver</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000; font-weight: bold;">rm&nbsp;-f&nbsp;/home/init_env.sh</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000; font-weight: bold;">&nbsp;$webserver&nbsp;is&nbsp;end&nbsp;&nbsp;-------------------------&nbsp;</span><span style="color: #000000; font-weight: bold;">"</span><span style="color: #000000;"><br />
done<br />
</span><span style="color: #0000ff;">sleep</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000;">1</span><span style="color: #000000;"><br />
clear<br />
&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;</span></div>
<br />
4、其他<br />
如果你想用来做自动备份，则在crontab中加入备份脚本即可。如在每天0时0分做备份(设/root目录下已有完成备份的脚本 backup.sh)：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;<br />
[root</span><span style="color: #800080;">@kplan</span><span style="color: #000000;">-</span><span style="color: #000000;">test3&nbsp;backup]</span><span style="color: #008000;">#</span><span style="color: #008000;">&nbsp;crontab&nbsp;-e</span><span style="color: #008000;"><br />
</span><span style="color: #800000;">0</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000;">0</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">/</span><span style="color: #000000;">root</span><span style="color: #000000;">/</span><span style="color: #000000;">backup</span><span style="color: #000000;">.</span><span style="color: #000000;">sh<br />
&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;</span></div>
<br />
<br />
<br />
<img src ="http://www.blogjava.net/josson/aggbug/234473.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/josson/" target="_blank">josson</a> 2008-10-15 16:50 <a href="http://www.blogjava.net/josson/archive/2008/10/15/234473.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Linux Shell编程。</title><link>http://www.blogjava.net/josson/archive/2008/07/21/216334.html</link><dc:creator>josson</dc:creator><author>josson</author><pubDate>Mon, 21 Jul 2008 05:14:00 GMT</pubDate><guid>http://www.blogjava.net/josson/archive/2008/07/21/216334.html</guid><wfw:comment>http://www.blogjava.net/josson/comments/216334.html</wfw:comment><comments>http://www.blogjava.net/josson/archive/2008/07/21/216334.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/josson/comments/commentRss/216334.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/josson/services/trackbacks/216334.html</trackback:ping><description><![CDATA[<p><font class="f14" id="zoom"><font color="#000000">　　<strong>Shell基本语法</strong></font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">　　像高级程序设计语言一样，Shell也提供说明和使用变量的功能。对Shell来讲，所有变量的取值都是一个字串，Shell程序采用$var的形式来引用名为var的变量的值。</font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">　　Shell有以下几种基本类型的变量。</font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">　　（1）Shell定义的环境变量：</font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">　　Shell在开始执行时就已经定义了一些和系统的工作环境有关的变量，用户还可以重新定义这些变量，常用的Shell环境变量有：</font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">　　HOME 用于保存注册目录的完全路径名。</font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">　　PATH 用于保存用冒号分隔的目录路径名，Shell将按PATH变量中给出的顺序搜索这些目录，找到的第一个与命令名称一致的可执行文件将被执行。</font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">　　TERM 终端的类型。</font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">　　UID 当前用户的识别字，取值是由数位构成的字串。</font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">　　PWD 当前工作目录的绝对路径名，该变量的取值随cd命令的使用而变化。</font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">　　PS1 主提示符，在特权用户下，默认的主提示符是#，在普通用户下，默认的主提示符是$。</font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">　　PS2 在Shell接收用户输入命令的过程中，如果用户在输入行的末尾输入&#8220;&#8221;然后回车，或者当用户按回车键时Shell判断出用户输入的命令没有结束时，就显示这个辅助提示符，提示用户继续输入命令的其余部分，默认的辅助提示符是&gt;。</font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">　　（2）用户定义的变量：</font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">　　用户可以按照下面的语法规则定义自己的变量：</font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">　　变量名=变量值</font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">　　要注意的一点是，在定义变量时，变量名前不应加符号$，在引用变量的内容时则应在变量名前加$；在给变量赋值时，等号两边一定不能留空格，若变量中本身就包含了空格，则整个字串都要用双引号括起来。</font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">　　在编写Shell程序时，为了使变量名和命令名相区别，建议所有的变量名都用大写字母来表示。</font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">　　有时我们想要在说明一个变量并对它设置为一个特定值后就不在改变它的值时，可以用下面的命令来保证一个变量的只读性：</font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">　　readonly 变量名</font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">　　在任何时候，创建的变量都只是当前Shell的局部变量，所以不能被Shell运行的其他命令或Shell程序所利用，而export命令可以将一个局部变量提供给Shell执行的其他命令使用，其格式为：</font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">　　export 变量名</font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">　　也可以在给变量赋值的同时使用export命令：</font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">　　export 变量名=变量值</font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">　　使用export说明的变量，在Shell以后运行的所有命令或程序中都可以访问到。</font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">　　（3）位置参数：</font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">
位置参数是一种在调用Shell程序的命令行中按照各自的位置决定的变量，是在程序名之后输入的参数。位置参数之间用空格分隔，Shell取第一个位置
参数替换程序文件中的$1，第二个替换$2，依次类推。$0是一个特殊的变量，它的内容是当前这个Shell程序的文件名，所以，$0不是一个位置参数，
在显示当前所有的位置参数时是不包括$0的。</font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">　　（4）预定义变量：</font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">　　预定义变量和环境变量相类似，也是在Shell一开始时就定义了的变量。所不同的是，用户只能根据Shell的定义来使用这些变量，而不能重定义它。所有预定义变量都是由$符和另一个符号组成的，常用的Shell预定义变量有：</font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">　　$# 位置参数的数量。</font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">　　$* 所有位置参数的内容。</font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">　　$? 命令执行后返回的状态。</font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">　　$$ 当前进程的进程号。</font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">　　$! 后台运行的最后一个进程号。</font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">　　$0 当前执行的进程名。</font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">　　其中，$?用于检查上一个命令执行是否正确。（在Linux中，命令退出状态为0表示该命令正确执行，任何非0值表示命令出错。）</font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">　　$$变量最常见的用途是用做暂存文件的名字以保证暂存文件不会重复。</font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">　　（5）参数置换的变量：</font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">　　Shell提供了参数置换功能以便用户可以根据不同的条件来给变量赋不同的值。参数置换的变量有4种，这些变量通常与某一个位置参数相联系，根据指定的位置参数是否已经设置类决定变量的取值，它们的语法和功能分别如下。</font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">　　a. 变量=${参数-word}：如果设置了参数，则用参数的值置换变量的值，否则用word置换。即这种变量的值等于某一个参数的值，如果该参数没有设置，则变量就等于word的值。</font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">　　b. 变量=${参数=word}：如果设置了参数，则用参数的值置换变量的值，否则把变量设置成word，然后再用word替换参数的值。注意，位置参数不能用于这种方式，因为在Shell程序中不能为位置参数赋值。</font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">
c.
变量=${参数？word}：如果设置了参数，则用参数的值置换变量的值，否则就显示word并从Shell中退出，如果省略了word，则显示标准信
息。这种变量要求一定等于某一个参数的值。如果该参数没有设置，就显示一个信息，然后退出，因此这种方式常用于出错指示。</font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">　　d. 变量=${参数+word}：如果设置了参数，则用word置换变量，否则不进行置换。</font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">　　所有这4种形式中的&#8220;参数&#8221;既可以是位置参数，也可以是另一个变量，只是用位置参数的情况比较多。<strong>Shell程序设计的流程控制</strong></font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">　　和其他高级程序设计语言一样，Shell提供了用来控制程序执行流程的命令，包括条件分支和循环结构，用户可以用这些命令创建非常复杂的程序。</font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">　　与传统语言不同的是，Shell用于指定条件值的不是布尔运算式，而是命令和字串。</font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">　　1．测试命令</font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">　　test命令用于检查某个条件是否成立，它可以进行数值、字符和文件3个方面的测试，其测试符和相应的功能分别如下。</font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">　　（1）数值测试：</font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">　　-eq 等于则为真。</font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">　　-ne 不等于则为真。</font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">　　-gt 大于则为真。</font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">　　-ge 大于等于则为真。</font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">　　-lt 小于则为真。</font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">　　-le 小于等于则为真。</font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">　　（2）字串测试：</font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">　　= 等于则为真。</font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">　　!= 不相等则为真。</font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">　　-z字串 字串长度伪则为真。</font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">　　-n字串 字串长度不伪则为真。</font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">　　（3）文件测试：</font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">　　-e文件名 如果文件存在则为真。</font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">　　-r文件名 如果文件存在且可读则为真。</font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">　　-w文件名 如果文件存在且可写则为真。</font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">　　-x文件名 如果文件存在且可执行则为真。</font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">　　-s文件名 如果文件存在且至少有一个字符则为真。</font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">　　-d文件名 如果文件存在且为目录则为真。</font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">　　-f文件名 如果文件存在且为普通文件则为真。</font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">　　-c文件名 如果文件存在且为字符型特殊文件则为真。</font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">　　-b文件名 如果文件存在且为块特殊文件则为真。</font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">　　另外，Linux还提供了与（！）、或（-o）、非（-a）三个逻辑操作符，用于将测试条件连接起来，其优先顺序为：！最高，-a次之，-o最低。</font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">　　同时，bash也能完成简单的算术运算，格式如下：</font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">　　$[expression]</font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">　　例如：</font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">　　var1=2</font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">　　var2=$[var1*10+1]</font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">　　则var2的值为21。</font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">　　2．if条件语句</font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">　　Shell程序中的条件分支是通过if条件语句来实现的，其一般格式为：</font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">　　if 条件命令串</font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">　　then</font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">　　条件为真时的命令串</font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">　　else</font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">　　条件为假时的命令串</font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">　　fi</font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">　　3．for循环</font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">　　for循环对一个变量的可能的值都执行一个命令序列。赋给变量的几个数值既可以在程序内以数值列表的形式提供，也可以在程序以外以位置参数的形式提供。for循环的一般格式为：</font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">　　for变量名 　 　[in数值列表]</font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">　　do</font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">　　若干个命令行</font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">　　done</font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">　　变量名可以是用户选择的任何字串，如果变量名是var，则在in之后给出的数值将顺序替换循环命令列表中的$var。如果省略了in，则变量var的取值将是位置参数。对变量的每一个可能的赋值都将执行do和done之间的命令列表。</font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">　　4．while和until循环</font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">　　while和until命令都是用命令的返回状态值来控制循环的。While循环的一般格式为：</font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">　　while</font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">　　若干个命令行1</font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">　　do</font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">　　若干个命令行2</font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">　　done</font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">　　只要while的&#8220;若干个命令行1&#8221;中最后一个命令的返回状态为真，while循环就继续执行do...done之间的&#8220;若干个命令行2&#8221;。</font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">　　until命令是另一种循环结构，它和while命令相似，其格式如下：</font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">　　until</font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">　　 若干个命令行1</font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">　　do</font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">　　 若干个命令行2</font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">　　done</font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">　　until循环和while循环的区别在于：while循环在条件为真时继续执行循环，而until则是在条件为假时继续执行循环。</font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">　　Shell还提供了true和false两条命令用于创建无限循环结构，它们的返回状态分别是总为0或总为非0。</font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">　　5．case条件选择</font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">　　if条件语句用于在两个选项中选定一项，而case条件选择为用户提供了根据字串或变量的值从多个选项中选择一项的方法，其格式如下：</font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">　　case string in</font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">　　exp-1)</font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">　　若干个命令行1</font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">　　；；</font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">　　exp-2)</font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">　　 若干个命令行2</font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">　　；；</font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">　　&#8230;&#8230;</font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">　　*)</font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">　　其他命令行</font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">　　esac</font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">　　Shell通过计算字串string的值，将其结果依次和运算式exp-1, exp-2等进行比较，直到找到一个匹配的运算式为止。如果找到了匹配项，则执行它下面的命令直到遇到一对分号(；；)为止。</font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">　　在case运算式中也可以使用Shell的通配符（&#8220;*&#8221;、&#8220;？&#8221;、&#8220;[ ]&#8221;）。通常用 * 作为case命令的最后运算式以便在前面找不到任何相应的匹配项时执行&#8220;其他命令行&#8221;的命令。</font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">　　6．无条件控制语句break和continue</font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">　　break用于立即终止当前循环的执行，而contiune用于不执行循环中后面的语句而立即开始下一个循环的执行。这两个语句只有放在do和done之间才有效。</font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">　　7．函数定义</font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">　　在Shell中还可以定义函数。函数实际上也是由若干条Shell命令组成的，因此它与Shell程序形式上是相似的，不同的是它不是一个单独的进程，而是Shell程序的一部分。函数定义的基本格式为：</font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">　　functionname</font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">　　{</font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">　　 若干命令行</font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">　　}</font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">　　调用函数的格式为：</font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">　　functionname param1 param2&#8230;</font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">　　Shell函数可以完成某些例行的工作，而且还可以有自己的退出状态，因此函数也可以作为if, while等控制结构的条件。</font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">　　在函数定义时不用带参数说明，但在调用函数时可以带有参数，此时Shell将把这些参数分别赋予相应的位置参数$1, $2, ...及$*。</font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">　　8．命令分组</font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">
在Shell中有两种命令分组的方法：()和{}。前者当Shell执行()中的命令时将再创建一个新的子进程，然后这个子进程去执行圆括弧中的命令。
当用户在执行某个命令时不想让命令运行时对状态集合（如位置参数、环境变量、当前工作目录等）的改变影响到下面语句的执行时，就应该把这些命令放在圆括弧
中，这样就能保证所有的改变只对子进程产生影响，而父进程不受任何干扰。{}用于将顺序执行的命令的输出结果用于另一个命令的输入（管道方式）。当我们要
真正使用圆括弧和花括弧时（如计算运算式的优先顺序），则需要在其前面加上转义符（）以便让Shell知道它们不是用于命令执行的控制所用。</font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">　　9．信号</font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">　　trap命令用于在Shell程序中捕捉信号，之后可以有3种反应方式：</font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">　　（1）执行一段程序来处理这一信号。</font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">　　（2）接受信号的默认操作。</font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">　　（3）忽视这一信号。</font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">　　trap对上面3种方式提供了3种基本形式：</font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">　　第一种形式的trap命令在Shell接收到与signal list清单中数值相同的信号时，将执行双引号中的命令串。</font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">　　trap 'commands' signal-list</font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">　　trap "commands" signal-list</font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">　　为了恢复信号的默认操作，使用第二种形式的trap命令：</font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">　　trap signal-list</font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">　　第三种形式的trap命令允许忽略信号：</font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">　　trap " " signal-list</font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">　　注意：</font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">　　（1）对信号11（段违例）不能捕捉，因为Shell本身需要捕捉该信号去进行内存的转储。</font></font></p>
<p><font class="f14" id="zoom"><font color="#000000">　　（2）在trap中可以定义对信号0的处理（实际上没有这个信号），Shell程序在其终止（如执行exit语句）时发出该信号。
<p>　　（3）在捕捉到signal-list中指定的信号并执行完相应的命令之后，如果这些命令没有将Shell程序终止的话，Shell程序将继续执行收到信号时所执行的命令后面的命令，这样将很容易导致Shell程序无法终止。</p>
<p>
另外，在trap语句中，单引号和双引号是不同的。当Shell程序第一次碰到trap语句时，将把commands中的命令扫描一遍。此时若
commands是用单引号括起来的话，那么Shell不会对commands中的变量和命令进行替换，否则commands中的变量和命令将用当时具体
的值来替换。<strong>运行Shell程序的方法</strong></p>
<p>　　用户可以用任何编辑程序来编写Shell程序。因为
Shell程序是解释执行的，所以不需要编译成目的程序。按照Shell编程的惯例，以bash为例，程序的第一行一般为&#8220;#！/bin/bash&#8221;，其
中 # 表示该行是注释，叹号 ！
告诉Shell运行叹号之后的命令并用文档的其余部分作为输入，也就是运行/bin/bash并让/bin/bash去执行Shell程序的内容。</p>
<p>　　执行Shell程序的方法有3种。</p>
<p>　　1．sh Shell程序文件名</p>
<p>　　这种方法的命令格式为：</p>
<p>　　bash Shell程序文件名</p>
<p>　　这实际上是调用一个新的bash命令解释程序，而把Shell程序文件名作为参数传递给它。新启动的Shell将去读指定的文件，可执行文件中列出的命令，当所有的命令都执行完后结束。该方法的优点是可以利用Shell调试功能。</p>
<p>　　2．sh</p>
<p>　　格式为：</p>
<p>　　bash&lt; Shell程序名</p>
<p>　　这种方式就是利用输入重定向，使Shell命令解释程序的输入取自指定的程序文件。</p>
<p>　　3．用chmod命令使Shell程序成为可执行的</p>
<p>　　一个文件能否运行取决于该文档的内容本身可执行且该文件具有执行权。对于Shell程序，当用编辑器生成一个文件时，系统赋予的许可权都是644(rw-r-r--)，因此，当用户需要运行这个文件时，只需要直接键入文件名即可。</p>
<p>
在这3种运行Shell程序的方法中，最好按下面的方式选择：当刚创建一个Shell程序，对它的正确性还没有把握时，应当使用第一种方式进行调试。当
一个Shell程序已经调试好时，应使用第三种方式把它固定下来，以后只要键入相应的文件名即可，并可被另一个程序所调用。</p>
<p>　　4．bash程序的调试</p>
<p>　　在编程过程中难免会出错，有的时候，调试程序比编写程序花费的时间还要多，Shell程序同样如此。</p>
<p>　　Shell程序的调试主要是利用bash命令解释程序的选择项。调用bash的形式是：</p>
<p>　　bash -选择项Shell程序文件名</p>
<p>　　几个常用的选择项是：</p>
<p>　　-e 如果一个命令失败就立即退出。</p>
<p>　　-n 读入命令但是不执行它们。</p>
<p>　　-u 置换时把未设置的变量看做出错。</p>
<p>　　-v 当读入Shell输入行时把它们显示出来。</p>
<p>　　-x 执行命令时把命令和它们的参数显示出来。</p>
<p>　　上面的所有选项也可以在Shell程序内部用&#8220;set -选择项&#8221;的形式引用，而&#8220;set +选择项&#8221;则将禁止该选择项起作用。如果只想对程序的某一部分使用某些选择项时，则可以将该部分用上面两个语句包围起来。</p>
<p>　　（1）未置变量退出和立即退出</p>
<p>
未置变量退出特性允许用户对所有变量进行检查，如果引用了一个未赋值的变量就终止Shell程序的执行。Shell通常允许未置变量的使用，在这种情况
下，变量的值为空。如果设置了未置变量退出选择项，则一旦使用了未置变量就显示错误信息，并终止程序的运行。未置变量退出选择项为-u。</p>
<p>
当Shell运行时，若遇到不存在或不可执行的命令、重定向失败或命令非正常结束等情况时，如果未经重新定向，该出错信息会显示在终端屏幕上，而
Shell程序仍将继续执行。要想在错误发生时迫使Shell程序立即结束，可以使用-e选项将Shell程序的执行立即终止。</p>
<p>　　（2）Shell程序的跟踪</p>
<p>
调试Shell程序的主要方法是利用Shell命令解释程序的-v或-x选项来跟踪程序的执行。-v选择项使Shell在执行程序的过程中，把它读入的
每一个命令行都显示出来，而-x选择项使Shell在执行程序的过程中把它执行的每一个命令在行首用一个+加上命令名显示出来。并把每一个变量和该变量所
取的值也显示出来。因此，它们的主要区别在于：在执行命令行之前无-v，则显示出命令行的原始内容，而有-v时则显示出经过替换后的命令行的内容。</p>
<p>
除了使用Shell的-v和-x选择项以外，还可以在Shell程序内部采取一些辅助调试的措施。例如，可以在Shell程序的一些关键地方使用
echo命令把必要的信息显示出来，它的作用相当于C语言中的printf语句，这样就可以知道程序运行到什么地方及程序目前的状态。<strong>bash的内部命令</strong></p>
<p>
bash命令解释套装程序包含了一些内部命令。内部命令在目录列表时是看不见的，它们由Shell本身提供。常用的内部命令有：echo,
eval, exec, export, readonly, read, shift, wait和点(.)。下面简单介绍其命令格式和功能。</p>
<p>　　1．echo</p>
<p>　　命令格式：echo arg</p>
<p>　　功能：在屏幕上显示出由arg指定的字串。</p>
<p>　　2．eval</p>
<p>　　命令格式：eval args</p>
<p>　　功能：当Shell程序执行到eval语句时，Shell读入参数args，并将它们组合成一个新的命令，然后执行。</p>
<p>　　3．exec</p>
<p>　　命令格式：exec命令参数</p>
<p>　　功能：当Shell执行到exec语句时，不会去创建新的子进程，而是转去执行指定的命令，当指定的命令执行完时，该进程（也就是最初的Shell）就终止了，所以Shell程序中exec后面的语句将不再被执行。</p>
<p>　　4．export</p>
<p>　　命令格式：export变量名 或：export变量名=变量值</p>
<p>　　功能：Shell可以用export把它的变量向下带入子Shell，从而让子进程继承父进程中的环境变量。但子Shell不能用export把它的变量向上带入父Shell。</p>
<p>　　注意：不带任何变量名的export语句将显示出当前所有的export变量。</p>
<p>　　5．readonly</p>
<p>　　命令格式：readonly变量名</p>
<p>　　功能：将一个用户定义的Shell变量标识为不可变。不带任何参数的readonly命令将显示出所有只读的Shell变量。</p>
<p>　　6．read</p>
<p>　　命令格式：read变量名表</p>
<p>　　功能：从标准输入设备读入一行，分解成若干字，赋值给Shell程序内部定义的变量。</p>
<p>　　7．shift语句</p>
<p>　　功能：shift语句按如下方式重新命名所有的位置参数变量，即$2成为$1，$3成为$2&#8230;在程序中每使用一次shift语句，都使所有的位置参数依次向左移动一个位置，并使位置参数$#减1，直到减到0为止。</p>
<p>　　8．wait</p>
<p>　　功能：使Shell等待在后台启动的所有子进程结束。wait的返回值总是真。</p>
<p>　　9．exit</p>
<p>　　功能：退出Shell程序。在exit之后可有选择地指定一个数位作为返回状态。</p>
<p>　　10．&#8220;.&#8221;（点）</p>
<p>　　命令格式：. Shell程序文件名</p>
<p>　　功能：使Shell读入指定的Shell程序文件并依次执行文件中的所有语句。</p>
</font></font></p>
<img src ="http://www.blogjava.net/josson/aggbug/216334.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/josson/" target="_blank">josson</a> 2008-07-21 13:14 <a href="http://www.blogjava.net/josson/archive/2008/07/21/216334.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Linux的一些命令</title><link>http://www.blogjava.net/josson/archive/2008/07/21/216310.html</link><dc:creator>josson</dc:creator><author>josson</author><pubDate>Mon, 21 Jul 2008 03:33:00 GMT</pubDate><guid>http://www.blogjava.net/josson/archive/2008/07/21/216310.html</guid><wfw:comment>http://www.blogjava.net/josson/comments/216310.html</wfw:comment><comments>http://www.blogjava.net/josson/archive/2008/07/21/216310.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/josson/comments/commentRss/216310.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/josson/services/trackbacks/216310.html</trackback:ping><description><![CDATA[1、修改linux系统默认的1024个文件上限。<br />
在/root/.bash_profile文件中加入：ulimit -n 4096<br />
<br />
2、查看某个进程打开的文件数：<br />
先用ps -aux找到pid,然后运行lsof -p&nbsp;%pid% | wc -l<br />
<br />
<p>3、查看80端口的连接数<br />
netstat -nat|grep -i &#8220;80&#8243;|wc -l <br />
</p>
<p>4、查看系统内核版本<br />
uname &nbsp; -a <br />
</p>
<p>5、查看Linux版本</p>
登录到服务器执行 lsb_release -a ，即可列出所有版本信息 <br />
<br />
6、查看目录空间<br />
du -h --max-depth=2 | sort -n
<img src ="http://www.blogjava.net/josson/aggbug/216310.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/josson/" target="_blank">josson</a> 2008-07-21 11:33 <a href="http://www.blogjava.net/josson/archive/2008/07/21/216310.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Mysql 自启动脚本</title><link>http://www.blogjava.net/josson/archive/2008/01/23/177212.html</link><dc:creator>josson</dc:creator><author>josson</author><pubDate>Wed, 23 Jan 2008 02:53:00 GMT</pubDate><guid>http://www.blogjava.net/josson/archive/2008/01/23/177212.html</guid><wfw:comment>http://www.blogjava.net/josson/comments/177212.html</wfw:comment><comments>http://www.blogjava.net/josson/archive/2008/01/23/177212.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/josson/comments/commentRss/177212.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/josson/services/trackbacks/177212.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 1、命令控制启动：/usr/local/mysql/bin/mysqld-safe --user=mysql &amp;停止：/usr/local/mysql/bin/mysqladmin&nbsp;-u root -p pwd shutdown2、自启动sh脚本（mysqld 存放于/etc/init.d目录下，注意下面mysql数据所在路径）Code highl...&nbsp;&nbsp;<a href='http://www.blogjava.net/josson/archive/2008/01/23/177212.html'>阅读全文</a><img src ="http://www.blogjava.net/josson/aggbug/177212.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/josson/" target="_blank">josson</a> 2008-01-23 10:53 <a href="http://www.blogjava.net/josson/archive/2008/01/23/177212.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SSH、SCP 远程控制、文件传输</title><link>http://www.blogjava.net/josson/archive/2008/01/23/177208.html</link><dc:creator>josson</dc:creator><author>josson</author><pubDate>Wed, 23 Jan 2008 02:38:00 GMT</pubDate><guid>http://www.blogjava.net/josson/archive/2008/01/23/177208.html</guid><wfw:comment>http://www.blogjava.net/josson/comments/177208.html</wfw:comment><comments>http://www.blogjava.net/josson/archive/2008/01/23/177208.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/josson/comments/commentRss/177208.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/josson/services/trackbacks/177208.html</trackback:ping><description><![CDATA[1、SSH <br />
远程登录远程服务器：ssh root@192.168.1.100，按提示输入密码，即可登录远程服务器进行操作。<br />
<br />
2、SCP<br />
<span lang="EN-US">scp</span>
<span style="font-family: 宋体;">就是</span>
<span lang="EN-US">secure copy,</span>
<span style="font-family: 宋体;">是用来进行远程文件拷贝。</span><span style="font-family: 宋体;">数据传输使用</span><span lang="EN-US">ssh1，</span><span style="font-family: 宋体;">并且和</span><span lang="EN-US">ssh1</span><span style="font-family: 宋体;">使用相同的认证方式</span>，<span style="font-family: 宋体;">提供相同的安全保证</span>。<span style="font-family: 宋体;">与</span><span lang="EN-US">rcp</span><span style="font-family: 宋体;">不同的是，</span><span lang="EN-US">scp</span><span style="font-family: 宋体;">会要求你输入密码</span>。命令格式如下：<br />
<p class="MsoNormal">
<strong><span lang="EN-US">scp </span><span style="font-family: 宋体;">本地用户名</span><span lang="EN-US">@IP</span><span style="font-family: 宋体;">地址</span><span lang="EN-US">:</span><span style="font-family: 宋体;">文件名</span><span lang="EN-US">1&nbsp; </span><span style="font-family: 宋体;">远程用户名</span><span lang="EN-US">@IP</span><span style="font-family: 宋体;">地址</span><span lang="EN-US">:</span><span style="font-family: 宋体;">文件名</span><span lang="EN-US">2</span></strong></p>
<p class="MsoNormal"><strong><span lang="EN-US">选项说明（详细的可用 man scp</span></strong><strong><span lang="EN-US">查询</span></strong><strong><span lang="EN-US">）：</span></strong></p>
<p class="MsoNormal">
<span lang="EN-US">&nbsp;&nbsp;&nbsp; -v </span>
<span style="font-family: 宋体;">和大多数</span>
<span lang="EN-US">linux</span>
<span style="font-family: 宋体;">命令中的</span>
<span lang="EN-US">-v</span>
<span style="font-family: 宋体;">意思一样</span>
<span lang="EN-US">,</span>
<span style="font-family: 宋体;">用来显示进度</span>
<span lang="EN-US">.</span>
<span style="font-family: 宋体;">可以用来查看连接</span>
<span lang="EN-US">,</span>
<span style="font-family: 宋体;">认证</span>
<span lang="EN-US">,</span>
<span style="font-family: 宋体;">或是配置错误</span>
<span lang="EN-US">.</span>
</p>
<p class="MsoNormal">
<span lang="EN-US">&nbsp;&nbsp;&nbsp; -C </span>
<span style="font-family: 宋体;">使能压缩选项</span>
<span lang="EN-US">.</span>
</p>
<p class="MsoNormal">
<span lang="EN-US">&nbsp;&nbsp;&nbsp; -P </span>
<span style="font-family: 宋体;">选择端口</span>
<span lang="EN-US">.</span>
<span style="font-family: 宋体;">注意</span>
<span lang="EN-US">-p</span>
<span style="font-family: 宋体;">已经被</span>
<span lang="EN-US">rcp</span>
<span style="font-family: 宋体;">使用</span>
<span lang="EN-US">.</span>
</p>
<p class="MsoNormal">
<span lang="EN-US">&nbsp;&nbsp;&nbsp; -4 </span>
<span style="font-family: 宋体;">强行使用</span>
<span lang="EN-US">IPV4</span>
<span style="font-family: 宋体;">地址</span>
<span lang="EN-US">.</span>
</p>
<p class="MsoNormal">
<span lang="EN-US">&nbsp;&nbsp;&nbsp; -6 </span>
<span style="font-family: 宋体;">强行使用</span>
<span lang="EN-US">IPV6</span>
<span style="font-family: 宋体;">地址</span>
<span lang="EN-US">.<o:p><br />
</o:p></span>
</p>
<p class="MsoNormal">
<span lang="EN-US">
<span>&nbsp;&nbsp;&nbsp;&nbsp; </span>-r
Recursively copy entire directories.</span>
</p>
<p class="MsoNormal">
</p>
<p class="MsoNormal">注：ip地址和文件名之间有":"，且两台服务器的ssh1版本不一致的话可能会有问题。<br />
</p>
<br />
<br />
<img src ="http://www.blogjava.net/josson/aggbug/177208.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/josson/" target="_blank">josson</a> 2008-01-23 10:38 <a href="http://www.blogjava.net/josson/archive/2008/01/23/177208.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Linux 抓包分析工具。</title><link>http://www.blogjava.net/josson/archive/2008/01/21/176774.html</link><dc:creator>josson</dc:creator><author>josson</author><pubDate>Mon, 21 Jan 2008 07:39:00 GMT</pubDate><guid>http://www.blogjava.net/josson/archive/2008/01/21/176774.html</guid><wfw:comment>http://www.blogjava.net/josson/comments/176774.html</wfw:comment><comments>http://www.blogjava.net/josson/archive/2008/01/21/176774.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/josson/comments/commentRss/176774.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/josson/services/trackbacks/176774.html</trackback:ping><description><![CDATA[tcpdump是一个Sniffer工具，实际上就是一个网络上的抓包工具，同时还可以对抓到的包进行分析。一般系统都默认安装。相关介绍及安装说明可参见: <a title="Tcpdump的安装和使用" href="http://fanqiang.chinaunix.net/a5/b6/20010911/1500001274.html">Tcpdump的安装和使用。</a><br />
<br />
<br />
&nbsp;&nbsp;&nbsp; <strong>tcpdump命令说明：</strong><br />
tcpdump采用命令行方式，它的命令格式为：<br />
tcpdump [ -adeflnNOpqStvx ] [ -c 数量 ] [ -F 文件名 ]<br />
[ -i 网络接口 ] [ -r 文件名] [ -s snaplen ]<br />
[ -T 类型 ] [ -w 文件名 ] [表达式 ]<br />
<br />
<strong>tcpdump的选项介绍:</strong><br />
-a 　　　将网络地址和广播地址转变成名字；<br />
-d 　　　将匹配信息包的代码以人们能够理解的汇编格式给出；<br />
-dd 　　　将匹配信息包的代码以c语言程序段的格式给出；<br />
-ddd 　　　将匹配信息包的代码以十进制的形式给出；<br />
-e 　　　在输出行打印出数据链路层的头部信息；<br />
-f 　　　将外部的Internet地址以数字的形式打印出来；<br />
-l 　　　使标准输出变为缓冲行形式；<br />
-n 　　　不把网络地址转换成名字；<br />
-t 　　　在输出的每一行不打印时间戳；<br />
-v 　　　输出一个稍微详细的信息，例如在ip包中可以包括ttl和服务类型的信息；<br />
-vv 　　　输出详细的报文信息；<br />
-c 　　　在收到指定的包的数目后，tcpdump就会停止；<br />
-F 　　　从指定的文件中读取表达式,忽略其它的表达式；<br />
-i 　　　指定监听的网络接口；<br />
-r 　　　从指定的文件中读取包(这些包一般通过-w选项产生)；<br />
-w 　　　直接将包写入文件中，并不分析和打印出来；<br />
-T 　　　将监听到的包直接解释为指定的类型的报文，常见的类型有rpc （远程过程 调用）和snmp（简单　　　　　　　网络管理协议；）<br />
<br />
&nbsp;&nbsp;&nbsp; &nbsp; -s&nbsp;&nbsp;  &nbsp;&nbsp;  设置抓包大小限制，默认抓包大小限制在96个BYTE（包括以太网帧）。修改参数为：<strong>-s 0</strong>。0 则忽略包的大小限制，按包的长度实际长度抓取。<br />
<br />
&nbsp;&nbsp;&nbsp; 例：tcpdump <strong>-vv</strong> <strong>tcp port</strong> 5270 <strong>-c</strong> 100 <strong>-s</strong> 1500 <strong>-w</strong> /opt/sniffer.pack<br />
<img src ="http://www.blogjava.net/josson/aggbug/176774.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/josson/" target="_blank">josson</a> 2008-01-21 15:39 <a href="http://www.blogjava.net/josson/archive/2008/01/21/176774.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Linux: Too many open files问题?</title><link>http://www.blogjava.net/josson/archive/2007/11/21/162128.html</link><dc:creator>josson</dc:creator><author>josson</author><pubDate>Wed, 21 Nov 2007 09:02:00 GMT</pubDate><guid>http://www.blogjava.net/josson/archive/2007/11/21/162128.html</guid><wfw:comment>http://www.blogjava.net/josson/comments/162128.html</wfw:comment><comments>http://www.blogjava.net/josson/archive/2007/11/21/162128.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/josson/comments/commentRss/162128.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/josson/services/trackbacks/162128.html</trackback:ping><description><![CDATA[Linux系统默认最大打开文件数为1024个。<br />
<br />
1、相关命令：<br />
ulimit &#8211;a //查看当前设置<br />
ulimit &#8211;n 2048 //即设成2048，按实际需要设置<br />
<br />
2、用户环境参数文件配置：<br />
在/etc/profile中加入如下内容： <br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;[&nbsp;$SHELL&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">/bin/ksh</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;];&nbsp;then&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />ulimit&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">p&nbsp;</span><span style="color: #000000">16384</span><span style="color: #000000">&nbsp;ulimit&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">n&nbsp;</span><span style="color: #000000">65536</span><span style="color: #000000">&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />ulimit&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">u&nbsp;</span><span style="color: #000000">16384</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">n&nbsp;</span><span style="color: #000000">65536</span><span style="color: #000000">&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />fi</span></div>
<img src ="http://www.blogjava.net/josson/aggbug/162128.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/josson/" target="_blank">josson</a> 2007-11-21 17:02 <a href="http://www.blogjava.net/josson/archive/2007/11/21/162128.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>vi命令</title><link>http://www.blogjava.net/josson/archive/2007/07/05/128273.html</link><dc:creator>josson</dc:creator><author>josson</author><pubDate>Thu, 05 Jul 2007 02:52:00 GMT</pubDate><guid>http://www.blogjava.net/josson/archive/2007/07/05/128273.html</guid><wfw:comment>http://www.blogjava.net/josson/comments/128273.html</wfw:comment><comments>http://www.blogjava.net/josson/archive/2007/07/05/128273.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/josson/comments/commentRss/128273.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/josson/services/trackbacks/128273.html</trackback:ping><description><![CDATA[进入vi的命令<br>vi filename :打开或新建文件，并将光标置于第一行首<br>vi +n filename ：打开文件，并将光标置于第n行首<br>vi + filename ：打开文件，并将光标置于最后一行首<br>vi +/pattern filename：打开文件，并将光标置于第一个与pattern匹配的串处<br>vi -r filename ：在上次正用vi编辑时发生系统崩溃，恢复filename<br>vi filename....filename ：打开多个文件，依次编辑<br><br>移动光标类命令<br>h ：光标左移一个字符<br>l ：光标右移一个字符<br>space：光标右移一个字符<br>Backspace：光标左移一个字符<br>k或Ctrl+p：光标上移一行<br>j或Ctrl+n ：光标下移一行<br>Enter ：光标下移一行<br>w或W ：光标右移一个字至字首<br>b或B ：光标左移一个字至字首<br>e或E ：光标右移一个字j至字尾<br>) ：光标移至句尾<br>( ：光标移至句首<br>}：光标移至段落开头<br>{：光标移至段落结尾<br>nG：光标移至第n行首<br>n+：光标下移n行<br>n-：光标上移n行<br>n$：光标移至第n行尾<br>H ：光标移至屏幕顶行<br>M ：光标移至屏幕中间行<br>L ：光标移至屏幕最后行<br>0：（注意是数字零）光标移至当前行首<br>$：光标移至当前行尾<br><br>屏幕翻滚类命令<br>Ctrl+u：向文件首翻半屏<br>Ctrl+d：向文件尾翻半屏<br>Ctrl+f：向文件尾翻一屏<br>Ctrl＋b；向文件首翻一屏<br>nz：将第n行滚至屏幕顶部，不指定n时将当前行滚至屏幕顶部。<br><br>插入文本类命令<br>i ：在光标前<br>I ：在当前行首<br>a：光标后<br>A：在当前行尾<br>o：在当前行之下新开一行<br>O：在当前行之上新开一行<br>r：替换当前字符<br>R：替换当前字符及其后的字符，直至按ESC键<br>s：从当前光标位置处开始，以输入的文本替代指定数目的字符<br>S：删除指定数目的行，并以所输入文本代替之<br>ncw或nCW：修改指定数目的字<br>nCC：修改指定数目的行<br><br>删除命令<br>ndw或ndW：删除光标处开始及其后的n-1个字<br>do：删至行首<br>d$：删至行尾<br>ndd：删除当前行及其后n-1行<br>x或X：删除一个字符，x删除光标后的，而X删除光标前的<br>Ctrl+u：删除输入方式下所输入的文本<br><br>搜索及替换命令 :<br>/pattern：从光标开始处向文件尾搜索pattern<br>?pattern：从光标开始处向文件首搜索pattern<br>n：在同一方向重复上一次搜索命令<br>N：在反方向上重复上一次搜索命令<br>：s/p1/p2/g：将当前行中所有p1均用p2替代<br>：n1,n2s/p1/p2/g：将第n1至n2行中所有p1均用p2替代<br>：g/p1/s//p2/g：将文件中所有p1均用p2替换<br><br>选项设置<br>all：列出所有选项设置情况<br>term：设置终端类型<br>ignorance：在搜索中忽略大小写<br>list：显示制表位(Ctrl+I)和行尾标志（$)<br>number：显示行号<br>report：显示由面向行的命令修改过的数目<br>terse：显示简短的警告信息<br>warn：在转到别的文件时若没保存当前文件则显示NO write信息<br>nomagic：允许在搜索模式中，使用前面不带&#8220;\\&#8221;的特殊字符<br>nowrapscan：禁止vi在搜索到达文件两端时，又从另一端开始<br>mesg：允许vi显示其他用户用write写到自己终端上的信息<br><br>最后行方式命令<br>：n1,n2 co n3：将n1行到n2行之间的内容拷贝到第n3行下<br>：n1,n2 m n3：将n1行到n2行之间的内容移至到第n3行下<br>：n1,n2 d ：将n1行到n2行之间的内容删除<br>：w ：保存当前文件<br>：e filename：打开文件filename进行编辑<br>：x：保存当前文件并退出<br>：q：退出vi<br>：q!：不保存文件并退出vi<br>：!command：执行shell命令command<br>：n1,n2 w!command：将文件中n1行至n2行的内容作为command的输入并执行之，若不指<br>定n1，n2，则表示将整个文件内容作为command的输入<br>：r!command：将命令command的输出结果放到当前行 。<br><br>&nbsp;<br><br>1.交换两个字符位置<br><br>xp<br>2.上下两行调换<br>ddp<br>3.把文件内容反转<br>:g/^/m0/ (未通过)<br><br>4.上下两行合并<br>J<br>5.删除所有行<br>dG<br>6.从当前位置删除到行尾<br>d$<br>7.从当前位置复制到行尾<br>y$ 如果要粘贴到其他地方 p 就可以了<br><br><br>由于vi 是建立在 EX 上的 所以 当键入 : 时就来到了 EX 命令状态<br>8.<br>:ab string strings<br>例如 ":ab usa United States of America" ,<br>当你在文见里插入 usa 时<br>United States of America 就蹦出来了<br>9.<br>:map keys new_seq<br>定义你当前 键盘命令<br>10.<br>:set [all]<br>vi or ex 的编辑状态<br>如 显示每行 :set nu<br>11.<br>在命令状态下，nyy表示拷贝从光标行起的下n行内容，p表示paste,可刚复制的内容粘贴在光标处的<br>下面。<br><br>12.<br>单个字符替换用r，覆盖多个字符用R，用多个字符替换一个字符用s，整行替换用S<br><br>13.<br><br>:%s/old_word/new_word/g<br>这个指令是于在整个文件中替换特定字符串<br><br>14.光标控制<br><br>k:上移 nk 上移n行<br>j:下移 nj 下移n行<br><br><br>将光标移到第n行，按下 mk<br>将光标移到第m行，按下 "ay'k<br>即将第n到m的行存到a寄存器，以此类推，b，c........寄存器等<br><br>这样就可以将你常用的需要复用的内容粘贴到不同的寄存器中以备用<br><br><br>想粘贴到某处，直接将光标移到某地，按下 &#8216;ap 即可,以此类推，b，c........寄存器等<br><br>在当前屏幕中<br>H 跳到第一行<br>M 跳到中间一行<br>L 跳到最后一行<br><br>15.<br>表8-2 删除命令<br>删除命令操作<br>d l 删除当前字符（与x命令功能相同）<br>d 0 删除到某一行的开始位置<br>d ^ 删除到某一行的第一个字符位置（不包括空格或TA B字符）<br>d w 删除到某个单词的结尾位置<br>d 3 w 删除到第三个单词的结尾位置<br>d b 删除到某个单词的开始位置<br>d W 删除到某个以空格作为分隔符的单词的结尾位置<br>d B 删除到某个以空格作为分隔符的单词的开始位置<br>d 7 B 删除到前面7个以空格作为分隔符的单词的开始位置<br>d） 删除到某个语句的结尾位置<br>d 4） 删除到第四个语句的结尾位置<br>d（ 删除到某个语句的开始位置<br>d } 删除到某个段落的结尾位置<br>d { 删除到某个段落的开始位置<br>d 7 { 删除到当前段落起始位置之前的第7个段落位置<br>d d 删除当前行<br>d /t e x t 删除从文本中出现&#8220; t e x t&#8221;中所指定字样的位置，一直向前直到下一个该字样所出现的<br>位置（但不包括该字样）之间的内容<br>d fc 删除从文本中出现字符&#8220;c&#8221;的位置，一直向前直到下一个该字符所出现的位置（包括<br>该字符）之间的内容<br>d tc 删除当前行直到下一个字符&#8220; c&#8221;所出现位置之间的内容<br>D 删除到某一行的结尾<br>d $ 删除到某一行的结尾<br>5 d d 删除从当前行所开始的5行内容<br>d L 删除直到屏幕上最后一行的内容<br>d H 删除直到屏幕上第一行的内容<br>d G 删除直到工作缓存区结尾的内容<br>d 1 G 删除直到工作缓存区开始的内容<br><br>修改命令操作<br>c l 更改当前字符<br>c w 修改到某个单词的结尾位置<br>c 3 w 修改到第三个单词的结尾位置<br>c b 修改到某个单词的开始位置<br>c W 修改到某个以空格作为分隔符的单词的结尾位置<br>c B 修改到某个以空格作为分隔符的单词的开始位置<br>c 7 B 修改到前面7个以空格作为分隔符的单词的开始位置<br>c 0 修改到某行的结尾位置<br>c） 修改到某个语句的结尾位置<br>c 4） 修改到第四个语句的结尾位置<br>c（ 修改到某个语句的开始位置<br>c } 修改到某个段落的结尾位置<br>c { 修改到某个段落的开始位置<br>c 7 { 修改到当前段落起始位置之前的第7个段落位置<br>c tc 修改当前行直到下一个字符c所出现位置之间的内容<br>C 修改到某一行的结尾<br>c c 修改当前行<br>5 c c 修改从当前行所开始的5行内容<br><br><br>.重复上一次修改！<br><br><br>表8-4 替换命令<br>替换命令操作<br>s 将当前字符替换为一个或多个字符<br>S 将当前行替换为一个或多个字符<br>5 s 将从当前字符开始的5个字符替换为一个或多个字符<br><br><br>vi替换使用规则：<br>:g/s1/s/s2/s3/g<br>第一个g表示对每一个包括s1的行都进行替换，第二个g表示对每一行包括s1的行所有的s2都用s3替换<br>s表示替换，s2是要被替换的字符串，他可以和s1相同（如果相同的话用//代替），s3是替换字符串<br><br><br>16.<br><br>fx<br>往右移动到 x 字符上<br>Fx<br>往左移动到 x 字符上<br>tx<br>往右移动到 x 字符前<br>Tx<br>往左移动到 x 字符后<br>（注意：以上四个命令中，其中x是键入的字符）<br>;<br>分号，配合 f 和 t 使用，重复一次<br>,<br>逗号，配合 f 和 t 使用，反方向重复一次<br><br><br>17. vi 环境选项 Solaris ksh<br><br>noautoindent nomodelines noshowmode<br>autoprint nonumber noslowopen<br>noautowrite nonovice tabstop=8<br>nobeautify nooptimize taglength=0<br>directory=/var/tmp paragraphs=IPLPPPQPP LIpplpipnpbtags=tags /usr/lib/tags<br>noedcompatible prompt tagstack<br>noerrorbells noreadonly term=vt100<br>noexrc redraw noterse<br>flash remap timeout<br>hardtabs=8 report=5 ttytype=vt100<br>noignorecase scroll=11 warn<br>nolisp sections=NHSHH HUuhsh+c window=23<br>nolist shell=/bin/ksh wrapscan<br>magic shiftwidth=8 wrapmargin=0<br>mesg noshowmatch nowriteany<br><br><br>For C-Shell:<br>setenv EXINIT "set nu"<br>For Bourne or Korn Shell:<br>EXINIT="set nu"; export EXINIT<br>For Korn Shell Only (alternate method):<br>typeset -x EXINIT="set nu"<br>在 .profile 里设置 vi 的环境选项 , 以上均测试过<br><br><br>18.标记文本<br><br>　　mchar　　 用字母char标记当前光标的位置<br>　　`char 　　移至char所标记处<br>　　'char　　 移至char标记所在行的开头处<br>　　"　　　　 移至当前行上一次所在位置（在光标移动之后）――一个双引号<br>　　''　　　　移至当前行上第一次所在位置的行的开头处(在光标移动之后)――两个单引号<br><br><br>19.<br>同时vi多个文件时，CTRL-SHIFT-6回到上一个文件，在本次vi的文件和上次vi的文件之间切换。<br>但是我发现一个BUG：在用CTRL-SHIFT-6切换到上一个文件后，用:args查看多文件vi状态时，<br>屏幕底部仍然显示目前vi的是刚才的文件。<br>(在HP-UX,Solaris,AIX上通过)<br><br>也可以使用:<br>:e#<br>进行切换<br><br>20.<br>sco 下VI 要在文本前同样的字符加用<br>%s/^/要加的内容/g 要在文本后同样的字符加<br>%s/$/要加的内容/g<br><br>21.<br>如何去掉文本中的 ^M 硬回车？不必用binary传回去再ascii传回来的方式，用shell或者unix语句实现。<br><br>cat filename |tr -d '\015' &gt;newfile<br>不同的unix系统还存在一些其他不同的命令,如:doscp<br>sed 也可以实现这个功能.<br><br>dos2unix filename filename2<br>反之<br>unix2dos filename filename2<br><br>在vi 中用:$s/^M//g<br>^是crtl-V crtl-M<br><br><br>22.如何在&#8220;unix命令行&#8221;下将一个文件的某字符串用另一个串换掉<br><br>sed 's/string1/string2/gp' file1 &gt; file2<br><br>23.将/etc/hosts下所有的地址都ping 2次<br><br>1 #/usr/bin/sh<br>2 #grad /etc/hosts and ping each address<br>3 cat /etc/hosts|grep -v '^#' | while read LINE<br>4 do<br>5 ADDR=`awk '{print $1}'`<br>6 for MACHINE in $ADDR<br>7 do<br>8 ping $MACHINE -n 2<br>9 done<br>10 done<img src ="http://www.blogjava.net/josson/aggbug/128273.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/josson/" target="_blank">josson</a> 2007-07-05 10:52 <a href="http://www.blogjava.net/josson/archive/2007/07/05/128273.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Linux (debian) ssh 安装.</title><link>http://www.blogjava.net/josson/archive/2007/07/05/128272.html</link><dc:creator>josson</dc:creator><author>josson</author><pubDate>Thu, 05 Jul 2007 02:51:00 GMT</pubDate><guid>http://www.blogjava.net/josson/archive/2007/07/05/128272.html</guid><wfw:comment>http://www.blogjava.net/josson/comments/128272.html</wfw:comment><comments>http://www.blogjava.net/josson/archive/2007/07/05/128272.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/josson/comments/commentRss/128272.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/josson/services/trackbacks/128272.html</trackback:ping><description><![CDATA[1、安装命令：apt-get install openssh-server<br><br>2、启动/停止服务：/etc/init.d/ssh start|stop|restart<br><img src ="http://www.blogjava.net/josson/aggbug/128272.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/josson/" target="_blank">josson</a> 2007-07-05 10:51 <a href="http://www.blogjava.net/josson/archive/2007/07/05/128272.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Debian 修改IP地址或DNS</title><link>http://www.blogjava.net/josson/archive/2007/06/20/125359.html</link><dc:creator>josson</dc:creator><author>josson</author><pubDate>Wed, 20 Jun 2007 08:05:00 GMT</pubDate><guid>http://www.blogjava.net/josson/archive/2007/06/20/125359.html</guid><wfw:comment>http://www.blogjava.net/josson/comments/125359.html</wfw:comment><comments>http://www.blogjava.net/josson/archive/2007/06/20/125359.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/josson/comments/commentRss/125359.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/josson/services/trackbacks/125359.html</trackback:ping><description><![CDATA[IP地址配置文件： /etc/network/interface
<p>// 动态DHCP获得</p>
<p># 启动系统激活设备<br># Loop回环地址<br>auto lo<br>iface lo inet loopback</p>
<p># 启动系统激活设备<br># 网卡eth0设置为DHCP类型<br>auto eth0 <br>iface eth0 inet dhcp </p>
<p>// 静态Static获得</p>
<p># 启动系统激活设备<br># Loop回环地址<br>auto lo<br>iface lo inet loopback</p>
<p># 启动系统激活设备<br># 网卡eth0设置为Static类型<br>auto eth0<br>iface eth0 inet static </p>
<p># 指定IP地址、子网掩码、广播、网关<br>address 192.168.0.1<br>netmask 255.255.255.0&nbsp; <br>network 192.168.0.0<br>broadcast 192.168.0.255<br>gateway 192.168.0.1</p>
<p># 指定DNS服务器地址<br>dns-nameservers 202.103.0.117<br>dns-search somedomain.org</p>
<p>========================</p>
<p><br></p>
<p>DNS服务器配置文件： /etc/resolv.conf</p>
<p>// 必须设置.否则无法访问任何URL</p>
<p>nameserver 202.103.0.117<br>nameserver 211.95.193.97</p><img src ="http://www.blogjava.net/josson/aggbug/125359.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/josson/" target="_blank">josson</a> 2007-06-20 16:05 <a href="http://www.blogjava.net/josson/archive/2007/06/20/125359.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>