<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Michael`s blog &#187; Linux / BSD</title>
	<atom:link href="http://www.toplee.com/blog/category/%e6%8a%80%e6%9c%af/nixbsd/feed" rel="self" type="application/rss+xml" />
	<link>http://www.toplee.com/blog</link>
	<description>活到老，学到老 ...   @ IT，业界，互联网</description>
	<lastBuildDate>Mon, 19 Jul 2010 05:38:59 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>SQLMinUID in proftpd.conf</title>
		<link>http://www.toplee.com/blog/816.html</link>
		<comments>http://www.toplee.com/blog/816.html#comments</comments>
		<pubDate>Mon, 30 Mar 2009 09:25:46 +0000</pubDate>
		<dc:creator>Michael</dc:creator>
				<category><![CDATA[Linux / BSD]]></category>
		<category><![CDATA[proftpd]]></category>

		<guid isPermaLink="false">http://www.toplee.com/blog/?p=816</guid>
		<description><![CDATA[默认值是999，如果你没有设置这个参数，在mod_sql中设置用户的uid映射到uid=80的www用户上，是不会生效的，会让你的文件都变成 65533 的nogroup 和 nobody 用户上，这会让你烦恼很久。]]></description>
			<content:encoded><![CDATA[<p>默认值是999，如果你没有设置这个参数，在mod_sql中设置用户的uid映射到uid=80的www用户上，是不会生效的，会让你的文件都变成 65533 的nogroup 和 nobody 用户上，这会让你烦恼很久。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.toplee.com/blog/816.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>BSD上Port安装MRTG取不到 ssCpuRawUser.0 之类的值</title>
		<link>http://www.toplee.com/blog/799.html</link>
		<comments>http://www.toplee.com/blog/799.html#comments</comments>
		<pubDate>Fri, 20 Mar 2009 04:42:37 +0000</pubDate>
		<dc:creator>Michael</dc:creator>
				<category><![CDATA[Linux / BSD]]></category>
		<category><![CDATA[mrtg]]></category>

		<guid isPermaLink="false">http://www.toplee.com/blog/?p=799</guid>
		<description><![CDATA[用Port安装的MRTG，无法取到 ssCpuRawUser.0 的值，很是郁闷，还以为是snmp的配置问题，折腾半天，但是通过 snmpget 和 snmpwalk 是可以得到的，于是删除掉port安装的mrtg，下载源码包手动安装搞定，在Redhat上没有这样的问题，谁知道什么原因？]]></description>
			<content:encoded><![CDATA[<p>用Port安装的MRTG，无法取到 ssCpuRawUser.0 的值，很是郁闷，还以为是snmp的配置问题，折腾半天，但是通过 snmpget 和 snmpwalk 是可以得到的，于是删除掉port安装的mrtg，下载源码包手动安装搞定，在Redhat上没有这样的问题，谁知道什么原因？ </p>
]]></content:encoded>
			<wfw:commentRss>http://www.toplee.com/blog/799.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>SNMP的snmpd: symbol lookup error: snmpd: undefined symbol: smux_snmp_select_list_get_length错误处理</title>
		<link>http://www.toplee.com/blog/798.html</link>
		<comments>http://www.toplee.com/blog/798.html#comments</comments>
		<pubDate>Thu, 19 Mar 2009 09:35:11 +0000</pubDate>
		<dc:creator>Michael</dc:creator>
				<category><![CDATA[Linux / BSD]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[snmp]]></category>

		<guid isPermaLink="false">http://www.toplee.com/blog/798.html</guid>
		<description><![CDATA[这次在Redhat上搞SNMP的时候，遇到service snmpd restart时总是出现启动成功，但是其实是没有成功的假象，系统日志里面也没有报错，搞了半天不得头绪，通过调试 snmpd -f -Le -Dread_config 得到错误信息： snmpd: symbol lookup error: snmpd: undefined symbol: smux_snmp_select_list_get_length 通过查阅若干文档，终于发现是系统中安装的 net-snmp-libs 有问题，于是下载最新版重新安装，搞定之！ 小问题耽误很多时间，有些懊恼！]]></description>
			<content:encoded><![CDATA[<p>这次在Redhat上搞SNMP的时候，遇到service snmpd restart时总是出现启动成功，但是其实是没有成功的假象，系统日志里面也没有报错，搞了半天不得头绪，通过调试 snmpd -f -Le -Dread_config 得到错误信息：</p>
<p>snmpd: symbol lookup error: snmpd: undefined symbol: smux_snmp_select_list_get_length</p>
<p>通过查阅若干文档，终于发现是系统中安装的 net-snmp-libs 有问题，于是下载最新版重新安装，搞定之！</p>
<p>小问题耽误很多时间，有些懊恼！</p>
]]></content:encoded>
			<wfw:commentRss>http://www.toplee.com/blog/798.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Redhat nfs exports文件映射用户</title>
		<link>http://www.toplee.com/blog/792.html</link>
		<comments>http://www.toplee.com/blog/792.html#comments</comments>
		<pubDate>Fri, 13 Mar 2009 03:43:49 +0000</pubDate>
		<dc:creator>Michael</dc:creator>
				<category><![CDATA[Linux / BSD]]></category>
		<category><![CDATA[nfs expots]]></category>

		<guid isPermaLink="false">http://www.toplee.com/blog/?p=792</guid>
		<description><![CDATA[BSD上的格式一般这样的： /usr/local/nfs -mapall=www:www 192.168.0.0/24 但是在Redhat上则需要写成这样: /usr/local/nfs 192.168.0.0/24(rw,all_squash,anonuid=80,anongid=80) 上面的方法，能把nfs写入的文件都映射到www用户，很多时候很有用的]]></description>
			<content:encoded><![CDATA[<p>BSD上的格式一般这样的：<br />
<code>/usr/local/nfs -mapall=www:www 192.168.0.0/24</code></p>
<p>但是在Redhat上则需要写成这样:<br />
<code>/usr/local/nfs 192.168.0.0/24(rw,all_squash,anonuid=80,anongid=80)</p>
<p>上面的方法，能把nfs写入的文件都映射到www用户，很多时候很有用的 <img src='http://www.toplee.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.toplee.com/blog/792.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Ubuntu 8.04搞定CDMA上网</title>
		<link>http://www.toplee.com/blog/602.html</link>
		<comments>http://www.toplee.com/blog/602.html#comments</comments>
		<pubDate>Tue, 05 Aug 2008 19:17:50 +0000</pubDate>
		<dc:creator>Michael</dc:creator>
				<category><![CDATA[Linux / BSD]]></category>
		<category><![CDATA[cdma]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://www.toplee.com/blog/?p=602</guid>
		<description><![CDATA[其实在Ubuntu下干活，主要目的是为了用Erlang开发个未来准备运行在该平台下的新东西，闲的时候就尝试折腾Ubuntu系统上的各种配置，晚上睡觉前又有了收获。 继下午搞定局域网连接打印机之后，刚才顺利搞定了CDMA PCMCIA卡拨号上网，大致的情况汇报如下。 #sudo apt-get install setserial pcmciautils （安装两个工具）#sudo pccartctl info （还可以用status, eject, ls 等子命令，具体的看man）#dmesg &#124;grep tty （得到类似下面的东西）[&#160; &#160;34.574046] 0.0: ttyS0 at I/O 0x3f8 (irq = 3) is a 16C950/954可以得知 ttyS0 就是cdma卡设备，继续后面的操作＃sudo vim /etc/wvdial.conf 输入下面的内容[Modem0]Modem = /dev/ttyS0Baud = 57600SetVolume = 1Dial Command = ATDTInit1 = ATZFlowControl = Hardware (CRTSCTS) [Dialer Defaults]Phone = #777Username = cardPassword [...]]]></description>
			<content:encoded><![CDATA[<p>其实在Ubuntu下干活，主要目的是为了用Erlang开发个未来准备运行在该平台下的新东西，闲的时候就尝试折腾Ubuntu系统上的各种配置，晚上睡觉前又有了收获。</p>
<p>继下午搞定局域网连接打印机之后，刚才顺利搞定了CDMA PCMCIA卡拨号上网，大致的情况汇报如下。<br />
<span id="more-602"></span></p>
<div class="hl-surround"><div class="hl-main">#sudo apt-get install setserial pcmciautils （安装两个工具）<br />#sudo pccartctl info （还可以用status, eject, ls 等子命令，具体的看man）<br />#dmesg |grep tty （得到类似下面的东西）<br />[&nbsp; &nbsp;34.574046] 0.0: ttyS0 at I/O 0x3f8 (irq = 3) is a 16C950/954<br />可以得知 ttyS0 就是cdma卡设备，继续后面的操作<br /><br />＃sudo vim /etc/wvdial.conf 输入下面的内容<br />[Modem0]<br />Modem = /dev/ttyS0<br />Baud = 57600<br />SetVolume = 1<br />Dial Command = ATDT<br />Init1 = ATZ<br />FlowControl = Hardware (CRTSCTS) <br /><br />[Dialer Defaults]<br />Phone = #777<br />Username = card<br />Password = card<br />Stupid Mode = 1 <br />Inherits = Modem0 <br /><br />继续后面的操作<br />#sudo vim /var/lib/setserial/autoserial.conf （输入下面的内容）<br />/dev/ttyS0 uart 16950/954 port 0x03f8 irq 3 baud_base 230400 spd_normal skip_test<br /><br />或者你也可以不做上面的修改，之接运行下面的命令也可以，只不过需要每次拨号前都运行一次<br />#sudo setserial /dev/ttyS0 baud_base 230400 （这个东西有些专业，需要咨询相关人士）<br /><br />这时，配置工作完成，可以进行拨号了<br />#sudo wvdial<br /><br />应该可以看到类似下面的输出内容就表示成功了，否则你就试试重头再来吧。<br />--&gt; WvDial: Internet dialer version 1.60<br />--&gt; Initializing modem.<br />--&gt; Sending: ATZ<br />OK<br />--&gt; Modem initialized.<br />--&gt; Sending: ATDT#777<br />--&gt; Waiting for carrier.<br />CONNECT<br />--&gt; Carrier detected.&nbsp; Starting PPP immediately.<br />--&gt; Starting pppd at Wed Aug&nbsp; 6 03:04:20 2008<br />--&gt; Pid of pppd: 7610<br />--&gt; Using interface ppp0<br />--&gt; pppd: ��[06][08]��[06][08][18]�[06][08]<br />--&gt; pppd: ��[06][08]��[06][08][18]�[06][08]<br />--&gt; pppd: ��[06][08]��[06][08][18]�[06][08]<br />--&gt; pppd: ��[06][08]��[06][08][18]�[06][08]<br />--&gt; pppd: ��[06][08]��[06][08][18]�[06][08]<br />--&gt; pppd: ��[06][08]��[06][08][18]�[06][08]<br />--&gt; local&nbsp; IP address 211.145.32.130<br />--&gt; pppd: ��[06][08]��[06][08][18]�[06][08]<br />--&gt; remote IP address 220.192.0.22<br />--&gt; pppd: ��[06][08]��[06][08][18]�[06][08]<br />--&gt; primary&nbsp; &nbsp;DNS address 220.192.0.131<br />--&gt; pppd: ��[06][08]��[06][08][18]�[06][08]<br />--&gt; secondary DNS address 220.192.8.58<br />--&gt; pppd: ��[06][08]��[06][08][18]�[06][08]<br /><br />窗口不要关闭，否则就断线了，如果主动想断线，可以按 CTRL + C ，会看到下面的内容输出：<br /><br />Caught signal 2:&nbsp; Attempting to exit gracefully...<br />--&gt; Terminating on signal 15<br />--&gt; pppd: ��[06][08]��[06][08][18]�[06][08]<br />--&gt; Connect time 0.4 minutes.<br />--&gt; pppd: ��[06][08]��[06][08][18]�[06][08]<br />--&gt; pppd: ��[06][08]��[06][08][18]�[06][08]<br />--&gt; Disconnecting at Wed Aug&nbsp; 6 03:04:41 2008</div></div>
<p>在连接上网后，可以使用 ifconfig -a 看看网络连接情况，应该能看到 ppp0 网络设备的参数。</p>
<p>补充说明，网上有高人提示如下：<br />
如果拨号成功后网络依然不通，可能是因为默认路由的问题所致，可以运行下述命令解决<br />
#netstat -rn （查看当前路由表，或者命令 route 也可以）<br />
#route add default ppp0 （添加默认的路由）</p>
<p>此时应该全部成功了，希望你也能和我一样幸运！ <img src='http://www.toplee.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>注： 我的CDMA卡是PANDA的牌子，很普通的一个国产便宜货，通过 pccardctl info 命令可以看到如下信息：<br />
#pccardctl info<br />
PRODID_1=&#8221;PANDA&#8221;<br />
PRODID_2=&#8221;CDMA&#8221;<br />
PRODID_3=&#8221;CARD&#8221;<br />
PRODID_4=&#8221;D&#8221;<br />
MANFID=0279,950b<br />
FUNCID=2</p>
]]></content:encoded>
			<wfw:commentRss>http://www.toplee.com/blog/602.html/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Ubuntu下顺利连上Windows打印机Brother MFC7420</title>
		<link>http://www.toplee.com/blog/599.html</link>
		<comments>http://www.toplee.com/blog/599.html#comments</comments>
		<pubDate>Tue, 05 Aug 2008 14:19:14 +0000</pubDate>
		<dc:creator>Michael</dc:creator>
				<category><![CDATA[Linux / BSD]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://www.toplee.com/blog/?p=599</guid>
		<description><![CDATA[折腾了将近5个小时，得出两句话： 1. Windows和比尔盖茨都是很伟大的，不要轻易人云亦云说Windows不好 2. 网上的那些所谓教程可能会和我这篇文章一样，害死人，浪费你的生命！ 最近坚持了有四天没有返回Windows，工作中各种常用的软件都已经在Ubnutu下准备到位，基本上感觉，从桌面与工作的角度来看，已经具有Windows98的水平了 今天想连接另外一台win98上挂着的打印机，结果google,baidu了N 久，按照不少的教程来操作，还是未能成功，不过这中间逐渐掌握到一些要领，其实最后发现还是用系统自带的apt-get, apt-cache等工具即可搞定之，重要的是对连接打印机的几种模式和方法得有概念上的理解。 多的不说，有遇到相同问题的朋友，单独找我吧，避免因为个人偶然因素，也害了更多人]]></description>
			<content:encoded><![CDATA[<p>折腾了将近5个小时，得出两句话：<br />
1. Windows和比尔盖茨都是很伟大的，不要轻易人云亦云说Windows不好<br />
2. 网上的那些所谓教程可能会和我这篇文章一样，害死人，浪费你的生命！</p>
<p>最近坚持了有四天没有返回Windows，工作中各种常用的软件都已经在Ubnutu下准备到位，基本上感觉，从桌面与工作的角度来看，已经具有Windows98的水平了 <img src='http://www.toplee.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>今天想连接另外一台win98上挂着的打印机，结果google,baidu了N 久，按照不少的教程来操作，还是未能成功，不过这中间逐渐掌握到一些要领，其实最后发现还是用系统自带的apt-get, apt-cache等工具即可搞定之，重要的是对连接打印机的几种模式和方法得有概念上的理解。</p>
<p>多的不说，有遇到相同问题的朋友，单独找我吧，避免因为个人偶然因素，也害了更多人 <img src='http://www.toplee.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><a href='http://www.toplee.com/blog/wp-content/uploads/2008/08/printer1.png' target="_blank"><img src="http://www.toplee.com/blog/wp-content/uploads/2008/08/printer1-300x187.png" alt="" title="printer1" width="300" height="187" class="alignnone size-medium wp-image-601" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.toplee.com/blog/599.html/feed</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>svn:Can&#8217;t convert string from &#8216;UTF-8&#8242; to native encoding</title>
		<link>http://www.toplee.com/blog/566.html</link>
		<comments>http://www.toplee.com/blog/566.html#comments</comments>
		<pubDate>Thu, 22 May 2008 04:52:58 +0000</pubDate>
		<dc:creator>Michael</dc:creator>
				<category><![CDATA[Linux / BSD]]></category>
		<category><![CDATA[其他技术]]></category>
		<category><![CDATA[svn]]></category>

		<guid isPermaLink="false">http://www.toplee.com/blog/?p=566</guid>
		<description><![CDATA[之前遇到一个问题，svn里面如果提交了中文文件名的文件或者包含其他特殊字符的文件名的文件，会导致linux或者freebsd上svn update/checkout的时候出现错误“svn: Can&#8217;t convert string from &#8216;UTF-8&#8242; to native encoding” 这个问题是由系统字符集设置导致的，可以使用如下方法解决： 在bash的shell下，输入如下命令： #export LC_CTYPE=en_US.UTF-8 然后运行如下命令确认发生的变化如下： #locale 将得到如下的结果返回： LANG=LC_COLLATE=&#34;C&#34;LC_CTYPE=&#34;en_US.UTF-8&#34;LC_MESSAGES=&#34;C&#34;LC_MONETARY=&#34;C&#34;LC_NUMERIC=&#34;C&#34;LC_TIME=&#34;C&#34;LC_ALL= 可以把以上内容直接加到svn的钩子里面，解决提交时自动输出处理遇到的问题。]]></description>
			<content:encoded><![CDATA[<p>之前遇到一个问题，svn里面如果提交了中文文件名的文件或者包含其他特殊字符的文件名的文件，会导致linux或者freebsd上svn update/checkout的时候出现错误“svn: Can&#8217;t convert string from &#8216;UTF-8&#8242; to native encoding”</p>
<p>这个问题是由系统字符集设置导致的，可以使用如下方法解决：<br />
在bash的shell下，输入如下命令：</p>
<div class="hl-surround"><div class="hl-main">#export LC_CTYPE=en_US.UTF-8</div></div>
<p>然后运行如下命令确认发生的变化如下：</p>
<div class="hl-surround"><div class="hl-main">#locale</div></div>
<p>将得到如下的结果返回：</p>
<div class="hl-surround"><div class="hl-main">LANG=<br />LC_COLLATE=&quot;C&quot;<br />LC_CTYPE=&quot;en_US.UTF-8&quot;<br />LC_MESSAGES=&quot;C&quot;<br />LC_MONETARY=&quot;C&quot;<br />LC_NUMERIC=&quot;C&quot;<br />LC_TIME=&quot;C&quot;<br />LC_ALL=</div></div>
<p>可以把以上内容直接加到svn的钩子里面，解决提交时自动输出处理遇到的问题。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.toplee.com/blog/566.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>服务器受到arp病毒攻击</title>
		<link>http://www.toplee.com/blog/529.html</link>
		<comments>http://www.toplee.com/blog/529.html#comments</comments>
		<pubDate>Tue, 18 Mar 2008 16:41:36 +0000</pubDate>
		<dc:creator>Michael</dc:creator>
				<category><![CDATA[Linux / BSD]]></category>

		<guid isPermaLink="false">http://www.toplee.com/blog/529.html</guid>
		<description><![CDATA[前两天服务器在我不知情的情况下，我的机器被从一个机房搬到另外一个机房（狂晕），结果就开始一直无法访问，让机房的工程师帮忙看了半天，各方面正常，但网络就是不通，很郁闷，今天亲自去机房跑了一趟，搞定。 经查，我的机器所在的交换机上某台机器中了arp病毒，导致我的机器也受到攻击，我也没有功夫继续查是谁中了，简单搞了个脚本放在cron里面每10分钟执行一下，自动清理arp表和重新设置网关以及本机的网卡arp信息，感觉freebsd在抵抗arp攻击方面真的是太弱智了，有点不能接受。。。 我的cron脚本内容如下： #!/bin/sh/usr/sbin/arp -d -a /usr/sbin/arp -s 124.254.29.1 00:05:31:d0:aa:bb/usr/sbin/arp -s 124.254.29.196 00:20:ed:79:aa:bb]]></description>
			<content:encoded><![CDATA[<p>前两天服务器在我不知情的情况下，我的机器被从一个机房搬到另外一个机房（狂晕），结果就开始一直无法访问，让机房的工程师帮忙看了半天，各方面正常，但网络就是不通，很郁闷，今天亲自去机房跑了一趟，搞定。</p>
<p>经查，我的机器所在的交换机上某台机器中了arp病毒，导致我的机器也受到攻击，我也没有功夫继续查是谁中了，简单搞了个脚本放在cron里面每10分钟执行一下，自动清理arp表和重新设置网关以及本机的网卡arp信息，感觉freebsd在抵抗arp攻击方面真的是太弱智了，有点不能接受。。。</p>
<p>我的cron脚本内容如下：</p>
<div class="hl-surround"><div class="hl-main">#!/bin/sh<br />/usr/sbin/arp -d -a <br />/usr/sbin/arp -s 124.254.29.1 00:05:31:d0:aa:bb<br />/usr/sbin/arp -s 124.254.29.196 00:20:ed:79:aa:bb</div></div>
]]></content:encoded>
			<wfw:commentRss>http://www.toplee.com/blog/529.html/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>服务器遭遇怪异问题</title>
		<link>http://www.toplee.com/blog/501.html</link>
		<comments>http://www.toplee.com/blog/501.html#comments</comments>
		<pubDate>Wed, 14 Nov 2007 03:27:44 +0000</pubDate>
		<dc:creator>Michael</dc:creator>
				<category><![CDATA[Linux / BSD]]></category>

		<guid isPermaLink="false">http://www.toplee.com/blog/501.html</guid>
		<description><![CDATA[　　前几天服务器硬盘坏了，换了一台新的服务器去机房替换，之前是FreeBSD6.1的，重新安装了系统为6.2，在家安装的系统，连续几天重启、开关机后都一切正常，前天放入机房后，重新配置了机房的ip地址，当时网络一切正常，后来前天晚上机器重启一次后就再也没有起来，今天去机房发现一个奇怪现象，机器是起来了，就是网不通了。 　　经过各种可能性的检查没有找到原因，有时重启网络能通，有时重启不通，ping 网关得到 ping sendto： host is down的错误提示，但是ifconfig查看网卡一切正常， 有时使用ifconfig em0 down和ifconfig em0 up网络能起来，尝试修改hosts、rc.conf关于网络的配置多次均这样的现象，也确认过resolve.conf没有问题，更换网线、网口均不能解决问题，几乎崩溃！！！ 　　现在这次机器起来是网络通的，我就不敢再重启了，暂时先顶着吧，反正一般我几个月都不会重启一次机器。 　　昨晚想到一个临时的解决办法，避免意外重启后又不通，写了一个shell脚本，启动的时候自动执行，策略如下： 1. 测试网络到网关是否通，如果不通则执行ifconfig em0 down 和ifconfig em0 up ，然后再次测试到网关是否通 2. 如果不通，重复1三次 3. 还不通，则执行reboot 4. 重复前面1-3，直到某一次启动网通了 　　虽然不是好办法，至少让我能稍微省省心，没必要的情况下，千万别再自己买服务器自己维护了，太折腾！]]></description>
			<content:encoded><![CDATA[<p>　　前几天服务器硬盘坏了，换了一台新的服务器去机房替换，之前是FreeBSD6.1的，重新安装了系统为6.2，在家安装的系统，连续几天重启、开关机后都一切正常，前天放入机房后，重新配置了机房的ip地址，当时网络一切正常，后来前天晚上机器重启一次后就再也没有起来，今天去机房发现一个奇怪现象，机器是起来了，就是网不通了。</p>
<p>　　经过各种可能性的检查没有找到原因，有时重启网络能通，有时重启不通，ping 网关得到 ping sendto： host is down的错误提示，但是ifconfig查看网卡一切正常， 有时使用ifconfig em0 down和ifconfig em0 up网络能起来，尝试修改hosts、rc.conf关于网络的配置多次均这样的现象，也确认过resolve.conf没有问题，更换网线、网口均不能解决问题，几乎崩溃！！！</p>
<p>　　现在这次机器起来是网络通的，我就不敢再重启了，暂时先顶着吧，反正一般我几个月都不会重启一次机器。</p>
<p>　　昨晚想到一个临时的解决办法，避免意外重启后又不通，写了一个shell脚本，启动的时候自动执行，策略如下：<br />
1. 测试网络到网关是否通，如果不通则执行ifconfig em0 down 和ifconfig em0 up ，然后再次测试到网关是否通<br />
2. 如果不通，重复1三次<br />
3. 还不通，则执行reboot<br />
4. 重复前面1-3，直到某一次启动网通了</p>
<p>　　虽然不是好办法，至少让我能稍微省省心，没必要的情况下，千万别再自己买服务器自己维护了，太折腾！</p>
]]></content:encoded>
			<wfw:commentRss>http://www.toplee.com/blog/501.html/feed</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>被SVN的 Non-ASCII character 错误困扰，郁闷之极。</title>
		<link>http://www.toplee.com/blog/420.html</link>
		<comments>http://www.toplee.com/blog/420.html#comments</comments>
		<pubDate>Thu, 24 May 2007 09:11:51 +0000</pubDate>
		<dc:creator>Michael</dc:creator>
				<category><![CDATA[Linux / BSD]]></category>
		<category><![CDATA[其他技术]]></category>

		<guid isPermaLink="false">http://www.toplee.com/blog/archives/420.html</guid>
		<description><![CDATA[　　这两天在BSD上遇到 SVN的 Non-ASCII character (code xxx) detected 错误，导致svn无法使用，搞了很久也没有搞定，实在郁闷，影响到项目进度了，不知道谁能帮忙一下。]]></description>
			<content:encoded><![CDATA[<p>　　这两天在BSD上遇到 SVN的 Non-ASCII character (code xxx) detected 错误，导致svn无法使用，搞了很久也没有搞定，实在郁闷，影响到项目进度了，不知道谁能帮忙一下。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.toplee.com/blog/420.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>FreeBSD上两种认证方式配置SVN笔记二</title>
		<link>http://www.toplee.com/blog/383.html</link>
		<comments>http://www.toplee.com/blog/383.html#comments</comments>
		<pubDate>Sat, 21 Apr 2007 00:00:46 +0000</pubDate>
		<dc:creator>Michael</dc:creator>
				<category><![CDATA[Linux / BSD]]></category>

		<guid isPermaLink="false">http://www.toplee.com/blog/archives/383.html</guid>
		<description><![CDATA[　　之前写过一个关于SVN的笔记，本来不想再弄这个东西，因为项目原因，被逼继续使用SVN进行配置管理。花费了几个小时总算搞清楚了具体细节，整理一份文档出来今后备用。 环境： FreeBSD 6.2 Released C1 Apache 2.2.3 Subversion 1.4.0 目标： 通过Apache的WebDAV方式访问SVN进行日常开发和代码管理 一、安装： 1、Apache安装 不用多说，进入到 /usr/ports/www/apache22目录下，运行make install即可安装默认方式搞定，如果你还有别的apache的应用和需求，自己研究。 2、Subversion安装 #cd /usr/ports/devel/subversion #make install WITHOUT_BDB=yes WITH_MOD_DAV_SVN=yes APXS=/usr/local/sbin/apxs 说明：WITHOUT_BDB=yes 这是我不使用BerkleyDB才加上的，你愿意使用可以去掉，WITH_MOD_DAV_SVN=yes APXS=/usr/local/sbin/apxs 两个参数是为了支持Apache的WebDAV方式 到此就安装完了，剩下的就是建库和设置权限 二、建库 假设我创建两个项目（库），分别为test和toplee，一个用于练习和测试，一个用于保存toplee.com的代码 #mkdir /var/SVN （创建svn库存放的根目录，可以随便选择目录） #svnadmin create /var/SVN/test #svnadmin create /var/SVN/toplee 搞定 三、设置权限 在达到最终目标前（使用apache的webDav方式访问），先简单说一下通过svn自带的轻量级svnserve的方式搭建环境的方法，如果你不感兴趣，就直接看后面apache的webDav部分吧 1、配置svn自带的svnserve #vi /etc/rc.conf 加入下面几行 svnserve_enable=&#34;NO&#34;svnserve_user=&#34;www&#34;svnserve_group=&#34;www&#34;svnserve_flags=&#34;-d --listen-host=xxx.xxx.xxx.xxx --listen-port=3690&#34;svnserve_data=&#34;/var/SVN&#34; #/usr/local/etc/rc.d/svnserve start 搞定，此时就可以通过 svn [...]]]></description>
			<content:encoded><![CDATA[<p>　　之前写过一个关于SVN的笔记，本来不想再弄这个东西，因为项目原因，被逼继续使用SVN进行配置管理。花费了几个小时总算搞清楚了具体细节，整理一份文档出来今后备用。</p>
<p>环境：<br />
FreeBSD 6.2 Released C1<br />
Apache 2.2.3<br />
Subversion 1.4.0</p>
<p>目标：<br />
通过Apache的WebDAV方式访问SVN进行日常开发和代码管理</p>
<p><span id="more-383"></span></p>
<p>一、安装：</p>
<p>1、Apache安装<br />
不用多说，进入到 /usr/ports/www/apache22目录下，运行make install即可安装默认方式搞定，如果你还有别的apache的应用和需求，自己研究。</p>
<p>2、Subversion安装<br />
#cd /usr/ports/devel/subversion<br />
#make install WITHOUT_BDB=yes WITH_MOD_DAV_SVN=yes APXS=/usr/local/sbin/apxs<br />
说明：WITHOUT_BDB=yes 这是我不使用BerkleyDB才加上的，你愿意使用可以去掉，WITH_MOD_DAV_SVN=yes APXS=/usr/local/sbin/apxs 两个参数是为了支持Apache的WebDAV方式</p>
<p>到此就安装完了，剩下的就是建库和设置权限</p>
<p>二、建库</p>
<p>假设我创建两个项目（库），分别为test和toplee，一个用于练习和测试，一个用于保存toplee.com的代码<br />
#mkdir /var/SVN （创建svn库存放的根目录，可以随便选择目录）<br />
#svnadmin create /var/SVN/test<br />
#svnadmin create /var/SVN/toplee<br />
搞定</p>
<p>三、设置权限</p>
<p>在达到最终目标前（使用apache的webDav方式访问），先简单说一下通过svn自带的轻量级svnserve的方式搭建环境的方法，如果你不感兴趣，就直接看后面apache的webDav部分吧</p>
<p>1、配置svn自带的svnserve<br />
#vi /etc/rc.conf 加入下面几行</p>
<div class="hl-surround"><div class="hl-main">svnserve_enable=&quot;NO&quot;<br />svnserve_user=&quot;www&quot;<br />svnserve_group=&quot;www&quot;<br />svnserve_flags=&quot;-d --listen-host=xxx.xxx.xxx.xxx --listen-port=3690&quot;<br />svnserve_data=&quot;/var/SVN&quot;</div></div>
<p>#/usr/local/etc/rc.d/svnserve start<br />
搞定，此时就可以通过 svn info svn://xxx.xxx.xxx.xxx/test 访问test库了<br />
不过这时使用了默认权限，大家都能访问和修改库里面的东西，需要设置权限<br />
权限设置方法：<br />
在/var/SVN/test下和/var/SVN/toplee下都有个conf目录，进入到conf目录，能看到authz、passwd、svnserve.conf三个文件，这三个文件就是用来配置svnserve方式权限的，分别配置如下：</p>
<p>a) 配置 svnserve.conf<br />
在文件中写入类似下面的内容</p>
<div class="hl-surround"><div class="hl-main">[general]<br />anon-access = none<br />auth-access = write<br />password-db = passwd</div></div>
<p>大概意思是，不允许匿名访问，全部需要使用密码验证，对于通过验证的用户，给与write权限，同时用于密码验证的文件是passwd文件</p>
<p>b) 配置passwd文件<br />
这个文件打开后，一看就明白，就是写用户名和口令，不爽的是密码是明文的，哪怕加个md5也好。写入类似这样的东西</p>
<div class="hl-surround"><div class="hl-main">michael=toplee<br />test=testdb<br />lee=abc</div></div>
<p>设置了三个用户，分别是michael、test、lee</p>
<p>c)配置authz文件<br />
这个文件用于配置用户访问库中文件或者目录的具体策略，基本上默认文件里面就有说明和范例了，我的authz文件大概如下：</p>
<div class="hl-surround"><div class="hl-main">[groups]<br />g_w = michael,lee&nbsp; &nbsp; #意思是创建一个组，包含两个用户<br />g_r = test #第二个组，包含一个用户<br /><br />[/abc]&nbsp; #目录名<br />@g_w= rw&nbsp; #g_w组的用户都能read和write<br />@g_r=rw&nbsp; #g_r组的用户也能read和write<br /><br />[/xyz]<br />michael=rw<br />lee=r<br />@g_r=r</div></div>
<p>上面的内容大概根据内容就能看懂意思，不多解释</p>
<p>至此，配置完成，运行/usr/local/etc/rc.d/svnserve restart重启服务即可生效，现在使用 svn info svn://xxx.xxx.xxx.xxx/test 则需要你进行身份验证了。</p>
<p>2、配置基于Apache的WebDAV方式访问SVN<br />
这是我今天的最后目标，有一些类似的文档可以找到，不过总感觉要少点什么。<br />
关键的两个地方，配置httpd.conf和svn的权限文件</p>
<p>a)配置httpd.conf<br />
在httpd.conf文件里面加入下面一堆东西</p>
<div class="hl-surround"><div class="hl-main">LoadModule dav_module&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;libexec/apache22/mod_dav.so<br />LoadModule dav_fs_module libexec/apache22/mod_dav_fs.so<br />LoadModule dav_svn_module&nbsp; &nbsp; &nbsp;libexec/apache22/mod_dav_svn.so<br />LoadModule authz_svn_module&nbsp; &nbsp;libexec/apache22/mod_authz_svn.so<br /><br />&lt;Location /svn&gt;<br />&nbsp; DAV svn<br />&nbsp; SVNParentPath /var/SVN<br />&nbsp; AuthType Basic<br />&nbsp; AuthName &quot;Subversion in toplee.com&quot;<br />&nbsp; AuthUserFile /var/SVN/.svnpasswd<br />&nbsp; AuthzSVNAccessFile /var/SVN/.svnaccess <br />&nbsp; Satisfy Any<br />&nbsp; Require valid-user<br />&lt;/Location&gt;</div></div>
<p>啥意思呢？<br />
其实最前面两行，apache安装好后基本上默认就有了，不用管，但是你要确定一下是不是真的有了，没有的话不行，检查/usr/local/libexe/apache22/下是否有相应so或者重新编译安装apache，并且激活相应的选项。<br />
第三四行是安装svn时增加 WITH_MOD_DAV_SVN=yes APXS=/usr/local/sbin/apxs  这两个参数时也会自己默认加上的，如果没有就自己手动加上。<br />
后面那一堆<Location /svn>的部分是关键，大概意思就是调用.svnpasswd文件进行用户验证，调用.svnaccess文件进行权限判断，细节我懒得说了，你照着弄，根据目录不同自己改改就行。</p>
<p>b)配置svn的用户权限文件<br />
这回我们不会继续使用前面svnserve方式下的那三个文件了，而是使用httpd.conf文件里面配置的.svnpasswd和.svnaccess两个文件来配置，当然这两个文件的名字和路径你都可以根据自己喜好修改。</p>
<p>首先是配置.svpasswd文件，这个文件其实就是标准Apache的.htpasswd文件，弄过http方式验证的都知道咋回事。运行下面的命令创建三个用户<br />
#htpasswd -c /var/SVN/.svnpasswd michael<br />
#输入口令<br />
#htpasswd /var/SVN/.svnpasswd lee (注意这里不在需要-c参数，它是用来第一次创建文件用的）<br />
#输入lee用户的口令<br />
#htpasswd /var/SVN/.svnpasswd test<br />
#输入test用户的口令</p>
<p>搞定.svnpasswd文件</p>
<p>接下来开始搞.svnaccess文件， 运行 vi /var/SVN/.svnaccess 编辑文件，加入下面的东西</p>
<div class="hl-surround"><div class="hl-main">[groups]<br />g_w = michael,lee <br />g_r = test <br /><br />[test:/]<br />@g_w= rw&nbsp; <br />@g_r=rw&nbsp; <br /><br />[toplee:/blog/]<br />michael=rw<br />lee=r<br />@g_r=r<br /><br />[toplee:/mail/]<br />@g_w=rw<br />@g_r=w</div></div>
<p>这个文件呢，实际上跟前面 test/conf和toplee/conf下的authz文件格式一样，不过就是不需要为每个库单独创建，而统一使用了一个文件来配置，从文件中可以看到变化，在配置目录的时候，增加了库的名字，如[toplee:/blog/] 表示toplee库下/blog/目录的意思</p>
<p>最后就是运行 /usr/local/etc/rc.d/apache22 restart 重启apache服务则全部搞定。</p>
<p>在浏览器里面输入 http://xxx.xxx.xxx.xxx/svn/test 或者 http://xxx.xxx.xxx.xxx/svn/toplee 试试，让你输入用户名口令就ok了</p>
<p>如果你没有成功，一个可能是RPWT，另一个可能是中间哪里写错了，比如我就因为手误把 .svnpasswd 弄成 .svnhtpasswd，结果httpd.conf里面又是写的.svnpasswd，弄了半天没有成功，看error.log才明白咋回事。</p>
<p>呵呵，祝你顺利！</p>
]]></content:encoded>
			<wfw:commentRss>http://www.toplee.com/blog/383.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>crontab 的格式备忘</title>
		<link>http://www.toplee.com/blog/380.html</link>
		<comments>http://www.toplee.com/blog/380.html#comments</comments>
		<pubDate>Fri, 30 Mar 2007 18:09:49 +0000</pubDate>
		<dc:creator>Michael</dc:creator>
				<category><![CDATA[Linux / BSD]]></category>

		<guid isPermaLink="false">http://www.toplee.com/blog/archives/380.html</guid>
		<description><![CDATA[经常用，但是经常忘记，基本的格式能记得，但是详细的或者复杂点的格式总会忘记或者拿不准，不知道是不是年纪大了记忆力下降，干脆整理出来今后方便查看。 基本格式 : *　　*　　*　　*　　*　　command 分　时　日　月　周　命令 第1列表示分钟1～59 每分钟用*或者 */1表示 第2列表示小时1～23（0表示0点） 第3列表示日期1～31 第4列表示月份1～12 第5列标识号星期0～6（0表示星期天） 第6列要运行的命令 crontab文件的一些例子： 30 21 * * * /usr/local/etc/rc.d/lighttpd restart 上面的例子表示每晚的21:30重启lighttpd 。 45 4 1,10,22 * * /usr/local/etc/rc.d/lighttpd restart 上面的例子表示每月1、10、22日的4 : 45重启lighttpd 。 10 1 * * 6,0 /usr/local/etc/rc.d/lighttpd restart 上面的例子表示每周六、周日的1 : 10重启lighttpd 。 0,30 18-23 * * * /usr/local/etc/rc.d/lighttpd restart 上面的例子表示在每天18 : 00至23 [...]]]></description>
			<content:encoded><![CDATA[<p>经常用，但是经常忘记，基本的格式能记得，但是详细的或者复杂点的格式总会忘记或者拿不准，不知道是不是年纪大了记忆力下降，干脆整理出来今后方便查看。</p>
<p>基本格式 :<br />
*　　*　　*　　*　　*　　command<br />
分　时　日　月　周　命令</p>
<p>第1列表示分钟1～59 每分钟用*或者 */1表示<br />
第2列表示小时1～23（0表示0点）<br />
第3列表示日期1～31<br />
第4列表示月份1～12<br />
第5列标识号星期0～6（0表示星期天）<br />
第6列要运行的命令</p>
<p>crontab文件的一些例子：</p>
<p>30 21 * * * /usr/local/etc/rc.d/lighttpd restart<br />
上面的例子表示每晚的21:30重启lighttpd 。</p>
<p>45 4 1,10,22 * * /usr/local/etc/rc.d/lighttpd restart<br />
上面的例子表示每月1、10、22日的4 : 45重启lighttpd 。</p>
<p>10 1 * * 6,0 /usr/local/etc/rc.d/lighttpd restart<br />
上面的例子表示每周六、周日的1 : 10重启lighttpd 。</p>
<p>0,30 18-23 * * * /usr/local/etc/rc.d/lighttpd restart<br />
上面的例子表示在每天18 : 00至23 : 00之间每隔30分钟重启lighttpd 。</p>
<p>0 23 * * 6 /usr/local/etc/rc.d/lighttpd restart<br />
上面的例子表示每星期六的11 : 00 pm重启lighttpd 。</p>
<p>* */1 * * * /usr/local/etc/rc.d/lighttpd restart<br />
每一小时重启lighttpd </p>
<p>* 23-7/1 * * * /usr/local/etc/rc.d/lighttpd restart<br />
晚上11点到早上7点之间，每隔一小时重启lighttpd </p>
<p>0 11 4 * mon-wed /usr/local/etc/rc.d/lighttpd restart<br />
每月的4号与每周一到周三的11点重启lighttpd </p>
<p>0 4 1 jan * /usr/local/etc/rc.d/lighttpd restart<br />
一月一号的4点重启lighttpd </p>
]]></content:encoded>
			<wfw:commentRss>http://www.toplee.com/blog/380.html/feed</wfw:commentRss>
		<slash:comments>19</slash:comments>
		</item>
		<item>
		<title>在FreeBSD上使用mod_dosevasive对抗DDos攻击</title>
		<link>http://www.toplee.com/blog/278.html</link>
		<comments>http://www.toplee.com/blog/278.html#comments</comments>
		<pubDate>Sun, 24 Sep 2006 14:04:24 +0000</pubDate>
		<dc:creator>Michael</dc:creator>
				<category><![CDATA[Linux / BSD]]></category>
		<category><![CDATA[Web架构/负载/性能]]></category>
		<category><![CDATA[技术交流]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[ddos]]></category>
		<category><![CDATA[FreeBSD]]></category>
		<category><![CDATA[mod_dosevasive]]></category>
		<category><![CDATA[防攻击]]></category>

		<guid isPermaLink="false">http://www.toplee.com/blog/archives/278.html</guid>
		<description><![CDATA[　　mod_dosevasive是一个Apache上的可选模块，它能应对一些基于HTTP的拒绝服务攻击，就是常说的Dos或者DDos攻击，这种攻击是让很多大小网站都头疼的攻击方式，mod_dosevasive从Apache1.3开始出现，虽然不能完全彻底的防止大规模的DDos攻击，但是对于普通的攻击来说，还是非常不错的选择。 　　我的服务器(http://www.toplee.com/blog/)就曾经收到过类似的测试攻击（就是估计别人是为了练手，并非真的要针对我），搞得很头疼，我一些朋友的应用也遇到过类似的烦恼，基本上都通过安装mod_dosevasive得到了较好的解决。下面我就来以我在FreeBSD上安装基于Apache2.2.2的mod_dosevasive经过给大家分享一下经验，顺便进一步讲述一下mod_dosevasive的特性。 　　mod_dosevasive通过对来访IP地址和访问URI建立内部动态哈希表来检测是否有攻击，如果有如下的行为将拒绝该IP的访问： 1. 每秒对同一页面的请求数超过平时（原文：Requesting the same page more than a few times per second）。 2. 每秒同一个子进程有超过50次的并发请求。 3. 临时被拒绝（在blacklist中）的时候还不断进行请求。 　　mod_dosevasive可以非常方便的和防火墙、路由器等进行整合，进一步提高抗拒绝服务的能力。和别的防攻击工具一样，mod_dosevasive同样收到带宽、系统处理能力等因素的影响，所以要想应对大规模的攻击，最好的方式就是把mod_dosevasive和您的防火墙和路由器进行整合，而不是简单的安装成为独立的Apache模块。 mod_dosevasive在apache2.2.2上的安装方法： 一、使用源码安装： 1、下载 #cd /tmp （任何别的目录都行）#wget http://www.zdziarski.com/projects/mod_evasive/mod_evasive_1.10.1.tar.gz 2、解压缩 #tar -zxvf mod_dosevasive_1.10.1.tar.gz#cd mod_dosevasive 3、以动态模块方式编译 # apxs -i -a -c mod_dosevasive20.c 4. 修改/etc/httpd/conf/httpd.conf文件，加入对模块的支持: LoadModule dosevasive20_module libexec/apache22/mod_dosevasive20.so 二、使用FreeBSD的port进行安装（强烈推荐此方式） #cd /usr/ports/www/mod_dosevasive20#make install clean 　　至此，完成了mod_dosevasive的安装，重启apache服务后，它就开始工作了，这个时候您如果不作任何别的设置，它也可以使用默认配置为您提供良好的防攻击能力，当然，您也可以自己进行一些参数的定制配置，可选的参数如下： 在您的httpd.conf文件中，加入类似下面的部分 Apache 1.3.x &#60;IfModule mod_dosevasive.c&#62;DOSHashTableSize [...]]]></description>
			<content:encoded><![CDATA[<p>　　mod_dosevasive是一个Apache上的可选模块，它能应对一些基于HTTP的拒绝服务攻击，就是常说的Dos或者DDos攻击，这种攻击是让很多大小网站都头疼的攻击方式，mod_dosevasive从Apache1.3开始出现，虽然不能完全彻底的防止大规模的DDos攻击，但是对于普通的攻击来说，还是非常不错的选择。</p>
<p>　　我的服务器(<a href="http://www.toplee.com/blog/">http://www.toplee.com/blog/</a>)就曾经收到过类似的测试攻击（就是估计别人是为了练手，并非真的要针对我），搞得很头疼，我一些朋友的应用也遇到过类似的烦恼，基本上都通过安装mod_dosevasive得到了较好的解决。下面我就来以我在FreeBSD上安装基于Apache2.2.2的mod_dosevasive经过给大家分享一下经验，顺便进一步讲述一下mod_dosevasive的特性。<br />
<span id="more-278"></span><br />
　　mod_dosevasive通过对来访IP地址和访问URI建立内部动态哈希表来检测是否有攻击，如果有如下的行为将拒绝该IP的访问：</p>
<p>1. 每秒对同一页面的请求数超过平时（原文：Requesting the same page more than a few times per second）。<br />
2. 每秒同一个子进程有超过50次的并发请求。<br />
3. 临时被拒绝（在blacklist中）的时候还不断进行请求。</p>
<p>　　mod_dosevasive可以非常方便的和防火墙、路由器等进行整合，进一步提高抗拒绝服务的能力。和别的防攻击工具一样，mod_dosevasive同样收到带宽、系统处理能力等因素的影响，所以要想应对大规模的攻击，最好的方式就是把mod_dosevasive和您的防火墙和路由器进行整合，而不是简单的安装成为独立的Apache模块。</p>
<p>mod_dosevasive在apache2.2.2上的安装方法：</p>
<p>一、使用源码安装：<br />
1、下载</p>
<div class="hl-surround"><div class="hl-main">#cd /tmp （任何别的目录都行）<br />#wget http://www.zdziarski.com/projects/mod_evasive/mod_evasive_1.10.1.tar.gz</div></div>
<p>2、解压缩</p>
<div class="hl-surround"><div class="hl-main">#tar -zxvf mod_dosevasive_1.10.1.tar.gz<br />#cd mod_dosevasive</div></div>
<p>3、以动态模块方式编译</p>
<div class="hl-surround"><div class="hl-main"># apxs -i -a -c mod_dosevasive20.c</div></div>
<p>4. 修改/etc/httpd/conf/httpd.conf文件，加入对模块的支持:</p>
<div class="hl-surround"><div class="hl-main">LoadModule dosevasive20_module libexec/apache22/mod_dosevasive20.so</div></div>
<p>二、使用FreeBSD的port进行安装（强烈推荐此方式）</p>
<div class="hl-surround"><div class="hl-main">#cd /usr/ports/www/mod_dosevasive20<br />#make install clean</div></div>
<p>　　至此，完成了mod_dosevasive的安装，重启apache服务后，它就开始工作了，这个时候您如果不作任何别的设置，它也可以使用默认配置为您提供良好的防攻击能力，当然，您也可以自己进行一些参数的定制配置，可选的参数如下：</p>
<p>在您的httpd.conf文件中，加入类似下面的部分<br />
Apache 1.3.x</p>
<div class="hl-surround"><div class="hl-main">&lt;IfModule mod_dosevasive.c&gt;<br />DOSHashTableSize 3097<br />DOSPageCount 5<br />DOSSiteCount 100<br />DOSPageInterval 2<br />DOSSiteInterval 2<br />DOSBlockingPeriod 600<br />&lt;/IfModule&gt;</div></div>
<p>Apache 2.x</p>
<div class="hl-surround"><div class="hl-main">&lt;IfModule mod_dosevasive20.c&gt;<br />DOSHashTableSize 3097<br />DOSPageCount 5<br />DOSSiteCount 100<br />DOSPageInterval 2<br />DOSSiteInterval 2<br />DOSBlockingPeriod 600<br />&lt;/IfModule&gt;</div></div>
<p>参数简单说明：<br />
DOSHashTableSize 3097 记录和存放黑名单的哈西表大小，如果服务器访问量很大，可以加大该值<br />
DOSPageCount 5 同一个页面在同一时间内可以被统一个用户访问的次数，超过该数字就会被列为攻击，同一时间的数值可以在DosPageInterval参数中设置。<br />
DOSSiteCount 50 同一个用户在同一个网站内可以同时打开的访问数，同一个时间的数值在DOSSiteInterval中设置。<br />
DOSPageInterval 2 设置DOSPageCount中时间长度标准，默认值为1。<br />
DOSSiteInterval 2 设置DOSSiteCount中时间长度标准。<br />
DOSBlockingPeriod 10 被封时间间隔秒，这中间会收到 403 (Forbidden) 的返回。</p>
<p>其他可选参数：<br />
DOSEmailNotify lee@toplee.com 设置受到攻击时接收攻击信息提示的邮箱地址。<br />
DOSSystemCommand &#8220;su &#8211; someuser -c &#8216;/sbin/&#8230; %s &#8230;&#8217;&#8221;  受到攻击时Apache运行用户执行的系统命令<br />
DOSLogDir &#8220;/var/lock/mod_dosevasive&#8221; 攻击日志存放目录，BSD上默认是 /tmp</p>
<p>下面是我的服务器上看到的一些日志情况：</p>
<div class="hl-surround"><div class="hl-main">#cd /tmp<br />#ll |wc -l<br />&nbsp;&nbsp; &nbsp;2303<br />#ls<br />......<br />dos-218.64.69.71&nbsp; &nbsp; &nbsp; &nbsp; dos-219.80.33.54&nbsp; &nbsp; &nbsp; &nbsp; dos-222.214.156.211<br />dos-218.64.79.59&nbsp; &nbsp; &nbsp; &nbsp; dos-219.82.143.127&nbsp; &nbsp; &nbsp; dos-222.214.2.148 <br />dos-218.64.81.162&nbsp; &nbsp; &nbsp; &nbsp;dos-219.82.46.245&nbsp; &nbsp; &nbsp; &nbsp;dos-222.214.206.162&nbsp; <br />dos-218.65.102.178&nbsp; &nbsp; &nbsp; dos-220.113.43.61&nbsp; &nbsp; &nbsp; &nbsp;dos-222.214.207.191 <br />......<br />#more dos-218.64.69.71<br />30611<br />可以看到，这个ip地址有30611次的访问攻击被记录！！！</div></div>
<p>参考资料：<br />
原官方主页：http://www.nuclearelephant.com/projects/dosevasive/<br />
新主页地址：<a href="http://www.zdziarski.com/projects/mod_evasive/">http://www.zdziarski.com/projects/mod_evasive/</a><br />
本文永久链接： <a href="http://www.toplee.com/blog/?p=278">http://www.toplee.com/blog/?p=278</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.toplee.com/blog/278.html/feed</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>FreeBSD6.1上快速安装配置Bugzilla2.22</title>
		<link>http://www.toplee.com/blog/251.html</link>
		<comments>http://www.toplee.com/blog/251.html#comments</comments>
		<pubDate>Fri, 18 Aug 2006 12:51:34 +0000</pubDate>
		<dc:creator>Michael</dc:creator>
				<category><![CDATA[Linux / BSD]]></category>
		<category><![CDATA[技术交流]]></category>

		<guid isPermaLink="false">http://www.toplee.com/blog/?p=251</guid>
		<description><![CDATA[　　开发过大型项目的朋友一定都接触过这样几类工具：需求管理、代码和版本控制和Bug跟踪工具。比较常见的需求管理是ClearQuest，代码和版本控制工具中用最多的是VSS和CVS，而Bug跟踪工具最出名的一定就是bugzilla了。 　　Bugzilla是Mozilla团队为我们奉献的一款免费的优秀的bug跟踪工具，它完全基于web方式，安装简单、运行方便快捷，可以使用MySQL数据库或者Ldap进行存储，系统非常灵活，有强大的可配置能力，并且可以自动发送Email进行通知和提醒，生产灵活方便的各种报表、图形，还能支持标准的XML导入和导出。 　　作为一个产品缺陷的记录及跟踪工具，它能够为你建立一个完善的Bug跟踪体系，同时，由于在需求管理和bug追踪之间有很多流程和特点的相似，Bugzilla同时还可以用来实现入门级的需求管理，一个需求如同一个bug一样，从提出到接收、处理、反馈、验证整个过程都可以在bugzilla中得到体现和处理，并且可以和bug一样对应到产品和相关人员，Michael原来在yahoo工作的时候，公司就是使用了bugzilla作为需求和bug管理的平台，感觉非常方便实用。 更多的Bugzilla的特点在这里就不多说了，Michael在这里主要讲述一下在FreeBSD6.1环境下如何快速安装配置Bugzilla，为您的项目提供需求和bug管理支持。 　　Michael这里提到的安装有个前提，那就是假设您的系统上已经成功安装了FreeBSD6.1和配置了ports，并通过ports完成了Apache、Perl、MySQL的安装和配置，有关FreeBSD6.1的安装，ports的配置以及Apache、Perl和MySQL的安装配置在这里就不多说了，相关的资料相当之多。 　　下面是Michael的Bugzilla安装过程。 #cd /usr/ports/devel/bugzilla#more ./distinfo （看看版本信息，可以看到类似下面的内容）MD5 (bugzilla-2.22.tar.gz) = bbf2f1ec5607978d39855df104231973SHA256 (bugzilla-2.22.tar.gz) = 9d7e2144cd8499430c802ef5267dd2237aaec401546e5b9476db4f9ca19ebd4dSIZE (bugzilla-2.22.tar.gz) = 1956898表示当前ports中的bugzilla版本是2.22版，这个版本基本上是当前官方发布的stable版本的最新版#make config&#160; &#160; （进行初始化配置选项设置，下面是我的选择）[X] MYSQL&#160; &#160; &#160; &#160; &#160; &#160; &#160;MySQL database support&#160; &#160; [ ] PGSQL&#160; &#160; &#160; &#160; &#160; &#160; &#160;PostgreSQL database support [X] CHARTING_MODULES&#160; Bug charting support&#160; [ ] GRAPHVIZ&#160; &#160; &#160; &#160; &#160; [...]]]></description>
			<content:encoded><![CDATA[<p>　　开发过大型项目的朋友一定都接触过这样几类工具：需求管理、代码和版本控制和Bug跟踪工具。比较常见的需求管理是ClearQuest，代码和版本控制工具中用最多的是VSS和CVS，而Bug跟踪工具最出名的一定就是bugzilla了。</p>
<p>　　Bugzilla是Mozilla团队为我们奉献的一款免费的优秀的bug跟踪工具，它完全基于web方式，安装简单、运行方便快捷，可以使用MySQL数据库或者Ldap进行存储，系统非常灵活，有强大的可配置能力，并且可以自动发送Email进行通知和提醒，生产灵活方便的各种报表、图形，还能支持标准的XML导入和导出。<br />
<span id="more-251"></span></p>
<p>　　作为一个产品缺陷的记录及跟踪工具，它能够为你建立一个完善的Bug跟踪体系，同时，由于在需求管理和bug追踪之间有很多流程和特点的相似，Bugzilla同时还可以用来实现入门级的需求管理，一个需求如同一个bug一样，从提出到接收、处理、反馈、验证整个过程都可以在bugzilla中得到体现和处理，并且可以和bug一样对应到产品和相关人员，Michael原来在yahoo工作的时候，公司就是使用了bugzilla作为需求和bug管理的平台，感觉非常方便实用。</p>
<p>    更多的Bugzilla的特点在这里就不多说了，Michael在这里主要讲述一下在FreeBSD6.1环境下如何快速安装配置Bugzilla，为您的项目提供需求和bug管理支持。</p>
<p>　　Michael这里提到的安装有个前提，那就是假设您的系统上已经成功安装了FreeBSD6.1和配置了ports，并通过ports完成了Apache、Perl、MySQL的安装和配置，有关FreeBSD6.1的安装，ports的配置以及Apache、Perl和MySQL的安装配置在这里就不多说了，相关的资料相当之多。</p>
<p>　　下面是Michael的Bugzilla安装过程。</p>
<div class="hl-surround"><div class="hl-main">#cd /usr/ports/devel/bugzilla<br />#more ./distinfo （看看版本信息，可以看到类似下面的内容）<br /><br />MD5 (bugzilla-2.22.tar.gz) = bbf2f1ec5607978d39855df104231973<br />SHA256 (bugzilla-2.22.tar.gz) = 9d7e2144cd8499430c802ef5267dd2237aaec401546e5b9476db4f9ca19ebd4d<br />SIZE (bugzilla-2.22.tar.gz) = 1956898<br />表示当前ports中的bugzilla版本是2.22版，这个版本基本上是当前官方发布的stable版本的最新版<br /><br />#make config&nbsp; &nbsp; （进行初始化配置选项设置，下面是我的选择）<br />[X] MYSQL&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;MySQL database support&nbsp; &nbsp; <br />[ ] PGSQL&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;PostgreSQL database support <br />[X] CHARTING_MODULES&nbsp; Bug charting support&nbsp; <br />[ ] GRAPHVIZ&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Use GraphViz <br />[X] EMAIL_GATEWAY&nbsp; &nbsp; &nbsp;Use email gateway&nbsp; <br />[X] EXPORT_IMPORT&nbsp; &nbsp; &nbsp;Import/export bugs (via XML)&nbsp; <br />[ ] CONTRIB&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Install user-contributed scripts <br />[ ] LDAP&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Enable LDAP support <br />选择对MySQL数据库、图形报表、邮件、XML导入导出的支持<br /><br />#make install clean</div></div>
<p>以上完成基本的安装，接下来要进行一些设置才能最终使用。</p>
<p><b>设置MySQL</b></p>
<p>我们需要设置使用MySQL数据库来存储Bugzilla的数据，你可以通过命令行或者phpmyadmin这样的web管理工具来进行设置，下面我们使用MySQL的命令行来完成设置。</p>
<div class="hl-surround"><div class="hl-main">#mysql -hlocalhost -uroot -p<br />Enter password:xxxxxx<br />mysql&gt; create database &lt;dbname&gt;;<br />mysql&gt; GRANT SELECT, INSERT,<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; UPDATE, DELETE, INDEX, ALTER, CREATE, LOCK TABLES,<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; CREATE TEMPORARY TABLES, DROP, REFERENCES ON &lt;dbname&gt;.*<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; TO &lt;dbuser&gt;@localhost IDENTIFIED BY '&lt;dbpass&gt;';<br />mysql&gt; FLUSH PRIVILEGES;<br />mysql&gt; exit;</div></div>
<p>上面完成了在本机的MySQL上创建供bugzilla使用的数据库 <dbname> （这里的<dbname>更换成您要使用的数据库名称），同时添加用户<dbuser>和口令<dbpass>，该用户对<dbname>具有所有权限。<br />
在这里，Michael使用的<dbname>是bugzilla，<dbuser>和<dbname>均为bugzilla<br />
另外，为了让MySQL支持bugzilla的较大附件存储，还需要修改MySQL的默认设置，bugzilla默认支持的附件最大1M，修改方式如下：</p>
<div class="hl-surround"><div class="hl-main">#vi /etc/my.cnf<br />在[mysqld]段中加入下面一行<br />&nbsp; max_allowed_packet=1M</div></div>
<p>然后重启MySQL即可。</p>
<p><b>设置Apache</b></p>
<p>如果您的系统是FreeBSD6.1版，同时更新了ports为当前最新，那么通过ports安装的Apache应该是Apache2.2.3版本，它的ServerRoot目录应该在/usr/local/www/apache22 ，但是Bugzilla通过ports安装后会把bugzilla的web目录安装在/usr/local/www/data/bugzilla下，这里您可以根据自己的喜好进行调整，可以把bugzilla目录移动到/usr/local/www/apache22/data/bugzilla下，也可以重新修改Apache的httpd.conf文件，把ServerRoot修改为/usr/local/www下，同时更新httpd.conf里面别的和/usr/local/www/apache22相关的设置。我用了后面的方法，因为通过ports安装的很多别的和apache相关的web应用都会默认到/usr/local/www下，比如cvsweb就是默认到/usr/local/www/cgi-bin目录下，未来安装其他应用的方便，我选择了修改apache的配置，而且修改起来很简单。大致的相关设置如下：</p>
<div class="hl-surround"><div class="hl-main">#cp -r /usr/local/www/apache22/* /usr/local/www/<br />#vi /usr/local/etc/apache22/httpd.conf<br />修改文件中和/usr/local/www/apache22相关的部分为 /usr/local/www，大概有三四个地方。<br /><br />然后在httpd.conf文件中增加下面一段内容<br />&lt;Directory /usr/local/www/data/bugzilla&gt;<br />&nbsp; AddHandler cgi-script .cgi<br />&nbsp; Options +Indexes +ExecCGI<br />&nbsp; DirectoryIndex index.cgi<br />&nbsp; AllowOverride Limit<br />&lt;/Directory&gt;<br />这段内容设置bugzilla目录可以执行cgi文件，因为bugzilla都是使用perl来编写的。</div></div>
<p>这样就完成了Apache的配置，重新启动apache服务即可。</p>
<p><b>Bugzilla最后设置</b></p>
<p>完成MySQL和Apache的设置基本上就完成了99%了，最后一步就是bugzilla自己的配置部分，配置过程也很简单，步骤如下：</p>
<div class="hl-surround"><div class="hl-main">#cd /usr/local/www/data/bugzilla<br />#./checksetup.pl<br />这是第一次执行该脚本，将自动为您创建配置文件localconfig<br />#vi ./localconfig<br />修改里面的数据库名、用户名、口令为您之前创建时候设置的值，保存退出<br />#./checksetup.pl<br />这个命令将使bugzilla自己完成数据库中各种表的创建和设置，同时会要求您输入bugzilla管理员的邮件地址和口令，按照提示输入即可，过程很简单</div></div>
<p>到此，bugzilla的全部安装就已经结束了，在浏览器里面输入 http://yourserverip/bugzilla/index.cgi 呵呵，看到可爱的虫子了吗？当然，您也可以配置apache的VirtualHost来使用独立的域名访问您的bugzilla，比如我配置的bugzilla就可以通过下面的域名访问 <a href="http://bugzilla.toplee.com ">http://bugzilla.toplee.com</a>，您可以测试一下！</p>
<p>由于目前bugzilla的中文汉化只支持到了2.20版本，我们安装的2.22版还没有汉化文件出来，暂时无法享受中文界面了，再等等吧，具体的可以关注 <a href="http://www.bugzilla.org ">http://www.bugzilla.org </a>最新动态！</p>
]]></content:encoded>
			<wfw:commentRss>http://www.toplee.com/blog/251.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>FreeBSD 6.1上用net-snmp-5.2.2和mrtg-2.13.2实现多种监控</title>
		<link>http://www.toplee.com/blog/94.html</link>
		<comments>http://www.toplee.com/blog/94.html#comments</comments>
		<pubDate>Fri, 02 Jun 2006 06:24:20 +0000</pubDate>
		<dc:creator>Michael</dc:creator>
				<category><![CDATA[Linux / BSD]]></category>
		<category><![CDATA[技术交流]]></category>

		<guid isPermaLink="false">http://www.toplee.com/blog/?p=94</guid>
		<description><![CDATA[其实从标题来看，这样的文章已经相当多，不过由于这次使用了最新版的系统和软件，在配置方面比原来的版本有了一些改进，明显更加方便，所以值得记录一下和大家分享。 这次实现监控的目标是系统网络流量、TCP连接数、CPU负载、system和user的CPU负载、内存消耗、swap使用，另外还可以在此基础上实现磁盘监控、Mailscanner的垃圾邮件等监控。 首先通过cvsup更新系统源码和ports数到当前的FreeBSD 6.1Release版本，保持系统和软件包的最新版本，然后使用极为方便的ports进行软件安装。 1、安装net-snmp-5.2.2 #cd /usr/ports/net-mgmt/net-snmp #make install clean 然后就等着系统自动为您下载net-snmp-5.2.2.tar.gz软件包以及关联软件包，ports会自动完成后续的安装。 2、配置snmp 等安装完成后会看到成功的提示以及后续配置的说明。接下来我们进行简单的几个配置即可完成snmp的安装配置。 #mkdir /usr/local/etc/snmp #cp /usr/local/share/snmp/snmpd.conf /usr/local/etc/snmp/ #vim /usr/local/etc/snmp/snmpd.conf 下面是我的配置文件内容 com2sec local localhost privatecom2sec mynet 192.168.0.0/24 publiccom2sec public default publicgroup mygroup v1 mynetgroup mygroup v2c mynetgroup mygroup usm mynetgroup local v1 localgroup local v2c localgroup local usm localgroup public v1 publicgroup public v2c publicgroup [...]]]></description>
			<content:encoded><![CDATA[<p>其实从标题来看，这样的文章已经相当多，不过由于这次使用了最新版的系统和软件，在配置方面比原来的版本有了一些改进，明显更加方便，所以值得记录一下和大家分享。</p>
<p>这次实现监控的目标是系统网络流量、TCP连接数、CPU负载、system和user的CPU负载、内存消耗、swap使用，另外还可以在此基础上实现磁盘监控、Mailscanner的垃圾邮件等监控。</p>
<p><span id="more-94"></span></p>
<p>首先通过cvsup更新系统源码和ports数到当前的FreeBSD 6.1Release版本，保持系统和软件包的最新版本，然后使用极为方便的ports进行软件安装。</p>
<p>1、安装net-snmp-5.2.2<br />
#cd /usr/ports/net-mgmt/net-snmp<br />
#make install clean<br />
然后就等着系统自动为您下载net-snmp-5.2.2.tar.gz软件包以及关联软件包，ports会自动完成后续的安装。</p>
<p>2、配置snmp<br />
等安装完成后会看到成功的提示以及后续配置的说明。接下来我们进行简单的几个配置即可完成snmp的安装配置。<br />
#mkdir /usr/local/etc/snmp<br />
#cp /usr/local/share/snmp/snmpd.conf /usr/local/etc/snmp/<br />
#vim /usr/local/etc/snmp/snmpd.conf<br />
下面是我的配置文件内容</p>
<div class="hl-surround"><div class="hl-main">com2sec local localhost private<br />com2sec mynet 192.168.0.0/24 public<br />com2sec public default public<br /><br />group mygroup v1 mynet<br />group mygroup v2c mynet<br />group mygroup usm mynet<br />group local v1 local<br />group local v2c local<br />group local usm local<br />group public v1 public<br />group public v2c public<br />group public usm public<br /><br />view all included .1 80<br /><br />access mygroup &quot;&quot; any noauth exact mib2 none none<br />access public &quot;&quot; any noauth exact all none none<br />access local &quot;&quot; any noauth exact all all all<br /><br />syslocation Right here, right now.<br />syscontact Me<br /><br />proc mountd<br />proc ntalkd 4<br />proc sendmail 10 1<br /><br />exec echotest /bin/echo hello world<br /><br />disk / 10000<br /><br />load 12 14 14</div></div>
<p>其实里面只有很少的部分是自己修改的，大部分是默认值，具体的您可以对比一下您的snmpd.conf文件，建议把您的配置文件使用 grep -v # snmpd.conf > snmpd.conf.new 去掉所有的注释行再进行配置，这样看起来更清晰一些。</p>
<p>完成上面的配置，snmp的安装和配置已经完成，此时我们可以使用 snmpwalk -v 1 -c public localhost system 来测试看看返回结果，正常应该返回类似下面的内容。</p>
<div class="hl-surround"><div class="hl-main">SNMPv2-MIB::sysDescr.0 = STRING: FreeBSD www.toplee.com 6.1-RELEASE FreeBSD 6.1-RELEASE #0: Wed May 24 13:32:37 CST 2006 root@www.toplee.com:/usr/src/sys/i386/compile/TOPLEE i386<br />SNMPv2-MIB::sysObjectID.0 = OID: SNMPv2-SMI::dod.0.0.0.0.0.0.0<br />DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (8548737) 23:44:47.37<br />SNMPv2-MIB::sysContact.0 = STRING: Me<br />SNMPv2-MIB::sysName.0 = STRING: www.toplee.com<br />SNMPv2-MIB::sysLocation.0 = STRING: Right here, right now.<br />SNMPv2-MIB::sysServices.0 = INTEGER: 72<br />SNMPv2-MIB::sysORLastChange.0 = Timeticks: (11) 0:00:00.11<br />SNMPv2-MIB::sysORID.1 = OID: IF-MIB::ifMIB<br />SNMPv2-MIB::sysORID.2 = OID: SNMPv2-MIB::snmpMIB<br />SNMPv2-MIB::sysORID.3 = OID: TCP-MIB::tcpMIB<br />SNMPv2-MIB::sysORID.4 = OID: IP-MIB::ip<br />SNMPv2-MIB::sysORID.5 = OID: UDP-MIB::udpMIB<br />SNMPv2-MIB::sysORID.6 = OID: SNMP-VIEW-BASED-ACM-MIB::vacmBasicGroup<br />SNMPv2-MIB::sysORID.7 = OID: SNMP-FRAMEWORK-MIB::snmpFrameworkMIBCompliance<br />SNMPv2-MIB::sysORID.8 = OID: SNMP-MPD-MIB::snmpMPDCompliance<br />SNMPv2-MIB::sysORID.9 = OID: SNMP-USER-BASED-SM-MIB::usmMIBCompliance<br />SNMPv2-MIB::sysORDescr.1 = STRING: The MIB module to describe generic objects for network interface sub-layers<br />SNMPv2-MIB::sysORDescr.2 = STRING: The MIB module for SNMPv2 entities<br />SNMPv2-MIB::sysORDescr.3 = STRING: The MIB module for managing TCP implementations<br />SNMPv2-MIB::sysORDescr.4 = STRING: The MIB module for managing IP and ICMP implementations<br />SNMPv2-MIB::sysORDescr.5 = STRING: The MIB module for managing UDP implementations<br />SNMPv2-MIB::sysORDescr.6 = STRING: View-based Access Control Model for SNMP.<br />SNMPv2-MIB::sysORDescr.7 = STRING: The SNMP Management Architecture MIB.<br />SNMPv2-MIB::sysORDescr.8 = STRING: The MIB for Message Processing and Dispatching.<br />SNMPv2-MIB::sysORDescr.9 = STRING: The management information definitions for the SNMP User-based Security Model.<br />SNMPv2-MIB::sysORUpTime.1 = Timeticks: (9) 0:00:00.09<br />SNMPv2-MIB::sysORUpTime.2 = Timeticks: (11) 0:00:00.11<br />SNMPv2-MIB::sysORUpTime.3 = Timeticks: (11) 0:00:00.11<br />SNMPv2-MIB::sysORUpTime.4 = Timeticks: (11) 0:00:00.11<br />SNMPv2-MIB::sysORUpTime.5 = Timeticks: (11) 0:00:00.11<br />SNMPv2-MIB::sysORUpTime.6 = Timeticks: (11) 0:00:00.11<br />SNMPv2-MIB::sysORUpTime.7 = Timeticks: (11) 0:00:00.11<br />SNMPv2-MIB::sysORUpTime.8 = Timeticks: (11) 0:00:00.11<br />SNMPv2-MIB::sysORUpTime.9 = Timeticks: (11) 0:00:00.11</div></div>
<p>您可以去掉后面的system参数得到所有的snmp返回数据，通过分析这些数据就可以实现对系统的各种监控，这是mrtg通过snmp实现监控的途径。</p>
<p>为了让系统在启动的时候自动启动snmpd监听服务，我们要对/etc/rc.conf进行配置，在该文件种添加下面内容：<br />
snmpd_enable=&#8221;YES&#8221;<br />
snmpd_flags=&#8221;-a -p /var/run/snmpd.pid&#8221;<br />
snmptrapd_enable=&#8221;YES&#8221;<br />
snmptrapd_flags=&#8221;-a -p /var/run/snmptrapd.pid&#8221;<br />
下面参数可选<br />
NET_SNMP_SYS_CONTACT=&#8221;Michael@toplee.com&#8221;<br />
NET_SNMP_SYS_LOCATION=&#8221;Beijing,China&#8221;<br />
DEFAULT_SNMP_VERSION=3<br />
NET_SNMP_MIB_MODULES=&#8221;host smux mibII/mta_sendmail ucd-snmp/diskio&#8221;<br />
NET_SNMP_LOGFILE=/var/log/snmpd.log<br />
NET_SNMP_PERSISTENTDIR=/var/net-snmp</p>
<p>3、安装mrtg-2.13.2<br />
在完成了上面的snmp安装配置之后，开始进行mrtg的安装配置，也使用非常方便的ports进行安装<br />
#cd /usr/ports/net-mgmt/mrtg/<br />
#make install clean</p>
<p>4、配置mrtg<br />
#vim /usr/local/etc/mrtg/mrtg.cfg<br />
下面是我的配置文件</p>
<div class="hl-surround"><div class="hl-main">WorkDir: /var/www/mrtg<br />Language: gb2312<br /><br />Options[_]: growright, bits<br /><br />Target[traffic_1]: 1:public@localhost:<br />SetEnv[traffic_1]: MRTG_INT_IP=&quot;localhost&quot; MRTG_INT_DESCR=&quot;流量分析&quot;<br />Xsize[traffic_1]: 380<br />MaxBytes[traffic_1]: 2500000<br />Title[traffic_1]: 前端服务器流量监控<br />PageTop[traffic_1]: &lt;h1&gt;前端服务器流量监控控&lt;/h1&gt;<br />&lt;table&gt;<br />   &lt;tr&gt;&lt;td&gt;System:&lt;/td&gt;     &lt;td&gt;FreeBSD web server of Toplee.com Col &lt;/td&gt;&lt;/tr&gt;<br />   &lt;tr&gt;&lt;td&gt;Maintainer:&lt;/td&gt; &lt;td&gt;Michael &amp;lt;toplee@gamil.com&amp;gt; &lt;/td&gt;&lt;/tr&gt;<br />   &lt;tr&gt;&lt;td&gt;ifType:&lt;/td&gt;     &lt;td&gt;ethernetCsmacd (6)&lt;/td&gt;&lt;/tr&gt;<br />   &lt;tr&gt;&lt;td&gt;Max Speed:&lt;/td&gt;  &lt;td&gt;2.5 MBytes/s&lt;/td&gt;&lt;/tr&gt;<br />&lt;/table&gt;<br /><br /><br />########################### TCP Cons ######################################<br />Target[tcpopen]: .1.3.6.1.2.1.6.9.0&amp;.1.3.6.1.2.1.6.9.0:public@localhost<br />Options[tcpopen]: nopercent,growright,gauge,noinfo<br />Title[tcpopen]: Open TCP connections<br />PageTop[tcpopen]: &lt;h1&gt;Open TCP connections&lt;/h1&gt;<br />MaxBytes[tcpopen]: 1000000<br />YLegend[tcpopen]: # conns<br />ShortLegend[tcpopen]: connections<br />LegendI[tcpopen]:  Connections:<br />LegendO[tcpopen]:<br />Legend1[tcpopen]: Open TCP connections<br /><br /><br />######################### CPU ############################################<br />LoadMIBs: /usr/local/share/snmp/mibs/UCD-SNMP-MIB.txt<br />Target[cpu]:ssCpuRawUser.0&amp;ssCpuRawUser.0:public@localhost + ssCpuRawSystem.0&amp;ssCpuRawSystem.0:public@localhost + ssCpuRawNice.0&amp;ssCpuRawNice.0:public@localhost<br />RouterUptime[cpu]: public@localhost<br />MaxBytes[cpu]: 100<br />Title[cpu]: CPU Load<br />PageTop[cpu]: &lt;h1&gt;Carga de CPU %&lt;/h1&gt;<br />Unscaled[cpu]: ymwd<br />ShortLegend[cpu]: %<br />YLegend[cpu]: Uso de CPU<br />Legend1[cpu]: CPU Activa % (Carga)<br />Legend2[cpu]:<br />Legend3[cpu]:<br />Legend4[cpu]:<br />LegendI[cpu]:  Active<br />LegendO[cpu]:<br />Options[cpu]: growright,nopercent<br /><br />######################## CPU UsrSys ####################################<br />LoadMIBs: /usr/local/share/snmp/mibs/UCD-SNMP-MIB.txt<br />Target[usrsys]:ssCpuRawUser.0&amp;ssCpuRawSystem.0:public@localhost<br />RouterUptime[usrsys]: public@localhost<br />MaxBytes[usrsys]: 100<br />Title[usrsys]: CPU LOAD<br />PageTop[usrsys]: &lt;h1&gt;CPU (user and system) Load %&lt;/h1&gt;<br />Unscaled[usrsys]: ymwd<br />ShortLegend[usrsys]: %<br />YLegend[usrsys]: CPU Utilization<br />Legend1[usrsys]: User CPU in % (Load)<br />Legend2[usrsys]: System CPU in % (Load)<br />Legend3[usrsys]:<br />Legend4[usrsys]:<br />LegendI[usrsys]:  User<br />LegendO[usrsys]:  System<br />Options[usrsys]: growright,nopercent<br /><br /><br />########################### Mem ###########################################<br />LoadMIBs: /usr/local/share/snmp/mibs/HOST-RESOURCES-MIB.txt<br />Target[mem]: .1.3.6.1.4.1.2021.4.6.0&amp;.1.3.6.1.4.1.2021.4.6.0:public@localhost<br />PageTop[mem]: &lt;h1&gt;Memory RAM&lt;/h1&gt;<br />Options[mem]: nopercent,growright,gauge,noinfo<br />Title[mem]: Memory Libre<br />MaxBytes[mem]: 1055309824<br />kMG[mem]: k,M,G,T,P,X<br />YLegend[mem]: bytes<br />ShortLegend[mem]: bytes<br />LegendI[mem]:  Free Memory:<br />LegendO[mem]:<br />Legend1[mem]: Free memory, not including swap, in bytes<br /><br />####################### MEM1 ############################################<br />LoadMIBs: /usr/local/share/snmp/mibs/HOST-RESOURCES-MIB.txt<br />Target[mem1]:.1.3.6.1.4.1.2021.4.6.0&amp;.1.3.6.1.4.1.2021.4.15.0:public@localhost * 1024<br />MaxBytes[mem1]: 1055309824<br />Title[mem1]: MEMORY USAGE<br />kilo[mem1]: 1024<br />WithPeak[mem1]: my<br />Options[mem1]: gauge,growright<br />YLegend[mem1]: Memory Usage<br />LegendI[mem1]: Used:<br />LegendO[mem1]: Cached:<br />Legend1[mem1]: Used Memory Size<br />Legend2[mem1]: Cached Memory Size<br />Legend3[mem1]: 5min Max Used Memory Size<br />Legend4[mem1]: 5min Max Cached Memory Size<br />ShortLegend[mem1]: B<br />PageTop[mem1]: &lt;h1&gt;MEMORY USAGE&lt;/h1&gt;<br /><br />############################ Swap info #####################################<br />LoadMIBs: /usr/local/share/snmp/mibs/UCD-SNMP-MIB.txt<br />Target[swap]: memAvailSwap.0&amp;memAvailSwap.0:public@localhost<br />PageTop[swap]: &lt;h1&gt;Memory Swap&lt;/h1&gt;<br />Options[swap]: nopercent,growright,gauge,noinfo<br />Title[swap]: Memory Libre<br />MaxBytes[swap]: 3000000<br />kMG[swap]: k,M,G,T,P,X<br />YLegend[swap]: bytes<br />ShortLegend[swap]: bytes<br />LegendI[swap]:  Memory Libre:<br />LegendO[swap]:<br />Legend1[swap]: Swap memory avail, in bytes<br /><br /><br />######################## Load Avarage ####################################<br />LoadMIBs: /usr/local/share/snmp/mibs/HOST-RESOURCES-MIB.txt<br />Target[load]:.1.3.6.1.4.1.2021.10.1.3.2&amp;.1.3.6.1.4.1.2021.10.1.3.3:public@localhost * 100<br />WithPeak[load]: my<br />MaxBytes[load]: 10000<br />Title[load]: SYSTEM LOAD AVG.<br />Options[load]: growright,gauge,integer,nopercent<br />YLegend[load]: Load Average<br />LegendI[load]: 5 min:<br />LegendO[load]: 15 min:<br />Legend1[load]: Load average for 5 Min<br />Legend2[load]: Load average for 15 Min<br />Legend3[load]: Max load average for 5 Min<br />Legend4[load]: Max Load average for 15 Min<br />YTicsFactor[load]: 0.01<br />#ShortLegend[load]: _<br />PageTop[load]: &lt;h1&gt;LOAD AVERAGE &lt;/h1&gt;</div></div>
<p>可以根据具体的需求进行修改上面的配置文件，有什么疑问可以参考mrtg的官方文档，比如<a href="http://net-snmp.sourceforge.net/tutorial/tutorial-5/mrtg/index.html">http://net-snmp.sourceforge.net/tutorial/tutorial-5/mrtg/index.html</a> 有当前版本的snmp下mrtg.cfg配置的范例可以参考。<br />
 </p>
<p>下面是我的mrtg监控页面效果 <a href="http://toplee:toplee@mrtg.toplee.com">http://toplee:toplee@mrtg.toplee.com</a></p>
<p>以上的讨论基本都是基于在本机上进行监控而言，如果你有多台机器进行监控，可以根据具体需要修改snmpd.conf文件中public的权限，让您的mrtg监控机器可以通过snmp取到监控数据。</p>
<p>欢迎大家一起讨论，有发现我前面的什么地方有问题也欢迎给我指出来，共同进步。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.toplee.com/blog/94.html/feed</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>昨晚服务器意外出现Directory not empty故障</title>
		<link>http://www.toplee.com/blog/90.html</link>
		<comments>http://www.toplee.com/blog/90.html#comments</comments>
		<pubDate>Wed, 10 May 2006 07:55:54 +0000</pubDate>
		<dc:creator>Michael</dc:creator>
				<category><![CDATA[Linux / BSD]]></category>
		<category><![CDATA[技术交流]]></category>

		<guid isPermaLink="false">http://www.toplee.com/blog/?p=90</guid>
		<description><![CDATA[昨晚在编写一个用于自动抓取一些域名到期信息并进行过滤整理的shell脚本时，不甚操作不当，导致出现服务器上一个目录无法删除，使用rm -rf也无效，目录中原有文件和新创建的文件均无法查看，使用ls -al也无任何显示，有点“黑洞”的感觉，明明里面有东西，却无法显示，新创建文件也看不到，想删除目录还无法删除，以前没有遇到过这样的故障，于是尝试若干办法还是未能收到效果，反倒搞得该目录的上级目录出现混乱，部分其他目录也出现了类似情况，大呼不妙，迫不得已进行远程重启，无奈重启失败，今天一早到了机房，从错误日志上一看，明白了故障所在。 这样的故障一般会出现在ports软件升级突然中断，或者有关磁盘目录创建删除等操作的程序意外中断时，而且也不是总能出现，还得有很多偶然情况发生赶巧了才能遇到。我之前的脚本在调试过程中放入了后台运行，结果意外被我中断并重新运行，结果导致了目录中.的指向错误，进而导致一个后台的fsck失败，这样日志中就看到了类似这样的错误信息 PARTIALLY TRUNCATED INODE I=316169 UNEXPECTED SOFT UPDATE INCONSISTENCY; RUN fsck MANUALLY. 于是有了解决思路，重启后 boot -s进入单用户模式，运行fsck -p ，再次重启，问题解决：）总的来说算是有惊无险！ 其实过后查询文档知道如果遇到那样的目录错误，可以使用 chflags -R noschg 进行处理，实在不行再重启 fsck -p 不知道有没有高人对这样的故障有另外的指点？freebsd总是这样让我又爱又恨，听说最近Release 6.1出来了，有时间升级一下。]]></description>
			<content:encoded><![CDATA[<p>昨晚在编写一个用于自动抓取一些域名到期信息并进行过滤整理的shell脚本时，不甚操作不当，导致出现服务器上一个目录无法删除，使用rm -rf也无效，目录中原有文件和新创建的文件均无法查看，使用ls -al也无任何显示，有点“黑洞”的感觉，明明里面有东西，却无法显示，新创建文件也看不到，想删除目录还无法删除，以前没有遇到过这样的故障，于是尝试若干办法还是未能收到效果，反倒搞得该目录的上级目录出现混乱，部分其他目录也出现了类似情况，大呼不妙，迫不得已进行远程重启，无奈重启失败，今天一早到了机房，从错误日志上一看，明白了故障所在。<br />
<span id="more-90"></span></p>
<p>这样的故障一般会出现在ports软件升级突然中断，或者有关磁盘目录创建删除等操作的程序意外中断时，而且也不是总能出现，还得有很多偶然情况发生赶巧了才能遇到。我之前的脚本在调试过程中放入了后台运行，结果意外被我中断并重新运行，结果导致了目录中.的指向错误，进而导致一个后台的fsck失败，这样日志中就看到了类似这样的错误信息<br />
PARTIALLY TRUNCATED INODE I=316169<br />
UNEXPECTED SOFT UPDATE INCONSISTENCY; RUN fsck MANUALLY.</p>
<p>于是有了解决思路，重启后 boot -s进入单用户模式，运行fsck -p ，再次重启，问题解决：）总的来说算是有惊无险！</p>
<p>其实过后查询文档知道如果遇到那样的目录错误，可以使用 chflags -R noschg 进行处理，实在不行再重启 fsck -p </p>
<p>不知道有没有高人对这样的故障有另外的指点？freebsd总是这样让我又爱又恨，听说最近Release 6.1出来了，有时间升级一下。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.toplee.com/blog/90.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>SSH权威指南</title>
		<link>http://www.toplee.com/blog/39.html</link>
		<comments>http://www.toplee.com/blog/39.html#comments</comments>
		<pubDate>Wed, 15 Feb 2006 08:20:53 +0000</pubDate>
		<dc:creator>Michael</dc:creator>
				<category><![CDATA[C / Erlang / Lua]]></category>
		<category><![CDATA[Linux / BSD]]></category>
		<category><![CDATA[技术交流]]></category>

		<guid isPermaLink="false">http://www.toplee.com/blog/?p=39</guid>
		<description><![CDATA[Show All &#160; 1 2 3 4 5 6 7 注意：由于openssh是开源软件，各版间的配置方法和设置参数可能会不同，所以设置时要以最新版的手册为准，不要硬套本文的设置。 第一章 SSH简介 ssh(secure shell)是一种通用，功能强大的基于软件的网络安全解决方案，计算机每次向网络发送数据时，SSH都会自动对其进行加密。数据到达目的地时，SSH自动对加密数据进行解密。整个过程都是透明的。它使用了现代的安全加密算法，足以胜任大型公司的任务繁重的应用程序的要求。 SSH协议内容涉及认证AUTHENTICATION,加密ENCRYPTION,和网络上传输数据的完整性INTEGRITY。 SSH特性概述 1、远程登录 $ ssh -l root host.example.com 2、安全文件传输 $ scp myfile metoo@secondacount.com 3、安全执行远程命令，能确保传输的数据安全。 4、密钥和代理 基于密钥的认证方法不用记住多个帐号密码。 5、访问控制，能授权别人访问自已帐号。 6、端口转发 $ ssh -L 3002:localhost:119 xxx.xxx.com 相关安全技术 rsh命令族，rsh,rlogin and rcp。连接不加密，认证模型十分脆弱。 PGP加密程序。它是基于文件的。 Kerberos认证系统，用于网络可能被监视，而且计算机不是中心控制的环境。基于麻省理工学院的Athena项目。它SSH不是，SSH是轻量级的，容易部署。Kerberos使用前必须构建一些重要基础。 IPSEC，Internet安全协议。 SRP，安全远程密码协议，是Stanford大学开发的。是一种专用的认证协议。 SSL,安全套接字。 stunnel，是一种SSL工具，它为UNIX环境现有的基于TCP的服务（POP,IMAP等）增加SSL保护，而不用修改服务器源程序。 Show All &#160; 1 2 3 4 [...]]]></description>
			<content:encoded><![CDATA[<div id="pagepost_39" class="pagepost"><div id="pagebar_top_39" class="pagebar"><a name="pp0"></a><a name="pp1"></a><a name="pp2"></a><a name="pp3"></a><a name="pp4"></a><a name="pp5"></a><a name="pp6"></a><a name="pp7"></a><a href="#pp0" onclick="pagepost(39, 0);">Show All</a> &nbsp; <strong style="color: #1E90FF;" title="">1</strong> <a href="#pp2" title="" onclick="pagepost(39, 2);">2</a> <a href="#pp3" title="" onclick="pagepost(39, 3);">3</a> <a href="#pp4" title="" onclick="pagepost(39, 4);">4</a> <a href="#pp5" title="" onclick="pagepost(39, 5);">5</a> <a href="#pp6" title="" onclick="pagepost(39, 6);">6</a> <a href="#pp7" title="" onclick="pagepost(39, 7);">7</a> <strong id="pagebar_loading_39" style="color: green;"></strong></div><p>注意：由于openssh是开源软件，各版间的配置方法和设置参数可能会不同，所以设置时要以最新版的手册为准，不要硬套本文的设置。</p>
<p>第一章 SSH简介<br />
ssh(secure shell)是一种通用，功能强大的基于软件的网络安全解决方案，计算机每次向网络发送数据时，SSH都会自动对其进行加密。数据到达目的地时，SSH自动对加密数据进行解密。整个过程都是透明的。它使用了现代的安全加密算法，足以胜任大型公司的任务繁重的应用程序的要求。<br />
<span id="more-39"></span><br />
SSH协议内容涉及认证AUTHENTICATION,加密ENCRYPTION,和网络上传输数据的完整性INTEGRITY。</p>
<p>SSH特性概述<br />
1、远程登录<br />
$ ssh -l root host.example.com<br />
2、安全文件传输<br />
$ scp myfile metoo@secondacount.com<br />
3、安全执行远程命令，能确保传输的数据安全。<br />
4、密钥和代理<br />
基于密钥的认证方法不用记住多个帐号密码。<br />
5、访问控制，能授权别人访问自已帐号。<br />
6、端口转发<br />
$ ssh -L 3002:localhost:119 xxx.xxx.com</p>
<p>相关安全技术<br />
rsh命令族，rsh,rlogin and rcp。连接不加密，认证模型十分脆弱。<br />
PGP加密程序。它是基于文件的。<br />
Kerberos认证系统，用于网络可能被监视，而且计算机不是中心控制的环境。基于麻省理工学院的Athena项目。它SSH不是，SSH是轻量级的，容易部署。Kerberos使用前必须构建一些重要基础。<br />
IPSEC，Internet安全协议。<br />
SRP，安全远程密码协议，是Stanford大学开发的。是一种专用的认证协议。<br />
SSL,安全套接字。<br />
stunnel，是一种SSL工具，它为UNIX环境现有的基于TCP的服务（POP,IMAP等）增加SSL保护，而不用修改服务器源程序。</p>
<div id="pagebar_bottom_39" class="pagebar"><a href="#pp0" onclick="pagepost(39, 0);">Show All</a> &nbsp; <strong style="color: #1E90FF;" title="">1</strong> <a href="#pp2" title="" onclick="pagepost(39, 2);">2</a> <a href="#pp3" title="" onclick="pagepost(39, 3);">3</a> <a href="#pp4" title="" onclick="pagepost(39, 4);">4</a> <a href="#pp5" title="" onclick="pagepost(39, 5);">5</a> <a href="#pp6" title="" onclick="pagepost(39, 6);">6</a> <a href="#pp7" title="" onclick="pagepost(39, 7);">7</a> </div></div>]]></content:encoded>
			<wfw:commentRss>http://www.toplee.com/blog/39.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Tcpdump 的详细用法(收集)</title>
		<link>http://www.toplee.com/blog/63.html</link>
		<comments>http://www.toplee.com/blog/63.html#comments</comments>
		<pubDate>Wed, 08 Feb 2006 16:13:27 +0000</pubDate>
		<dc:creator>Michael</dc:creator>
				<category><![CDATA[C / Erlang / Lua]]></category>
		<category><![CDATA[Linux / BSD]]></category>
		<category><![CDATA[技术交流]]></category>
		<category><![CDATA[西拉东扯]]></category>

		<guid isPermaLink="false">http://www.toplee.com/blog/?p=63</guid>
		<description><![CDATA[第一种是关于类型的关键字，主要包括host，net，port, 例如 host 210.27.48.2，指明 210.27.48.2是一台主机，net 202.0.0.0 指明 202.0.0.0是一个网络地址，port 23 指明端口号是23。如果没有指定类型，缺省的类型是host. 第二种是确定传输方向的关键字，主要包括src , dst ,dst or src, dst and src ,这些关键字指明了传输的方向。举例说明，src 210.27.48.2 ,指明ip包中源地址是210.27.48.2 , dst net 202.0.0.0 指明目的网络地址是202.0.0.0 。如果没有指明方向关键字，则缺省是src or dst关键字。 第三种是协议的关键字，主要包括fddi,ip,arp,rarp,tcp,udp等类型。Fddi指明是在FDDI(分布式光纤数据接口网络)上的特定 的网络协议，实际上它是&#8221;ether&#8221;的别名，fddi和ether具有类似的源地址和目的地址，所以可以将fddi协议包当作ether的包进行处理和 分析。其他的几个关键字就是指明了监听的包的协议内容。如果没有指定任何协议，则tcpdump将会监听所有协议的信息包。 除了这三种类型的关键字之外，其他重要的关键字如下：gateway, broadcast,less,greater,还有三种逻辑运算，取非运算是 &#8216;not &#8216; &#8216;! &#8216;, 与运算是&#8217;and&#8217;,'&#038;&#038;&#8217;;或运算 是&#8217;or&#8217; ,&#8217;││&#8217;；这些关键字可以组合起来构成强大的组合条件来满足人们的需要，下面举几个例子来说明。 普通情况下，直接启动tcpdump将监视第一个网络界面上所有流过的数据包。 # tcpdump tcpdump: listening on fxp0 11:58:47.873028 202.102.245.40.netbios-ns > 202.102.245.127.netbios-ns: udp 50 [...]]]></description>
			<content:encoded><![CDATA[<p>第一种是关于类型的关键字，主要包括host，net，port, 例如 host 210.27.48.2，指明 210.27.48.2是一台主机，net 202.0.0.0 指明 202.0.0.0是一个网络地址，port 23 指明端口号是23。如果没有指定类型，缺省的类型是host.</p>
<p>第二种是确定传输方向的关键字，主要包括src , dst ,dst or src, dst and src ,这些关键字指明了传输的方向。举例说明，src 210.27.48.2 ,指明ip包中源地址是210.27.48.2 , dst net 202.0.0.0 指明目的网络地址是202.0.0.0 。如果没有指明方向关键字，则缺省是src or dst关键字。<br />
<span id="more-63"></span><br />
第三种是协议的关键字，主要包括fddi,ip,arp,rarp,tcp,udp等类型。Fddi指明是在FDDI(分布式光纤数据接口网络)上的特定 的网络协议，实际上它是&#8221;ether&#8221;的别名，fddi和ether具有类似的源地址和目的地址，所以可以将fddi协议包当作ether的包进行处理和 分析。其他的几个关键字就是指明了监听的包的协议内容。如果没有指定任何协议，则tcpdump将会监听所有协议的信息包。</p>
<p>    除了这三种类型的关键字之外，其他重要的关键字如下：gateway, broadcast,less,greater,还有三种逻辑运算，取非运算是 &#8216;not &#8216; &#8216;! &#8216;, 与运算是&#8217;and&#8217;,'&#038;&#038;&#8217;;或运算 是&#8217;or&#8217; ,&#8217;││&#8217;；这些关键字可以组合起来构成强大的组合条件来满足人们的需要，下面举几个例子来说明。<br />
    普通情况下，直接启动tcpdump将监视第一个网络界面上所有流过的数据包。<br />
# tcpdump<br />
tcpdump: listening on fxp0<br />
11:58:47.873028 202.102.245.40.netbios-ns > 202.102.245.127.netbios-ns: udp 50<br />
11:58:47.974331 0:10:7b:8:3a:56 > 1:80:c2:0:0:0 802.1d ui/C len=43<br />
                         0000 0000 0080 0000 1007 cf08 0900 0000<br />
                         0e80 0000 902b 4695 0980 8701 0014 0002<br />
                         000f 0000 902b 4695 0008 00<br />
11:58:48.373134 0:0:e8:5b:6d:85 > Broadcast sap e0 ui/C len=97<br />
                         ffff 0060 0004 ffff ffff ffff ffff ffff<br />
                         0452 ffff ffff 0000 e85b 6d85 4008 0002<br />
                         0640 4d41 5354 4552 5f57 4542 0000 0000<br />
                         0000 00<br />
使用-i参数指定tcpdump监听的网络界面，这在计算机具有多个网络界面时非常有用，<br />
使用-c参数指定要监听的数据包数量，<br />
使用-w参数指定将监听到的数据包写入文件中保存</p>
<p>   A想要截获所有210.27.48.1 的主机收到的和发出的所有的数据包：<br />
#tcpdump host 210.27.48.1 </p>
<p>B想要截获主机210.27.48.1 和主机210.27.48.2 或210.27.48.3的通信，使用命令：（在命令行中适用　　　括号时，一定要<br />
#tcpdump host 210.27.48.1 and \ (210.27.48.2 or 210.27.48.3 \) </p>
<p>C如果想要获取主机210.27.48.1除了和主机210.27.48.2之外所有主机通信的ip包，使用命令：<br />
#tcpdump ip host 210.27.48.1 and ! 210.27.48.2</p>
<p>D如果想要获取主机210.27.48.1接收或发出的telnet包，使用如下命令：<br />
#tcpdump tcp port 23 host 210.27.48.1</p>
<p>E 对本机的udp 123 端口进行监视 123 为ntp的服务端口<br />
# tcpdump udp port 123 </p>
<p>F 系统将只对名为hostname的主机的通信数据包进行监视。主机名可以是本地主机，也可以是网络上的任何一台计算机。下面的命令可以读取主机hostname发送的所有数据：<br />
#tcpdump -i eth0 src host hostname</p>
<p>G 下面的命令可以监视所有送到主机hostname的数据包：<br />
#tcpdump -i eth0 dst host hostname</p>
<p>H  我们还可以监视通过指定网关的数据包：<br />
#tcpdump -i eth0 gateway Gatewayname</p>
<p>I 如果你还想监视编址到指定端口的TCP或UDP数据包，那么执行以下命令：<br />
#tcpdump -i eth0 host hostname and port 80</p>
<p>J 如果想要获取主机210.27.48.1除了和主机210.27.48.2之外所有主机通信的ip包<br />
，使用命令：<br />
#tcpdump ip host 210.27.48.1 and ! 210.27.48.2</p>
<p>K 想要截获主机210.27.48.1 和主机210.27.48.2 或210.27.48.3的通信，使用命令<br />
：（在命令行中适用　　　括号时，一定要<br />
#tcpdump host 210.27.48.1 and \ (210.27.48.2 or 210.27.48.3 \)</p>
<p>L 如果想要获取主机210.27.48.1除了和主机210.27.48.2之外所有主机通信的ip包，使用命令：<br />
　　　#tcpdump ip host 210.27.48.1 and ! 210.27.48.2</p>
<p>M 如果想要获取主机210.27.48.1接收或发出的telnet包，使用如下命令：<br />
　　　#tcpdump tcp port 23 host 210.27.48.1</p>
<p>第三种是协议的关键字，主要包括fddi,ip ,arp,rarp,tcp,udp等类型<br />
除了这三种类型的关键字之外，其他重要的关键字如下：gateway, broadcast,less,<br />
greater,还有三种逻辑运算，取非运算是 &#8216;not &#8216; &#8216;! &#8216;, 与运算是&#8217;and&#8217;,'&#038;&#038;&#8217;;或运算 是&#8217;o<br />
r&#8217; ,&#8217;||&#8217;；<br />
第二种是确定传输方向的关键字，主要包括src , dst ,dst or src, dst and src ,<br />
如果我们只需要列出送到80端口的数据包，用dst port；如果我们只希望看到返回80端口的数据包，用src port。<br />
#tcpdump –i eth0 host hostname and dst port 80  目的端口是80<br />
或者<br />
#tcpdump –i eth0 host hostname and src port 80  源端口是80  一般是提供http的服务的主机<br />
如果条件很多的话  要在条件之前加and 或 or 或 not<br />
#tcpdump -i eth0 host ! 211.161.223.70 and ! 211.161.223.71 and dst port 80</p>
<p>如果在ethernet 使用混杂模式 系统的日志将会记录</p>
<p>May  7 20:03:46 localhost kernel: eth0: Promiscuous mode enabled.<br />
May  7 20:03:46 localhost kernel: device eth0 entered promiscuous mode<br />
May  7 20:03:57 localhost kernel: device eth0 left promiscuous mode</p>
<p>tcpdump对截获的数据并没有进行彻底解码，数据包内的大部分内容是使用十六进制的形式直接打印输出的。显然这不利于分析网络故障，通常的解决办法是先使用带-w参数的tcpdump 截获数据并保存到文件中，然后再使用其他程序进行解码分析。当然也应该定义过滤规则，以避免捕获的数据包填满整个硬盘。 </p>
<p>另外，使用Ethereal配合tcpdump可以实现很多意想不到的功能，比如过滤密码之类的，呵呵！</p>
]]></content:encoded>
			<wfw:commentRss>http://www.toplee.com/blog/63.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>收集整理的awk用法小结</title>
		<link>http://www.toplee.com/blog/62.html</link>
		<comments>http://www.toplee.com/blog/62.html#comments</comments>
		<pubDate>Wed, 08 Feb 2006 15:52:52 +0000</pubDate>
		<dc:creator>Michael</dc:creator>
				<category><![CDATA[C / Erlang / Lua]]></category>
		<category><![CDATA[Linux / BSD]]></category>
		<category><![CDATA[技术交流]]></category>

		<guid isPermaLink="false">http://www.toplee.com/blog/?p=62</guid>
		<description><![CDATA[提示：其实 man awk 提供的文档也很详细，不过整理加上中文估计还是可以对初学者有一定帮助的。 awk 用法：awk &#8216; pattern {action} &#8216; 变量名 含义 ARGC 命令行变元个数 ARGV 命令行变元数组 FILENAME 当前输入文件名 FNR 当前文件中的记录号 FS 输入域分隔符，默认为一个空格 RS 输入记录分隔符 NF 当前记录里域个数 NR 到目前为止记录数 OFS 输出域分隔符 ORS 输出记录分隔符 1、 awk &#8216;/101/&#8217; file 显示文件file中包含101的匹配行。 awk &#8216;/101/,/105/&#8217; file awk &#8216;$1 == 5&#8242; file awk &#8216;$1 == &#8220;CT&#8221;&#8216; file 注意必须带双引号 awk &#8216;$1 * $2 [...]]]></description>
			<content:encoded><![CDATA[<p>提示：其实 man awk 提供的文档也很详细，不过整理加上中文估计还是可以对初学者有一定帮助的。</p>
<p>awk 用法：awk &#8216; pattern {action} &#8216; </p>
<p>变量名                含义<br />
ARGC                命令行变元个数<br />
ARGV                命令行变元数组<br />
FILENAME        当前输入文件名<br />
FNR                当前文件中的记录号<br />
FS                输入域分隔符，默认为一个空格<br />
RS                输入记录分隔符<br />
NF                当前记录里域个数<br />
NR                到目前为止记录数<br />
OFS                输出域分隔符<br />
ORS                输出记录分隔符<br />
<span id="more-62"></span><br />
1、<br />
    awk &#8216;/101/&#8217;               file 显示文件file中包含101的匹配行。<br />
    awk &#8216;/101/,/105/&#8217;         file<br />
    awk &#8216;$1 == 5&#8242;             file<br />
    awk &#8216;$1 == &#8220;CT&#8221;&#8216;          file 注意必须带双引号<br />
    awk &#8216;$1 * $2 >100 &#8216;       file<br />
    awk &#8216;$2 >5 &#038;&#038; $2<=15'     file</p>
<p>2、<br />
    awk '{print NR,NF,$1,$NF,}' file 显示文件file的当前记录号、域数和每一行的第一个和最后一个域。<br />
    awk '/101/ {print $1,$2 + 10}' file 显示文件file的匹配行的第一、二个域加10。<br />
    awk '/101/ {print $1$2}'  file<br />
    awk '/101/ {print $1 $2}' file 显示文件file的匹配行的第一、二个域，但显示时域中间没有分隔符。</p>
<p>3、<br />
    df | awk '$4>1000000 &#8216;         通过管道符获得输入，如：显示第4个域满足条件的行。</p>
<p>4、<br />
    awk -F &#8220;|&#8221; &#8216;{print $1}&#8217;   file 按照新的分隔符“|”进行操作。<br />
    awk  &#8216;BEGIN { FS=&#8221;[: \t|]&#8221; } {print $1,$2,$3}&#8217; file 通过设置输入分隔符（FS=&#8221;[: \t|]&#8220;）修改输入分隔符。</p>
<p>    Sep=&#8221;|&#8221;<br />
    awk -F $Sep &#8216;{print $1}&#8217;  file 按照环境变量Sep的值做为分隔符。<br />
    awk -F &#8216;[ :\t|]&#8216; &#8216;{print $1}&#8217; file 按照正则表达式的值做为分隔符，这里代表空格、:、TAB、|同时做为分隔符。<br />
    awk -F &#8216;[][]&#8216;    &#8216;{print $1}&#8217; file 按照正则表达式的值做为分隔符，这里代表[、]</p>
<p>5、<br />
    awk -f awkfile              file 通过文件awkfile的内容依次进行控制。<br />
    cat awkfile  /101/{print &#8220;\047 Hello! \047&#8243;} &#8211;遇到匹配行以后打印 &#8216; Hello! &#8216;.\047代表单引号。<br />
    {print $1,$2}                   &#8211;因为没有模式控制，打印每一行的前两个域。</p>
<p>6、<br />
    awk &#8216;$1 ~ /101/ {print $1}&#8217; file 显示文件中第一个域匹配101的行（记录）。</p>
<p>7、<br />
    awk   &#8216;BEGIN { OFS=&#8221;%&#8221;} {print $1,$2}&#8217;           file 通过设置输出分隔符（OFS=&#8221;%&#8221;）修改输出格式。</p>
<p>8、<br />
    awk   &#8216;BEGIN { max=100 ;print &#8220;max=&#8221; max}             BEGIN 表示在处理任意行之前进行的操作。{max=($1 >max ?$1:max); print $1,&#8221;Now max is &#8220;max}&#8217; file 取得文件第一个域的最大值。<br />
   （表达式1?表达式2:表达式3 相当于：<br />
    if (表达式1)<br />
        表达式2<br />
    else<br />
        表达式3<br />
    awk &#8216;{print ($1>4 ? &#8220;high &#8220;$1: &#8220;low &#8220;$1)}&#8217; file </p>
<p>9、<br />
    awk &#8216;$1 * $2 >100 {print $1}&#8217; file 显示文件中第一个域匹配101的行（记录）。</p>
<p>10、<br />
    awk &#8216;{$1 == &#8216;Chi&#8217; {$3 = &#8216;China&#8217;; print}&#8217; file 找到匹配行后先将第3个域替换后再显示该行（记录）。<br />
    awk &#8216;{$7 %= 3; print $7}&#8217;  file 将第7域被3除，并将余数赋给第7域再打印。</p>
<p>11、<br />
    awk &#8216;/tom/ {wage=$2+$3; printf wage}&#8217; file 找到匹配行后为变量wage赋值并打印该变量。</p>
<p>12、<br />
    awk &#8216;/tom/ {count++;}<br />
         END {print &#8220;tom was found &#8220;count&#8221; times&#8221;}&#8217; file END表示在所有输入行处理完后进行处理。</p>
<p>13、<br />
    awk &#8216;gsub(/\$/,&#8221;");gsub(/,/,&#8221;"); cost+=$4; END {print &#8220;The total is $&#8221; cost>&#8221;filename&#8221;}&#8217;    file gsub函数用空串替换$和,再将结果输出到filename中。<br />
    1 2 3 $1,200.00<br />
    1 2 3 $2,300.00<br />
    1 2 3 $4,000.00</p>
<p>    awk &#8216;{gsub(/\$/,&#8221;");gsub(/,/,&#8221;");<br />
    if ($4>1000&#038;&#038;$4<2000) c1+=$4;<br />
    else if ($4>2000&#038;&#038;$4<3000) c2+=$4;<br />
    else if ($4>3000&#038;&#038;$4<4000) c3+=$4;<br />
    else c4+=$4; }<br />
    END {printf  "c1=[%d];c2=[%d];c3=[%d];c4=[%d]\n",c1,c2,c3,c4}"' file<br />
    通过if和else if完成条件语句</p>
<p>    awk '{gsub(/\$/,"");gsub(/,/,"");<br />
    if ($4>3000&#038;&#038;$4<4000) exit;<br />
    else c4+=$4; }<br />
    END {printf  "c1=[%d];c2=[%d];c3=[%d];c4=[%d]\n",c1,c2,c3,c4}"' file<br />
    通过exit在某条件时退出，但是仍执行END操作。<br />
    awk '{gsub(/\$/,"");gsub(/,/,"");<br />
    if ($4>3000) next;<br />
    else c4+=$4; }<br />
    END {printf  &#8220;c4=[%d]\n&#8221;,c4}&#8221;&#8216; file<br />
    通过next在某条件时跳过该行，对下一行执行操作。</p>
<p>14、<br />
    awk &#8216;{ print FILENAME,$0 }&#8217; file1 file2 file3>fileall 把file1、file2、file3的文件内容全部写到fileall中，格式为<br />
    打印文件并前置文件名。</p>
<p>15、<br />
    awk &#8216; $1!=previous { close(previous); previous=$1 }<br />
    {print substr($0,index($0,&#8221; &#8220;) +1)>$1}&#8217; fileall 把合并后的文件重新分拆为3个文件。并与原文件一致。</p>
<p>16、<br />
    awk &#8216;BEGIN {&#8220;date&#8221;|getline d; print d}&#8217;         通过管道把date的执行结果送给getline，并赋给变量d，然后打印。 </p>
<p>17、<br />
    awk &#8216;BEGIN {system(&#8220;echo \&#8221;Input your name:\\c\&#8221;"); getline d;print &#8220;\nYour name is&#8221;,d,&#8221;\b!\n&#8221;}&#8217;<br />
    通过getline命令交互输入name，并显示出来。<br />
    awk &#8216;BEGIN {FS=&#8221;:&#8221;; while(getline< "/etc/passwd" >0) { if($1~&#8221;050[0-9]_&#8221;) print $1}}&#8217;<br />
    打印/etc/passwd文件中用户名包含050x_的用户名。</p>
<p>18、<br />
    awk &#8216;{ i=1;while(i<NF) {print NF,$i;i++}}' file 通过while语句实现循环。<br />
    awk '{ for(i=1;i<NF;i++) {print NF,$i}}'   file 通过for语句实现循环。<br />
    type file|awk -F "/" '<br />
    { for(i=1;i<NF;i++)<br />
    { if(i==NF-1) { printf "%s",$i }<br />
    else { printf "%s/",$i } }}'               显示一个文件的全路径。<br />
    用for和if显示日期<br />
    awk  'BEGIN {<br />
    for(j=1;j<=12;j++)<br />
    {<br />
        flag=0;<br />
        printf "\n%d月份\n",j;<br />
        for(i=1;i<=31;i++)<br />
        {<br />
            if (j==2&#038;&#038;i>28) flag=1;<br />
            if ((j==4||j==6||j==9||j==11)&#038;&#038;i>30) flag=1;<br />
            if (flag==0) {printf &#8220;%02d%02d &#8220;,j,i}<br />
        }<br />
    }<br />
    }&#8217;</p>
<p>19、<br />
    在awk中调用系统变量必须用单引号，如果是双引号，则表示字符串<br />
    Flag=abcd<br />
    awk &#8216;{print &#8216;$Flag&#8217;}&#8217;   结果为abcd<br />
    awk &#8216;{print  &#8220;$Flag&#8221;}&#8217;   结果为$Flag </p>
]]></content:encoded>
			<wfw:commentRss>http://www.toplee.com/blog/62.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Linux/FreeBSD下用C语言开发PHP的so扩展模块例解</title>
		<link>http://www.toplee.com/blog/56.html</link>
		<comments>http://www.toplee.com/blog/56.html#comments</comments>
		<pubDate>Sun, 22 Jan 2006 18:42:49 +0000</pubDate>
		<dc:creator>Michael</dc:creator>
				<category><![CDATA[C / Erlang / Lua]]></category>
		<category><![CDATA[Linux / BSD]]></category>
		<category><![CDATA[PHP / Zend]]></category>
		<category><![CDATA[技术交流]]></category>
		<category><![CDATA[c语言]]></category>
		<category><![CDATA[FreeBSD]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[so]]></category>
		<category><![CDATA[扩展]]></category>

		<guid isPermaLink="false">http://www.toplee.com/blog/?p=56</guid>
		<description><![CDATA[Show All &#160; 1 2 引用本文请注明出处：Just Do IT (http://www.toplee.com) < Michael Lee @ toplee.com > 我从97年接触互联网的web开发，至今已经过去9年了，从最初的frontpage做html页面到学会ASP+access+IIS开始，就跟web开发干上了，后来又依次使用了ASP+SQLServer+IIS、JSP+Oracle+Jrun(Resin/Tomcat)、PHP+Syabse(MySQL)+Apache &#8230; 最后我定格到了 PHP+MySQL+Apache+Linux(BSD) 的架构上，也就是大家常说的LAMP架构，这说来有很多理由，网上也有很多人讨论各种架构和开发语言之间的优劣，我就不多说了，简单说一下我喜欢LAMP的几个主要原因： 1、全开放的免费平台； 2、简单易上手、各种资源丰富； 3、PHP、MySQL、Apache与Linux(BSD)系统底层以及彼此间无缝结合，非常高效； 4、均使用最高效的语言C/C++开发，性能可靠； 5、PHP语言和C的风格基本一致，还吸取了Java和C++的诸多架构优点； 6、这是最关键的一点，那就是PHP可以非常方便的使用C/C++开发扩展模块，给了PHP无限的扩张性！ 基于以上原因，我非常喜欢基于PHP语言的架构，其中最关键的一点就是最后一点，以前在Yahoo和mop均推广使用这个平台，在C扩展php方面也有一些经验，在此和大家分享一下，希望可以抛砖引玉。 用C语言编写PHP的扩展模块的方法有几种，根据最后的表现形式有两种，一种是直接编译进php，一种是编译为php的so扩展模块来被php调用，另外根据编译的方式有两种，一种使用phpize工具（php编译后有的），一种使用ext_skel工具（php自带的），我们使用最多，也是最方便的方式就是使用ext_skel工具来编写php的so扩展模块，这里也主要介绍这种方式。 我们在php的源码目录里面可以看到有个ext目录（我这里说的php都是基于Linux平台的php来说的，不包括windows下的），在ext目录下有个工具 ext_skel ，这个工具可以让我们简单的开发出php的扩展模块，它提供了一个通用的php扩展模块开发步骤和模板。下面我们以开发一个在php里面进行utf8/gbk/gb2312三种编码转换的扩展模块为例子进行说明。在这个模块中，我们要最终提供以下几个函数接口： (1) string toplee_big52gbk(string s) 将输入字符串从BIG5码转换成GBK (2) string toplee_gbk2big5(string s) 将输入字符串从GBK转换成BIG5码 (3) string toplee_normalize_name(string s) 将输入字符串作以下处理：全角转半角，strim，大写转小写 (4) string toplee_fan2jian(int code, string s) 将输入的GBK繁体字符串转换成简体 (5) string [...]]]></description>
			<content:encoded><![CDATA[<div id="pagepost_56" class="pagepost"><div id="pagebar_top_56" class="pagebar"><a name="pp0"></a><a name="pp1"></a><a name="pp2"></a><a href="#pp0" onclick="pagepost(56, 0);">Show All</a> &nbsp; <strong style="color: #1E90FF;" title="">1</strong> <a href="#pp2" title="" onclick="pagepost(56, 2);">2</a> <strong id="pagebar_loading_56" style="color: green;"></strong></div><p>引用本文请注明出处：Just Do IT (http://www.toplee.com)  < Michael Lee @ toplee.com ></p>
<p>我从97年接触互联网的web开发，至今已经过去9年了，从最初的frontpage做html页面到学会ASP+access+IIS开始，就跟web开发干上了，后来又依次使用了ASP+SQLServer+IIS、JSP+Oracle+Jrun(Resin/Tomcat)、PHP+Syabse(MySQL)+Apache &#8230; 最后我定格到了 PHP+MySQL+Apache+Linux(BSD) 的架构上，也就是大家常说的LAMP架构，这说来有很多理由，网上也有很多人讨论各种架构和开发语言之间的优劣，我就不多说了，简单说一下我喜欢LAMP的几个主要原因：<br />
<span id="more-56"></span><br />
1、全开放的免费平台；<br />
2、简单易上手、各种资源丰富；<br />
3、PHP、MySQL、Apache与Linux(BSD)系统底层以及彼此间无缝结合，非常高效；<br />
4、均使用最高效的语言C/C++开发，性能可靠；<br />
5、PHP语言和C的风格基本一致，还吸取了Java和C++的诸多架构优点；<br />
6、这是最关键的一点，那就是PHP可以非常方便的使用C/C++开发扩展模块，给了PHP无限的扩张性！</p>
<p>基于以上原因，我非常喜欢基于PHP语言的架构，其中最关键的一点就是最后一点，以前在Yahoo和mop均推广使用这个平台，在C扩展php方面也有一些经验，在此和大家分享一下，希望可以抛砖引玉。</p>
<p>用C语言编写PHP的扩展模块的方法有几种，根据最后的表现形式有两种，一种是直接编译进php，一种是编译为php的so扩展模块来被php调用，另外根据编译的方式有两种，一种使用phpize工具（php编译后有的），一种使用ext_skel工具（php自带的），我们使用最多，也是最方便的方式就是使用ext_skel工具来编写php的so扩展模块，这里也主要介绍这种方式。</p>
<p>我们在php的源码目录里面可以看到有个ext目录（我这里说的php都是基于Linux平台的php来说的，不包括windows下的），在ext目录下有个工具 ext_skel ，这个工具可以让我们简单的开发出php的扩展模块，它提供了一个通用的php扩展模块开发步骤和模板。下面我们以开发一个在php里面进行utf8/gbk/gb2312三种编码转换的扩展模块为例子进行说明。在这个模块中，我们要最终提供以下几个函数接口：</p>
<p>(1) string toplee_big52gbk(string s)<br />
	将输入字符串从BIG5码转换成GBK<br />
(2) string toplee_gbk2big5(string s)<br />
	将输入字符串从GBK转换成BIG5码<br />
(3) string toplee_normalize_name(string s)<br />
	将输入字符串作以下处理：全角转半角，strim，大写转小写<br />
(4) string toplee_fan2jian(int code, string s)<br />
	将输入的GBK繁体字符串转换成简体<br />
(5) string toplee_decode_utf(string s)<br />
	将utf编码的字符串转换成UNICODE<br />
(6) string toplee_decode_utf_gb(string s)<br />
	将utf编码的字符串转换成GB<br />
(7) string toplee_decode_utf_big5(string s)<br />
	将utf编码的字符串转换成BIG5<br />
(8) string toplee_encode_utf_gb(string s)<br />
	将输入的GBKf编码的字符串转换成utf编码</p>
<p>首先，我们进入ext目录下，运行下面命令：<br />
#./ext_skel &#8211;extname=toplee<br />
这时，php会自动在ext目录下为我们生成一个目录toplee，里面包含下面几个文件<br />
.cvsignore<br />
CREDITS<br />
EXPERIMENTAL<br />
config.m4<br />
php_toplee.h<br />
tests<br />
toplee.c<br />
toplee.php</p>
<p>其中最有用的就是config.m4和toplee.c文件<br />
接下来我们修改config.m4文件<br />
#vi ./config.m4<br />
找到里面有类似这样几行</p>
<div class="hl-surround"><div class="hl-main">dnl PHP_ARG_WITH(toplee, for toplee support,<br />dnl Make sure that the comment is aligned:<br />dnl [&nbsp; --with-toplee&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Include toplee support])<br /><br />dnl Otherwise use enable:<br /><br />dnl PHP_ARG_ENABLE(toplee, whether to enable toplee support,<br />dnl Make sure that the comment is aligned:<br />dnl [&nbsp; --enable-toplee&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Enable toplee support])</div></div>
<p>上面的几行意思是说告诉php编译的使用使用那种方式加载我们的扩展模块toplee，我们使用&#8211;with-toplee的方式，于是我们修改为下面的样子</p>
<div class="hl-surround"><div class="hl-main">PHP_ARG_WITH(toplee, for toplee support,<br />Make sure that the comment is aligned:<br />[&nbsp; --with-toplee&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Include toplee support])<br /><br />dnl Otherwise use enable:<br /><br />dnl PHP_ARG_ENABLE(toplee, whether to enable toplee support,<br />dnl Make sure that the comment is aligned:<br />dnl [&nbsp; --enable-toplee&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Enable toplee support])</div></div>
<p>然后我们要做的关键事情就是编写toplee.c，这个是我们编写模块的主要文件，如果您什么都不修改，其实也完成了一个php扩展模块的编写，里面有类似下面的几行代码</p>
<div class="hl-surround"><div class="hl-main"><span style="color: Blue;">PHP_FUNCTION</span><span style="color: Olive;">(</span><span style="color: Blue;">confirm_toplee_compiled</span><span style="color: Olive;">)</span><span style="color: Gray;"><br /></span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span class="hl-types">char</span><span style="color: Gray;"> *</span><span style="color: Blue;">arg</span><span style="color: Gray;"> = </span><span class="hl-prepro">NULL</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span class="hl-types">int</span><span style="color: Gray;"> </span><span style="color: Blue;">arg_len</span><span style="color: Gray;">, </span><span style="color: Blue;">len</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span class="hl-types">char</span><span style="color: Gray;"> </span><span style="color: Blue;">string</span><span style="color: Olive;">[</span><span style="color: Maroon;">256</span><span style="color: Olive;">]</span><span style="color: Gray;">;<br />&nbsp;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Green;">if</span><span style="color: Gray;"> </span><span style="color: Olive;">(</span><span style="color: Blue;">zend_parse_parameters</span><span style="color: Olive;">(</span><span style="color: Blue;">ZEND_NUM_ARGS</span><span style="color: Olive;">()</span><span style="color: Gray;"> </span><span style="color: Blue;">TSRMLS_CC</span><span style="color: Gray;">, </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">s</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">, &amp;</span><span style="color: Blue;">arg</span><span style="color: Gray;">, &amp;</span><span style="color: Blue;">arg_len</span><span style="color: Olive;">)</span><span style="color: Gray;"> == </span><span style="color: Blue;">FAILURE</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Green;">return</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Olive;">}</span><span style="color: Gray;"><br />&nbsp;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Blue;">len</span><span style="color: Gray;"> = </span><span style="color: Blue;">sprintf</span><span style="color: Olive;">(</span><span style="color: Blue;">string</span><span style="color: Gray;">, </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">Congratulations! You have successfully modified ext/%.78s/config.m4. Module %.78s is now compiled into PHP.</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">, </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">toplee</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">, </span><span style="color: Blue;">arg</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Blue;">RETURN_STRINGL</span><span style="color: Olive;">(</span><span style="color: Blue;">string</span><span style="color: Gray;">, </span><span style="color: Blue;">len</span><span style="color: Gray;">, </span><span style="color: Maroon;">1</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br /></span><span style="color: Olive;">}</span></div></div>
<p>如果我们在后面完成php的编译时把新的模块编译进去，那么我们就可以在php脚本中调用函数toplee()，它会输出一段字符串“Congratulations! You have successfully modified ext/toplee/config.m4. Module toplee is now compiled into PHP.”</p>
<div id="pagebar_bottom_56" class="pagebar"><a href="#pp0" onclick="pagepost(56, 0);">Show All</a> &nbsp; <strong style="color: #1E90FF;" title="">1</strong> <a href="#pp2" title="" onclick="pagepost(56, 2);">2</a> </div></div>]]></content:encoded>
			<wfw:commentRss>http://www.toplee.com/blog/56.html/feed</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
	</channel>
</rss>
