<?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>飞向梦想</title>
	<atom:link href="http://blog.sitearth.com/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.sitearth.com</link>
	<description>站在巨人的肩上</description>
	<lastBuildDate>Fri, 03 Feb 2012 06:11:06 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.3</generator>
		<item>
		<title>codeigniter的url去掉index.php</title>
		<link>http://blog.sitearth.com/codeigniter%e7%9a%84url%e5%8e%bb%e6%8e%89index-php?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=codeigniter%25e7%259a%2584url%25e5%258e%25bb%25e6%258e%2589index-php</link>
		<comments>http://blog.sitearth.com/codeigniter%e7%9a%84url%e5%8e%bb%e6%8e%89index-php#comments</comments>
		<pubDate>Thu, 19 Jan 2012 07:18:11 +0000</pubDate>
		<dc:creator>一棵葱</dc:creator>
				<category><![CDATA[CodeIgniter]]></category>
		<category><![CDATA[nginx]]></category>
		<category><![CDATA[codeigniter]]></category>
		<category><![CDATA[url]]></category>

		<guid isPermaLink="false">http://blog.sitearth.com/?p=108</guid>
		<description><![CDATA[版权声明：原创作品，转载请务必以超链接形式标明文章 原始出处 、作者和本声明，否则将追究法律责任。 最近使用codeigniter做了个网站，为了保持url的美观，也为了安全起见，决定去掉url中的index.php。 起初google了半天也没找到正确的写法，最后还是自己边看手册边摸索地写了出来，自己学到了很多，同时也分享给大家。 CI中的路径配置是 $config['uri_protocol'] = &#8216;AUTO&#8217;; 其它配置没有测试，请自己尝试。 以下是nginx.conf的配置： server { listen 80; server_name abc.com; root /www/abc; location / { index index.php index.html; if (!-e $request_filename) { rewrite ^/(.*)$ /index.php/$1 last; // 此处last不可换用break } } # location ~ ^/index\.php(/.*)+$ { // 不可在此处 # return 404; // 限制访问index.php # } // 否则整个网站将不能访问 location ^~ [...]]]></description>
			<content:encoded><![CDATA[<p><div style="margin-bottom:10px;border:1px dashed #ccc;padding:3px;color:#00F;">版权声明：原创作品，转载请务必以超链接形式标明文章 原始出处 、作者和本声明，否则将追究法律责任。 </div><br />
最近使用codeigniter做了个网站，为了保持url的美观，也为了安全起见，决定去掉url中的index.php。</p>
<p>起初google了半天也没找到正确的写法，最后还是自己边看手册边摸索地写了出来，自己学到了很多，同时也分享给大家。</p>
<p>CI中的路径配置是<br />
$config['uri_protocol']	= &#8216;AUTO&#8217;;<br />
其它配置没有测试，请自己尝试。</p>
<p>以下是nginx.conf的配置：<br />
<span id="more-108"></span></p>
<pre>
server {
  listen       80;
  server_name  abc.com;
  root   /www/abc;
  location / {
    index  index.php index.html;
    if (!-e $request_filename) {
       rewrite  ^/(.*)$  /index.php/$1  last; // 此处last不可换用break
    }
  }
# location ~ ^/index\.php(/.*)+$ { // 不可在此处
#   return 404;                // 限制访问index.php
# }                      // 否则整个网站将不能访问
   location ^~ /(application|system) {
     deny  all;
     break;
   }
   location ~ /\. {
     deny  all;
   }
   location ~ \.php($|/) {
      fastcgi_pass   127.0.0.1:9000;
      fastcgi_index  index.php;
      set            $script     $uri;
      set            $path_info  "";
      if ($request_uri ~ "^/index\.php") { // 此处是$request_uri，不是$uri
         return 404;
      }
      if ($uri ~ "^(.+?\.php)(/.*)$") {  // 此处是$uri，不是$request_uri
         set  $script     $1;
         set  $path_info  $2;
      }
      include        fastcgi_params;
      fastcgi_param  PATH_INFO        $path_info;
      fastcgi_param  SCRIPT_FILENAME  /www/abc/index.php;
      fastcgi_param  SCRIPT_NAME      $script;
   }
}
</pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.sitearth.com/codeigniter%e7%9a%84url%e5%8e%bb%e6%8e%89index-php/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ubuntu11.10安装vmware-tools</title>
		<link>http://blog.sitearth.com/ubuntu11-10%e5%ae%89%e8%a3%85vmware-tools?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=ubuntu11-10%25e5%25ae%2589%25e8%25a3%2585vmware-tools</link>
		<comments>http://blog.sitearth.com/ubuntu11-10%e5%ae%89%e8%a3%85vmware-tools#comments</comments>
		<pubDate>Mon, 16 Jan 2012 04:59:30 +0000</pubDate>
		<dc:creator>一棵葱</dc:creator>
				<category><![CDATA[Ubuntu]]></category>
		<category><![CDATA[ubuntu]]></category>
		<category><![CDATA[vmware tools]]></category>

		<guid isPermaLink="false">http://blog.sitearth.com/?p=107</guid>
		<description><![CDATA[在vm上安装ubuntu11.10，本想安装vmware-tools，结果出现找不到smp_lock.h文件的错误，编译中止。google了一下，原因是新的2.6.39以后的内核，已经木有这个文件了。 最后还是采用以下方案解决了问题： http://archive.blackbuntu.com/bb03/vmware-patch/ 选择：vmware2.6.39guest.tar.bz2 解压缩，运行patch-modules_2.6.39.sh ok，安装成功！]]></description>
			<content:encoded><![CDATA[<p>在vm上安装ubuntu11.10，本想安装vmware-tools，结果出现找不到smp_lock.h文件的错误，编译中止。google了一下，原因是新的2.6.39以后的内核，已经木有这个文件了。<br />
最后还是采用以下方案解决了问题：</p>
<p>http://archive.blackbuntu.com/bb03/vmware-patch/</p>
<p>选择：vmware2.6.39guest.tar.bz2<br />
解压缩，运行patch-modules_2.6.39.sh</p>
<p>ok，安装成功！</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.sitearth.com/ubuntu11-10%e5%ae%89%e8%a3%85vmware-tools/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>FTP的standard和passive两种连接类型</title>
		<link>http://blog.sitearth.com/ftp%e7%9a%84%e4%b8%a4%e7%a7%8d%e8%bf%9e%e6%8e%a5%e7%b1%bb%e5%9e%8b?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=ftp%25e7%259a%2584%25e4%25b8%25a4%25e7%25a7%258d%25e8%25bf%259e%25e6%258e%25a5%25e7%25b1%25bb%25e5%259e%258b</link>
		<comments>http://blog.sitearth.com/ftp%e7%9a%84%e4%b8%a4%e7%a7%8d%e8%bf%9e%e6%8e%a5%e7%b1%bb%e5%9e%8b#comments</comments>
		<pubDate>Mon, 26 Dec 2011 07:33:04 +0000</pubDate>
		<dc:creator>一棵葱</dc:creator>
				<category><![CDATA[ftp]]></category>

		<guid isPermaLink="false">http://blog.sitearth.com/?p=105</guid>
		<description><![CDATA[FTP支持两种模式，一种方式叫做Standard (也就是 PORT方式，主动方式)，一种是 Passive (也就是PASV，被动方式)。 Standard模式 FTP的客户端发送 PORT 命令到FTP服务器。Passive模式FTP的客户端发送 PASV命令到 FTP Server。 PORT 和 PASV的简单区别如下： Port模式FTP 客户端首先和FTP服务器的TCP 21端口建立连接，通过这个通道发送命令，客户端需要接收数据的时候在这个通道上发送PORT命令。 PORT命令包含了客户端用什么端口接收数据。在传送数据的时候，服务器端通过自己的TCP 20端口连接至客户端的指定端口发送数据。 FTP server必须和客户端建立一个新的连接用来传送数据。 Passive模式在建立控制通道的时候和Standard模式类似，但建立连接后发送的不是Port命令，而是Pasv命令。FTP服务器收到Pasv命令后，随机打开一个高端端口（端口号大于1024）并且通知客户端在这个端口上传送数据的请求，客户端连接FTP服务器此端口，然后FTP服务器将通过这个端口进行数据的传送，这个时候FTP server不再需要建立一个新的和客户端之间的连接。 因为IE浏览器默认使用的是Passive（被动）模式，所以要连接Linux服务器大于1024端口，而防火墙并没有开发1024以上的端口，导致登录ftp服务器被防火墙阻止。]]></description>
			<content:encoded><![CDATA[<p>FTP支持两种模式，一种方式叫做Standard (也就是 PORT方式，主动方式)，一种是 Passive (也就是PASV，被动方式)。 Standard模式 FTP的客户端发送 PORT 命令到FTP服务器。Passive模式FTP的客户端发送 PASV命令到 FTP Server。</p>
<p>PORT 和 PASV的简单区别如下：</p>
<p>Port模式FTP 客户端首先和FTP服务器的TCP 21端口建立连接，通过这个通道发送命令，客户端需要接收数据的时候在这个通道上发送PORT命令。 PORT命令包含了客户端用什么端口接收数据。在传送数据的时候，服务器端通过自己的TCP 20端口连接至客户端的指定端口发送数据。 FTP server必须和客户端建立一个新的连接用来传送数据。</p>
<p>Passive模式在建立控制通道的时候和Standard模式类似，但建立连接后发送的不是Port命令，而是Pasv命令。FTP服务器收到Pasv命令后，随机打开一个高端端口（端口号大于1024）并且通知客户端在这个端口上传送数据的请求，客户端连接FTP服务器此端口，然后FTP服务器将通过这个端口进行数据的传送，这个时候FTP server不再需要建立一个新的和客户端之间的连接。</p>
<p>因为IE浏览器默认使用的是Passive（被动）模式，所以要连接Linux服务器大于1024端口，而防火墙并没有开发1024以上的端口，导致登录ftp服务器被防火墙阻止。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.sitearth.com/ftp%e7%9a%84%e4%b8%a4%e7%a7%8d%e8%bf%9e%e6%8e%a5%e7%b1%bb%e5%9e%8b/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP5.3.x中弃用的功能</title>
		<link>http://blog.sitearth.com/php5-3-x%e4%b8%ad%e5%bc%83%e7%94%a8%e7%9a%84%e5%8a%9f%e8%83%bd?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=php5-3-x%25e4%25b8%25ad%25e5%25bc%2583%25e7%2594%25a8%25e7%259a%2584%25e5%258a%259f%25e8%2583%25bd</link>
		<comments>http://blog.sitearth.com/php5-3-x%e4%b8%ad%e5%bc%83%e7%94%a8%e7%9a%84%e5%8a%9f%e8%83%bd#comments</comments>
		<pubDate>Wed, 07 Dec 2011 02:13:24 +0000</pubDate>
		<dc:creator>一棵葱</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[php5.3]]></category>

		<guid isPermaLink="false">http://blog.sitearth.com/?p=104</guid>
		<description><![CDATA[PHP 5.3.0 新增了两个错误等级: E_DEPRECATED 和 E_USER_DEPRECATED. 错误等级 E_DEPRECATED 被用来说明一个函数或者功能已经被弃用. E_USER_DEPRECATED 等级目的在于表明用户代码中的弃用功能, 类似于 E_USER_ERROR 和 E_USER_WARNING 等级. 下面是被弃用的 INI 指令列表. 使用下面任何指令都将导致 E_DEPRECATED 错误. define_syslog_variables register_globals register_long_arrays safe_mode magic_quotes_gpc magic_quotes_runtime magic_quotes_sybase 弃用 INI 文件中以 &#8216;#&#8217; 开头的注释. 弃用函数: call_user_method() (使用 call_user_func() 替代) call_user_method_array() (使用 call_user_func_array() 替代) define_syslog_variables() dl() ereg() (使用 preg_match() 替代) ereg_replace() (使用 preg_replace() 替代) eregi() (使用 [...]]]></description>
			<content:encoded><![CDATA[<p>PHP 5.3.0 新增了两个错误等级: E_DEPRECATED<br />
和 E_USER_DEPRECATED. 错误等级 E_DEPRECATED 被用来说明一个函数或者功能已经被弃用. E_USER_DEPRECATED 等级目的在于表明用户代码中的弃用功能, 类似于<br />
E_USER_ERROR 和 E_USER_WARNING 等级.</p>
<p>下面是被弃用的 INI 指令列表. 使用下面任何指令都将导致 E_DEPRECATED 错误.</p>
<p>    define_syslog_variables</p>
<p>    register_globals</p>
<p>    register_long_arrays</p>
<p>    safe_mode</p>
<p>    magic_quotes_gpc</p>
<p>    magic_quotes_runtime</p>
<p>    magic_quotes_sybase</p>
<p>    弃用 INI 文件中以 &#8216;#&#8217; 开头的注释.<br />
<span id="more-104"></span><br />
弃用函数:</p>
<p>    call_user_method() (使用 call_user_func() 替代)</p>
<p>    call_user_method_array() (使用 call_user_func_array() 替代)</p>
<p>    define_syslog_variables()</p>
<p>    dl()</p>
<p>    ereg() (使用 preg_match() 替代)</p>
<p>    ereg_replace() (使用 preg_replace()<br />
    替代)</p>
<p>    eregi() (使用 preg_match() 配合<br />
    &#8216;i&#8217; 修正符替代)</p>
<p>    eregi_replace() (使用 preg_replace()<br />
    配合 &#8216;i&#8217; 修正符替代)</p>
<p>    set_magic_quotes_runtime() 以及它的别名函数 magic_quotes_runtime()</p>
<p>    session_register() (使用 $_SESSION 超全部变量替代)</p>
<p>    session_unregister() (使用 $_SESSION 超全部变量替代)</p>
<p>    session_is_registered() (使用 $_SESSION 超全部变量替代)</p>
<p>    set_socket_blocking() (使用 stream_set_blocking() 替代)</p>
<p>    split() (使用 preg_split() 替代)</p>
<p>    spliti() (使用 preg_split() 配合 &#8216;i&#8217; 修正符替代)</p>
<p>    sql_regcase()</p>
<p>    mysql_db_query() (使用 mysql_select_db() 和 mysql_query() 替代)</p>
<p>    mysql_escape_string() (使用 mysql_real_escape_string() 替代)</p>
<p>    废弃以字符串传递区域设置名称. 使用 LC_* 系列常量替代.</p>
<p>    mktime() 的 is_dst 参数. 使用新的时区处理函数替代.</p>
<p>弃用的功能:</p>
<p>    弃用通过引用分配 new 的返回值.</p>
<p>    调用时传递引用被弃用.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.sitearth.com/php5-3-x%e4%b8%ad%e5%bc%83%e7%94%a8%e7%9a%84%e5%8a%9f%e8%83%bd/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MySQL帐户创建与删除、口令更改</title>
		<link>http://blog.sitearth.com/mysql%e5%b8%90%e6%88%b7%e5%88%9b%e5%bb%ba%e4%b8%8e%e5%88%a0%e9%99%a4%e3%80%81%e5%8f%a3%e4%bb%a4%e6%9b%b4%e6%94%b9?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=mysql%25e5%25b8%2590%25e6%2588%25b7%25e5%2588%259b%25e5%25bb%25ba%25e4%25b8%258e%25e5%2588%25a0%25e9%2599%25a4%25e3%2580%2581%25e5%258f%25a3%25e4%25bb%25a4%25e6%259b%25b4%25e6%2594%25b9</link>
		<comments>http://blog.sitearth.com/mysql%e5%b8%90%e6%88%b7%e5%88%9b%e5%bb%ba%e4%b8%8e%e5%88%a0%e9%99%a4%e3%80%81%e5%8f%a3%e4%bb%a4%e6%9b%b4%e6%94%b9#comments</comments>
		<pubDate>Mon, 05 Dec 2011 05:34:30 +0000</pubDate>
		<dc:creator>一棵葱</dc:creator>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[密码]]></category>
		<category><![CDATA[帐户]]></category>

		<guid isPermaLink="false">http://blog.sitearth.com/?p=102</guid>
		<description><![CDATA[1. 创建用户账户 可以用三种方式创建MySQL账户： 1 使用GRANT语句 2 直接操作MySQL授权表 3 使用CREATE USER语句 最好的方法是使用GRANT语句，因为这样更精确，错误少。 创建账户的其它方法是使用MySQL账户管理功能的第三方程序。phpMyAdmin即是一个程序。 下面的示例说明如何使用MySQL客户端程序来设置新用户。为了更改，你必须以MySQL root用户连接MySQL服务器，并且root账户必须有mysql数据库的INSERT权限和RELOAD管理权限。 首先，使用MySQL程序以MySQL root用户来连接服务器： MySQL --user=root MySQL 如果你为root账户指定了密码，还需要为该MySQL命令和本节中的其它命令提供&#8211;password或-p选项。 以root连接到服务器上后，可以添加新账户。下面的语句使用GRANT来设置四个新账户： GRANT ALL PRIVILEGES ON *.* TO 'monty'@'localhost' IDENTIFIED BY 'some_pass' WITH GRANT OPTION; GRANT ALL PRIVILEGES ON *.* TO 'monty'@'%' IDENTIFIED BY 'some_pass' WITH GRANT OPTION; GRANT RELOAD,PROCESS ON *.* TO 'admin'@'localhost'; GRANT USAGE [...]]]></description>
			<content:encoded><![CDATA[<p>1. 创建用户账户</p>
<p>可以用三种方式创建MySQL账户：<br />
1 使用GRANT语句</p>
<p>2 直接操作MySQL授权表</p>
<p>3 使用CREATE USER语句</p>
<p>最好的方法是使用GRANT语句，因为这样更精确，错误少。</p>
<p>创建账户的其它方法是使用MySQL账户管理功能的第三方程序。phpMyAdmin即是一个程序。</p>
<p>下面的示例说明如何使用MySQL客户端程序来设置新用户。为了更改，你必须以MySQL root用户连接MySQL服务器，并且root账户必须有mysql数据库的INSERT权限和RELOAD管理权限。</p>
<p>首先，使用MySQL程序以MySQL root用户来连接服务器：</p>
<pre>
MySQL --user=root MySQL
</pre>
<p>如果你为root账户指定了密码，还需要为该MySQL命令和本节中的其它命令提供&#8211;password或-p选项。<br />
<span id="more-102"></span><br />
以root连接到服务器上后，可以添加新账户。下面的语句使用GRANT来设置四个新账户：</p>
<pre>
GRANT ALL PRIVILEGES ON *.* TO 'monty'@'localhost' IDENTIFIED BY 'some_pass' WITH GRANT OPTION;
GRANT ALL PRIVILEGES ON *.* TO 'monty'@'%' IDENTIFIED BY 'some_pass' WITH GRANT OPTION;
GRANT RELOAD,PROCESS ON *.* TO 'admin'@'localhost';
GRANT USAGE ON *.* TO 'dummy'@'localhost';
</pre>
<p>除了GRANT，你可以直接用INSERT语句创建相同的账户，然后使用FLUSH PRIVILEGES告诉服务器重载授权表：</p>
<pre>
mysql --user=root mysql
</pre>
<pre>
INSERT INTO user VALUES('localhost','monty',PASSWORD('some_pass'),'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y');
mysql> INSERT INTO user VALUES('%','monty',PASSWORD('some_pass'),'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y');
mysql> INSERT INTO user SET Host='localhost',User='admin', Reload_priv='Y', Process_priv='Y';
mysql> INSERT INTO user (Host,User,Password) VALUES('localhost','dummy','');
mysql> FLUSH PRIVILEGES;
</pre>
<p>当你用INSERT创建账户时使用FLUSH PRIVILEGES的原因是告诉服务器重读授权表。否则，只有重启服务器后更改方会被注意到。使用 GRANT，则不需要使用FLUSH PRIVILEGES。</p>
<p>用INSERT使用PASSWORD()函数是为了加密密码。GRANT语句为你加密密码，因此不需要PASSWORD()。</p>
<p>&#8216;Y&#8217;值启用账户权限。对于admin账户，还可以使用更加可读的INSERT扩充的语法（使用SET）。</p>
<p>在为dummy账户的INSERT语句中，只有user表中的Host、User和Password列记录为指定的值。没有一个权限列为显式设置，因此MySQL将它们均指定为 默认值&#8217;N'。这样等同于GRANT USAGE的操作。</p>
<p>请注意要设置超级用户账户，只需要创建一个权限列设置为&#8217;Y'的user表条目。user表权限为全局权限，因此其它 授权表不再需要条目。</p>
<p>第三种方法，CREATE USER语句。</p>
<pre>
mysql --user=root mysql
</pre>
<pre>
create user 'jian'@'localhost' identified by 'my123'；#账户密码设置和grant语句类似
</pre>
<p>2.删除用户账户</p>
<p>要想移除账户，应使用DROP USER语句.</p>
<pre>
drop user 'jian'@'localhost';
</pre>
<p>3.更改账户口令</p>
<p>设置MySQL用户帐号密码的方法有三种：</p>
<p>使用mysqladmin程序：</p>
<pre>
mysqladmin -h localhost -u root password "password"   #设置在本地以root身分登录的密码
mysqladmin -h remote -u root password "password"      #设置远程主机以root身分登录的密码
</pre>
<p>在初始设置时，这两条语句都要运行，以确保数据库本地访问和网络访问的安全。</p>
<p>通过set password这条SQL语句设置：</p>
<pre>
set password for 'root'@'localhost' = password('password');
set password for 'root'@'remote' = password('password');
</pre>
<p>直接修改user权限表：</p>
<pre>
use mysql;
update user set password=password('password') where user='root';
flush privileges;                            #重载权限表，使修改马上生效
</pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.sitearth.com/mysql%e5%b8%90%e6%88%b7%e5%88%9b%e5%bb%ba%e4%b8%8e%e5%88%a0%e9%99%a4%e3%80%81%e5%8f%a3%e4%bb%a4%e6%9b%b4%e6%94%b9/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Linux上源码安装Subversion</title>
		<link>http://blog.sitearth.com/linux%e4%b8%8a%e6%ba%90%e7%a0%81%e5%ae%89%e8%a3%85subversion?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=linux%25e4%25b8%258a%25e6%25ba%2590%25e7%25a0%2581%25e5%25ae%2589%25e8%25a3%2585subversion</link>
		<comments>http://blog.sitearth.com/linux%e4%b8%8a%e6%ba%90%e7%a0%81%e5%ae%89%e8%a3%85subversion#comments</comments>
		<pubDate>Fri, 02 Dec 2011 08:06:49 +0000</pubDate>
		<dc:creator>一棵葱</dc:creator>
				<category><![CDATA[svn]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[安装]]></category>
		<category><![CDATA[源码]]></category>

		<guid isPermaLink="false">http://blog.sitearth.com/?p=99</guid>
		<description><![CDATA[subversion(以下简称svn)是近年来崛起的版本管理工具，能够比较好得替换cvs。 svn主要有2种运行方式： 1. 独立运行的服务器 2. 与apache集成 二种方式各有利弊，可以根据自己的需要进行配置，我不需要Http进行访问，只需要客户端可以Commit &#038; update 就可以，下面是选择的第一种方式——独立运行的SVN服务器。 svn存储版本数据也有2种方式： 1. BDB&#8211;Berkeley Datebase 2. FSFS&#8211;文件存储 BDB方式在服务器中断时，有可能锁住数据，所以还是FSFS方式更安全一点。 下面正式进入安装阶段 下载源码 wget http://subversion.tigris.org/downloads/subversion-1.6.17.tar.gz wget http://subversion.tigris.org/downloads/subversion-deps-1.6.17.tar.gz 解压并进行编译前的配置 tar xfvz subversion-1.6.17.tar.gz tar xfvz subversion-deps-1.6.17.tar.gz //安装subversion依赖的所有包，必须先安装这个压缩文件里的包 cd subversion-1.6.17 ./configure -–prefix=/usr/local/subversion --with-apr=/usr/local/apr/bin/apr-1-config --with-apr-util=/usr/local/apr/bin/apu-1-config --with-ssl --with-zlib -enable-maintainer-mode --without-berkeley-db 注：以svnserve方式运行，不加apache编译参数。以fsfs格式存储版本库，不编译berkeley-db 且configure时出现下面WARNING,我们直接忽略即可。因为不使用BDB存储。 configure: WARNING: we have configured without BDB filesystem support You don't seem [...]]]></description>
			<content:encoded><![CDATA[<p>subversion(以下简称svn)是近年来崛起的版本管理工具，能够比较好得替换cvs。</p>
<p>svn主要有2种运行方式：</p>
<p>1. 独立运行的服务器<br />
2. 与apache集成</p>
<p>二种方式各有利弊，可以根据自己的需要进行配置，我不需要Http进行访问，只需要客户端可以Commit &#038; update 就可以，下面是选择的第一种方式——独立运行的SVN服务器。</p>
<p>svn存储版本数据也有2种方式：</p>
<p>1. BDB&#8211;Berkeley Datebase<br />
2. FSFS&#8211;文件存储</p>
<p>BDB方式在服务器中断时，有可能锁住数据，所以还是FSFS方式更安全一点。</p>
<p>下面正式进入安装阶段<br />
<span id="more-99"></span><br />
下载源码</p>
<pre>
wget http://subversion.tigris.org/downloads/subversion-1.6.17.tar.gz
wget http://subversion.tigris.org/downloads/subversion-deps-1.6.17.tar.gz
</pre>
<p>解压并进行编译前的配置</p>
<pre>
tar xfvz subversion-1.6.17.tar.gz
tar xfvz subversion-deps-1.6.17.tar.gz      //安装subversion依赖的所有包，必须先安装这个压缩文件里的包
cd subversion-1.6.17
./configure -–prefix=/usr/local/subversion --with-apr=/usr/local/apr/bin/apr-1-config --with-apr-util=/usr/local/apr/bin/apu-1-config --with-ssl --with-zlib -enable-maintainer-mode --without-berkeley-db
</pre>
<p>注：以svnserve方式运行，不加apache编译参数。以fsfs格式存储版本库，不编译berkeley-db<br />
且configure时出现下面WARNING,我们直接忽略即可。因为不使用BDB存储。</p>
<pre>
configure: WARNING: we have configured without BDB filesystem support

You don't seem to have Berkeley DB version 4.0.14 or newer
installed and linked to APR-UTIL. We have created Makefiles which
will build without the Berkeley DB back-end; your repositories will
use FSFS as the default back-end. You can find the latest version of
Berkeley DB here:

http://www.sleepycat.com/download/index.shtml
</pre>
<p>编译安装</p>
<pre>
make
make install
</pre>
<p>如果 make install 出现下面错误：<br />
error while loading shared libraries: libiconv.so.2: cannot open shared object file: No such file or dictionary</p>
<pre>
#1、编辑/etc/ld.so.conf文件：
vi /etc/ld.so.conf
# 添加下面一行
/usr/local/lib
#2、保存后运行ldconfig。
/sbin/ldconfig
#3、再重新运行make install 问题得到解决。
make install
#注：ld.so.conf和ldconfig用于维护系统动态链接库
</pre>
<p>测试是否安装成功：</p>
<pre>
/usr/local/svn/bin/svnserve --version
</pre>
<p>为方便操作，在/etc/profile最后加入 SVN Path：</p>
<pre>
#1、编辑/etc/profile文件，添加PATH
vi /etc/profile
#比如像下面这样添加：
PATH=/usr/local/php/bin:/usr/local/mysql/bin:/usr/local/svn/bin:$PATH
#添加完成执行，马上生效：
source /etc/profile
#测试查看设置是否成功
echo $PATH
/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/php/bin:/usr/local/mysql/bin:/usr/local/svn/bin:......
#上面已经包含了“/usr/local/svn/bin”，说明已经成功。
</pre>
<p>新建目录和初始化版本库：</p>
<pre>
#新建SVN存放数据文件的版本库目录
mkdir -p /data/svn/repos
#初始化版本库，生成相关配置文件：
svnadmin create /data/svn/repos
</pre>
<p>开始设置配置svnserve.conf：</p>
<pre>
vi /data/svn/repos/conf/svnserve.conf
[general]
anon-access = none # 注意这里必须设置，否则所有用户不用密码就可以访问
auth-access = write
password-db = passwd
authz-db = authz
realm = repos
</pre>
<p>注意：对用户配置文件的修改立即生效，不必重启svn。</p>
<p>初始化版本库完成，开始设置passwd 用户账号信息：</p>
<pre>
vi /data/svn/repos/conf/passwd
[users]
user1 = passwd1
user2 = passwd2
</pre>
<p>设置authz 用户访问权限：</p>
<pre>
vi /data/svn/repos/conf/authz
[groups]
grp = user1, user2       // grp 组包括两个用户 user1, user2

[/]
user1=       // user1 对根目录没有任何权限
user2 = rw     // user2 对根目录有读写权限

[repos:/test]     // 对 repos 仓库的 test 项目进行权限限制
@grp = rw      // 限制grp 组对 test 项目有读写权限
user2 =          // 限制 user2 所有权限，其它用户有读写权限
</pre>
<p>新建svn用户和启动svn服务器：</p>
<pre>
useradd svn -r -s /sbin/nologin         // -r 表示建立为系统级用户
chown -R svn:svn /data/svn
svnserve -d --listen-port 12345 -r /data/svn         // 监听12345端口，默认为3690；-r 指定svn根目录
</pre>
<p>配置subversion可以自动随系统启动：编辑/etc/xinetd.conf文件，加入如下行，“svn stream tcp nowait svn /usr/local/subversion/bin/svnserve svnserve -i -r /data/svn”。其中，第二个“svn”是指定的运行服务的用户名，“/usr/local/subversion/bin/svnserve”是服务的执行程序所在完整路径，再后面的是服务的运行参数，-i表示以inetd的方式启动。 </p>
<p>查看进程</p>
<pre>
ps -ef|grep svn
#如果显示如下，即为启动成功：
svn    1234    1   0 13:33  ?    00:00:00 svnserve -d --listen-port 12345 -r /data/svn
</pre>
<p>检查是否能够访问</p>
<pre>
telnet {your-server-ip} 12345     //检查端口
</pre>
<p>如果telnet 检查不通，有可能是防火墙(iptables)里面端口没开：<br />
vi /etc/sysconfig/iptables<br />
#加入一下行<br />
-A INPUT -m state &#8211;state NEW -m tcp -p tcp &#8211;dport 12345 -j ACCEPT<br />
#保存完成，重启 iptables<br />
/etc/init.d/iptables restart<br />
[/shell]</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.sitearth.com/linux%e4%b8%8a%e6%ba%90%e7%a0%81%e5%ae%89%e8%a3%85subversion/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CentOS下iptables详解</title>
		<link>http://blog.sitearth.com/centos%e4%b8%8biptables%e8%af%a6%e8%a7%a3?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=centos%25e4%25b8%258biptables%25e8%25af%25a6%25e8%25a7%25a3</link>
		<comments>http://blog.sitearth.com/centos%e4%b8%8biptables%e8%af%a6%e8%a7%a3#comments</comments>
		<pubDate>Fri, 02 Dec 2011 07:03:53 +0000</pubDate>
		<dc:creator>一棵葱</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[网络]]></category>
		<category><![CDATA[CentOS]]></category>
		<category><![CDATA[iptables]]></category>
		<category><![CDATA[防火墙]]></category>

		<guid isPermaLink="false">http://blog.sitearth.com/?p=98</guid>
		<description><![CDATA[1. 引言 CentOS 內置了一个非常強劲的防火牆，统称为 iptables，但更正确的名称是 iptables／netfilter。iptables 是一个用戶空间的模块。作为用戶，你在命令行就是通过它将防火牆规则放进缺省的表裡。netfilter 是一个核心模块，它內置於內核中，进行实际的过滤。iptables 有很多前缀图像界面可以让用戶新增或定义规则，但它们很多时不及使用命令行般有灵活性，而且限制用戶了解实际发生的事情。我们将会学习 iptables 的命令行界面。 在我们正式应付 iptables 前，我们必须对它的运作有一个基本的理解。iptables 利用到 IP 地址、协议（tcp、udp、icmp）及端口这些概念。我们不需要成为这些方面的专家（因为我们可以找到所需的信息），但对它们有一般的理解会有帮助。 iptables 将规则放进缺省的规则链（INPUT、OUTPUT 及 FORWARD），而所有流量（IP 压缩）都会被相关的规则链检查，根据当中的规则判断如何处理每个压缩，例如：接纳或丟棄它。这些动作称为目标，而最常见的两个缺省目标就是 DROP 来丟棄压缩；或 ACCEPT 来接纳压缩。 规则链 我们可以在过滤表的 3 条缺省规则链內加入规则，来处理通过这些规则链的压缩。它们分別是： * INPUT &#8211; 所有以主机为目的地的压缩。 * OUTPUT &#8211; 所有源自主机的压缩。 * FORWARD &#8211; 这些压缩的目的地或来源地都不是主机，但路经主机（由它选路）。假若你的主机是一个路由器，这条规则链将会被应用。 我们将会花费最多时间处理 INPUT 规则链，借以过滤进入我们的机器的压缩 —— 亦即是将坏蛋拒诸门外。 规则是以列表的方式被加进每条规则链。每个压缩会被头一条规则开始检查，才至最后一条。假若压缩与其中一条规则吻合，相应的动作便会被执行，例如接纳（ACCEPT）或丟棄（DROP）压缩。一但有吻合的规则，这个压缩便会按照规则来处理，而不再被规则链內的其它规则所检查。假如压缩通过所有检查而不符合任何规则链內的任何一条规则，那应这条规则链的缺省动作将会被执行。这就是所谓的缺省政策，可以设置为接纳（ACCEPT）或丟棄（DROP）压缩。 规则链拥有缺省政策这个概念带来两个基本的可能性，而我们必须考虑它们才能決定如何组织我们的防火牆。 1. 我们可以缺省一个政策来丟棄（DROP）所有压缩，然后刻意加入规则来接纳（ACCEPT）源自被信任的 IP 地址的压缩，或者打开那些提供服务的端口，如：bittorrent、FTP 服务器、网页服务器、Samba 文件服务器等。 [...]]]></description>
			<content:encoded><![CDATA[<p>1. 引言</p>
<p>CentOS 內置了一个非常強劲的防火牆，统称为 iptables，但更正确的名称是 iptables／netfilter。iptables 是一个用戶空间的模块。作为用戶，你在命令行就是通过它将防火牆规则放进缺省的表裡。netfilter 是一个核心模块，它內置於內核中，进行实际的过滤。iptables 有很多前缀图像界面可以让用戶新增或定义规则，但它们很多时不及使用命令行般有灵活性，而且限制用戶了解实际发生的事情。我们将会学习 iptables 的命令行界面。</p>
<p>在我们正式应付 iptables 前，我们必须对它的运作有一个基本的理解。iptables 利用到 IP 地址、协议（tcp、udp、icmp）及端口这些概念。我们不需要成为这些方面的专家（因为我们可以找到所需的信息），但对它们有一般的理解会有帮助。</p>
<p>iptables 将规则放进缺省的规则链（INPUT、OUTPUT 及 FORWARD），而所有流量（IP 压缩）都会被相关的规则链检查，根据当中的规则判断如何处理每个压缩，例如：接纳或丟棄它。这些动作称为目标，而最常见的两个缺省目标就是 DROP 来丟棄压缩；或 ACCEPT 来接纳压缩。</p>
<p>规则链</p>
<p>我们可以在过滤表的 3 条缺省规则链內加入规则，来处理通过这些规则链的压缩。它们分別是：</p>
<p>    * INPUT &#8211; 所有以主机为目的地的压缩。<br />
    * OUTPUT &#8211; 所有源自主机的压缩。<br />
    * FORWARD &#8211; 这些压缩的目的地或来源地都不是主机，但路经主机（由它选路）。假若你的主机是一个路由器，这条规则链将会被应用。</p>
<p>我们将会花费最多时间处理 INPUT 规则链，借以过滤进入我们的机器的压缩 —— 亦即是将坏蛋拒诸门外。<br />
<span id="more-98"></span><br />
规则是以列表的方式被加进每条规则链。每个压缩会被头一条规则开始检查，才至最后一条。假若压缩与其中一条规则吻合，相应的动作便会被执行，例如接纳（ACCEPT）或丟棄（DROP）压缩。一但有吻合的规则，这个压缩便会按照规则来处理，而不再被规则链內的其它规则所检查。假如压缩通过所有检查而不符合任何规则链內的任何一条规则，那应这条规则链的缺省动作将会被执行。这就是所谓的缺省政策，可以设置为接纳（ACCEPT）或丟棄（DROP）压缩。</p>
<p>规则链拥有缺省政策这个概念带来两个基本的可能性，而我们必须考虑它们才能決定如何组织我们的防火牆。</p>
<p>1. 我们可以缺省一个政策来丟棄（DROP）所有压缩，然后刻意加入规则来接纳（ACCEPT）源自被信任的 IP 地址的压缩，或者打开那些提供服务的端口，如：bittorrent、FTP 服务器、网页服务器、Samba 文件服务器等。</p>
<p>又或者，</p>
<p>2. 我们可以缺省一个政策来接纳（ACCEPT）所有压缩，然后刻意加入规则来拦截（DROP）来自有问题的 IP 地址或系列的压缩，也或者阻止压缩进出只作私人用途或未提供服务的端口。</p>
<p>普遍来說，第一个方法多数用在 INPUT 规则链，因为我们会希望控制哪些东西可以访问我们的机器；而第二个方法多数用在 OUTPUT 规则链，因为我们多数信赖那些离开（源自）我们机器的压缩。</p>
<p>2. 準备开始</p>
<p>在命令行上使用 iptables 需要 root 的权限，因此你必须化身为 root 用戶来做下面的事情。</p>
<p>[attachment:ArtWork/WikiDesign/icon-admonition-attention.png]</p>
<p>注意： 我们将会停用 iptables 及复位你的防火牆规则，因此假若你依赖你的 Linux 防火牆作为第一道防線，请特別留意这点。</p>
<p>iptables 应该缺省被安装在所有 CentOS 3.x、4.x 及 5.x 上。你可以这樣来检查 iptables 是否已安装在你的系统上：</p>
<p>$ rpm -q iptables<br />
iptables-1.3.5-1.2.1</p>
<p>要知道 iptables 是否正在运作中，我们可以检查 iptables 这个模块是否已被装入，並利用 -L 这个选项来查看活动的规则：</p>
<p># lsmod | grep ip_tables<br />
ip_tables              29288 1 iptable_filter<br />
x_tables               29192 6 ip6t_REJECT,ip6_tables,ipt_REJECT,xt_state,xt_tcpudp,ip_tables</p>
<p># iptables -L<br />
Chain INPUT (policy ACCEPT)<br />
target     prot opt source               destination<br />
RH-Firewall-1-INPUT all &#8212; anywhere             anywhere<br />
Chain FORWARD (policy ACCEPT)<br />
target     prot opt source               destination<br />
RH-Firewall-1-INPUT all &#8212; anywhere             anywhere<br />
Chain OUTPUT (policy ACCEPT)<br />
target     prot opt source               destination<br />
Chain RH-Firewall-1-INPUT (2 references)<br />
target     prot opt source               destination<br />
ACCEPT     all &#8212; anywhere             anywhere<br />
ACCEPT     icmp &#8212; anywhere             anywhere            icmp any<br />
ACCEPT     esp &#8212; anywhere             anywhere<br />
ACCEPT     ah   &#8212; anywhere             anywhere<br />
ACCEPT     udp &#8212; anywhere             224.0.0.251         udp dpt:mdns<br />
ACCEPT     udp &#8212; anywhere             anywhere            udp dpt:ipp<br />
ACCEPT     tcp &#8212; anywhere             anywhere            tcp dpt:ipp<br />
ACCEPT     all &#8212; anywhere             anywhere            state RELATED,ESTABLISHED<br />
ACCEPT     tcp &#8212; anywhere             anywhere            state NEW tcp dpt:ssh<br />
REJECT     all &#8212; anywhere             anywhere            reject-with icmp-host-prohibited</p>
<p>从上面我们可看见缺省的规则，与及访问 SSH 服务用的规则。</p>
<p>如果 iptables 並未被执行，你可以这樣啟用它：</p>
<p># system-config-securitylevel</p>
<p>3. 创建一组简单的规则</p>
<p>[attachment:ArtWork/WikiDesign/icon-admonition-attention.png]</p>
<p>注意： 此刻我们将会清除缺省的规则集。如果你是通过 SSH 远程连接到一台服务器来进行学习，你有可能会将自己拒诸这台机器之外。你必须将缺省的输入（input）政策改为接纳（accept），然后才清除现有规则，接著你要预先加入一条容许你自己访问机器的规则，避免你将自己封锁在外。</p>
<p>我们会採用一个以样例为本的方法来查看 iptables 的不同指令。在首个样例中，我们会创建一组简单的规则来设置一个「状态压缩检验」（SPI）防火牆，容许对外的连接但拦截一切无用的对內连接：</p>
<p># iptables -P INPUT ACCEPT<br />
# iptables -F<br />
# iptables -A INPUT -i lo -j ACCEPT<br />
# iptables -A INPUT -m state &#8211;state ESTABLISHED,RELATED -j ACCEPT<br />
# iptables -A INPUT -p tcp &#8211;dport 22 -j ACCEPT<br />
# iptables -P INPUT DROP<br />
# iptables -P FORWARD DROP<br />
# iptables -P OUTPUT ACCEPT<br />
# iptables -L -v</p>
<p>你应该得到这樣的输出：</p>
<p>Chain INPUT (policy DROP 0 packets, 0 bytes)<br />
pkts bytes target     prot opt in     out     source               destination<br />
    0     0 ACCEPT     all &#8212; lo     any     anywhere             anywhere<br />
    0     0 ACCEPT     all &#8212; any    any     anywhere             anywhere            state RELATED,ESTABLISHED<br />
    0     0 ACCEPT     tcp &#8212; any    any     anywhere             anywhere            tcp dpt:ssh<br />
Chain FORWARD (policy DROP 0 packets, 0 bytes)<br />
pkts bytes target     prot opt in     out     source               destination<br />
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)<br />
pkts bytes target     prot opt in     out     source               destination</p>
<p>现在让我们逐一看看以上的 8 个指令，並理解我们实际做了甚麼：</p>
<p>   1.</p>
<p>      iptables -P INPUT ACCEPT 假如利用远程连接，我们必须临时将 INPUT 链的缺省政策改为 ACCEPT，否则当我们清除现有的规则集时，便会将自己封锁在服务器之外。<br />
   2.</p>
<p>      iptables -F 我们利用 -F 选项来清除一切现存的规则，好让我们能夠在崭新的状态下加入的规则。<br />
   3.</p>
<p>      iptables -A INPUT -i lo -j ACCEPT 现在是时候加入一些规则了。我们利用 -A 选项来附加（新增）规则到某条链，而这裡所指的是 INPUT 链。接著我们利用 -i 选项（interface「界面」之意）来指定那些符合或来自 lo（localhost、127.0.0.1）界面的压缩。最后我们 -j（jump「跳至」）符合这条规则的目标动作：在这裡是 ACCEPT。所以这条规则会导致所有转至 localhost 界面的对內压缩获得接纳。一般来說这是必须的，因为很多软件预期能夠与 localhost 适配器沟通。<br />
   4.</p>
<p>      iptables -A INPUT -m state &#8211;state ESTABLISHED,RELATED -j ACCEPT 这是担负起大部份工作的规则，而我们再一次将它加进（-A）INPUT 链內。这裡我们利用 -m 选项来装入一个模块（state）。state 模块能夠查看一个压缩並判断它的状态是 NEW、ESTABLISHED 抑或 RELATED。NEW 指內进的压缩属於不是由主机啟主导的新增连接。ESTABLISHED 及 RELATED 指內进的压缩隸属於一条现存的连接，或者与现存的连接有关系。<br />
   5.</p>
<p>      iptables -A INPUT -p tcp &#8211;dport 22 -j ACCEPT 现在我们加入一条规则来容许 SSH 通过 tcp 端口 22 来连接。这樣做是要防止我们连接到远程系统的 SSH 连接意外地被封销。我们稍后会更详细解释这条规则。<br />
   6.</p>
<p>      iptables -P INPUT DROP 这个 -P 选项设置某条规则链上的缺省政策。我们现在可以将 INPUT 链的缺省政策改为 DROP。意思就是，不符合任何一条规则的对內压缩将会被丟棄。要是我们通过 SSH 远程连接而沒有加入上一条规则，此刻我们便会被封锁於系统之外。<br />
   7.</p>
<p>      iptables -P FORWARD DROP 同樣地，在这裡我们将 FORWARD 链的缺省政策设为 DROP，因为我们並不是用计算机作为路由器，所以理应沒有任何压缩路经它。<br />
   8.</p>
<p>      iptables -P OUTPUT ACCEPT 而最后，我们将 OUTPUT 链的缺省政策设为 ACCEPT，因为我们想容许所有对外的流量（由於我们信任我们的用戶）。<br />
   9.</p>
<p>      iptables -L -v 最后，我们可以列出（-L）刚加入的规则，並检查它们是否被正确地装入。</p>
<p>我们需要做的最后一件事情，就是存储我们的规则，好让它们在下次开机时会自动被重新装入：</p>
<p># /sbin/service iptables save</p>
<p>这 樣做会执行 iptables 的 init 腳本，它会执行 /sbin/iptables-ave 並将现有的 iptables 设置写进 /etc/sysconfig/iptables。开机时，iptables 的 init 腳本会通过 /sbin/iptables-restore 这个指令重新施用存储在 /etc/sysconfig/iptables 內的规则。</p>
<p>很明显的，在指令殼內输入这堆指令会颇乏味，因此运用 iptables 的最简易方法就是创建一个代你做以上一切的腳本。你可以将上面的指令输入到你喜欢的文字编辑器內並存储为 myfirewall，例如：</p>
<p>#!/bin/bash<br />
#<br />
# iptables 样例设置腳本<br />
#<br />
# 清除 iptables 內一切现存的规则<br />
#<br />
iptables -F<br />
#<br />
# 容让 SSH 连接到 tcp 端口 22<br />
# 当通过 SSH 远程连接到服务器，你必须这樣做才能群免被封锁於系统外<br />
#<br />
iptables -A INPUT -p tcp &#8211;dport 22 -j ACCEPT<br />
#<br />
# 设置 INPUT、FORWARD、及 OUTPUT 链的缺省政策<br />
#<br />
iptables -P INPUT DROP<br />
iptables -P FORWARD DROP<br />
iptables -P OUTPUT ACCEPT<br />
#<br />
# 设置 localhost 的访问权<br />
#<br />
iptables -A INPUT -i lo -j ACCEPT<br />
#<br />
# 接纳属於现存及相关连接的压缩<br />
#<br />
iptables -A INPUT -m state &#8211;state ESTABLISHED,RELATED -j ACCEPT<br />
#<br />
# 存储设置<br />
#<br />
/sbin/service iptables save<br />
#<br />
# 列出规则<br />
#<br />
iptables -L -v</p>
<p>註： 我们可以在腳本內加入註释来提醒自己正在做甚麼。</p>
<p>现在令腳本可以被执行：</p>
<p># chmod +x myfirewall</p>
<p>我们现在可以编辑这个腳本，並在指令殼內用以下指令来执行它：</p>
<p># ./myfirewall</p>
<p>4. 界面</p>
<p>在上一个范本中，我们看见如何能接纳所有来自某个界面的压缩，也就是 localhost 界面：</p>
<p>iptables -A INPUT -i lo -j ACCEPT</p>
<p>假设我们现在有两个独立的界面，分別是将我们连接到內联网的 eth0 及连接到外部互联网的 ppp0 拨号调制解调器（或者 eth1 适配器）。我们或许会想接纳所有来自內联网的对內压缩，但依然过滤那些来自互联网的压缩。我们可以这樣做：</p>
<p>iptables -A INPUT -i lo -j ACCEPT<br />
iptables -A INPUT -i eth0 -j ACCEPT</p>
<p>让特別留意 —— 假如你接纳来自互联网界面（例如 ppp0 拨号调制解调器）的所有压缩：</p>
<p>iptables -A INPUT -i ppp0 -j ACCEPT</p>
<p>你便等同於停用了我们的防火牆！</p>
<p>5. IP 地址</p>
<p>将整个界面开放给对內的压缩也许不夠严谨，而你想拥有更多控制权来決定接纳甚麼及拒絕甚麼。现在假设我们拥有一群採用 192.168.0.x 私人网络的计算机。我们可以打开防火牆给来自某个被信任 IP 地址（例如 192.168.0.4）的对內压缩：</p>
<p># 接纳来自被信任 IP 地址的压缩<br />
iptables -A INPUT -s 192.168.0.4 -j ACCEPT # change the IP address as appropriate</p>
<p>将这个指令分解，我们首先附加（-A）一条规则到 INPUT 链，指明来源（-s）IP 地址是 192.168.0.4 的压缩都应该被接纳（ACCEPT）（请亦留意我们如何利用 # 符号来解释我们的腳本，因为 # 之后的所有文字都会被视为註释）。</p>
<p>当 然，如果我们想接纳来自一系列 IP 地址的压缩，我们可以为每个被位任的 IP 地址加入一条规则，而这樣做的确是可行的。但是假如它们的数量很多，一次过加入一系列 IP 地址会比较简单。要这樣做，我们可以利用一个子网掩码或标準的斜線记法来指定 IP 地址的范围。举个例說，如果我们想将防火牆开放给来自整个 192.168.0.x（当中 x=1 到 254）范围的压缩，我们可以用下面其中一个方法来达致目的：</p>
<p># 接纳来自被信任 IP 地址的压缩<br />
iptables -A INPUT -s 192.168.0.0/24 -j ACCEPT # using standard slash notation<br />
iptables -A INPUT -s 192.168.0.0/255.255.255.0 -j ACCEPT # using a subnet mask</p>
<p>最 后，除了过滤单一的 IP 地址外，我们亦可以配对该设备的 MAC 地址。要这应做，我们需要装入一个容许过滤 MAC 地址的模块（mac 模块）。较早前当我们用 state 模块来配对 ESTABLISHED 及 RELATED 压缩时，我们看见模块扩展 iptables 功能的例子。在这裡我们除了检查压缩的 IP 地址外，更利用 mac 模块来检查来源地的 MAC 地址：</p>
<p># 接纳来自被信任 IP 地址的压缩<br />
iptables -A INPUT -s 192.168.0.4 -m mac &#8211;mac-source 00:50:8D:FD:E6:32 -j ACCEPT</p>
<p>首先我们用 -m mac 来装入 mac 模块，然后我们用 &#8211;mac-source 来指定来源 IP 地址（192.168.0.4）的 MAC 地址。你要为每个需要过滤的乙太网设备找出 mac 地址。以 root 的身份执行 ifconfig（无線设备用 iwconfig）可以将 mac 地址告䜣你。</p>
<p>这 樣可防止来源地的 IP 地址被偽装，因为只有真正源於 192.168.0.4（MAC 地址是 00:50:8D:5D:E6:32）的压缩才会被接纳，而所有假扮源於该地址的压缩都会被拦截。请注意，过滤 MAC 地址在互联网上不能使用，卻絕对能正确地在內联网裡运作。</p>
<p>6. 端口及协议</p>
<p>由上面我们看见如何将新增规则在防火牆內，用来过滤符合某个界面或来源 IP 地址的压缩。 这樣做让我们能经过防火牆访问某些被信任的来源（主机）。现在我们看看如何过滤协议及端口，好叫我们能进一步区別要接纳及拦截那些对內的压缩。</p>
<p>在 我们开始之先，我们须要知道个別服务所使用的协议及端口编号。让我们以 bittorrent 作为一个简单的样例。bittorrent 在 6881 端口上採用 tcp 协议，因此我们需要容许所有以 6881 为目标端口（它们抵步时所用的端口）的 tcp 压缩。</p>
<p># 接纳目标端口是 6881 号（bittorrent）的 tcp 压缩<br />
iptables -A INPUT -p tcp &#8211;dport 6881 -j ACCEPT</p>
<p>在这裡我们附加（-A）一条规则到 INPUT 链，配对 tcp 协议（-p tcp）及从 6881 目标端口进入我们的机器（&#8211;dport 6881）。</p>
<p>註： 要配对目标或来源端口（&#8211;dport 或 &#8211;sport），你必须先指定协议（tcp、udp、icmp、all）。</p>
<p>我们亦可以扩展以上的样例来包含一系列的端口，例如，接纳 6881 至 6890 端口上的所有 tcp 压缩：</p>
<p># 接纳目标端口是 6881-6890 号的 tcp 压缩<br />
iptables -A INPUT -p tcp &#8211;dport 6881:6890 -j ACCEPT</p>
<p>7. 融会贯通</p>
<p>既然我们已经有基本认识，现在便可以合併这些规则。</p>
<p>UNIX／Linux 上一个受欢迎的服务就是容许远程登录的 SSH 服务。SSH 缺省使用 22 号端口及採用 tcp 协议。因此假若我们想允许远程登录，我们需要容许 tcp 连接到 22 号端口：</p>
<p># 接纳目标端口是 22 号（SSH）的 tcp 压缩<br />
iptables -A INPUT -p tcp &#8211;dport 22 -j ACCEPT</p>
<p>这 樣做会开放 22 号端口（SSH）给所有对內的 tcp 连接，卻会构成潛在的安全性威胁，因为骇客可以強行破入使用易猜测口令的戶口。然而，假若我们知道那些通过 SSH 作远程登录的可信任机器的 IP 地址，我们便可以将访问权限制到那些来源 IP 地址。举个例說，如果我们只想将 SSH 的访问权开放给我们的私人內联网（192.168.0.x），我们可以将来源 IP 地址限制在这个范围：</p>
<p># 接纳来自私人內联网，目标端口是 22 号（SSH）的 tcp 压缩<br />
iptables -A INPUT -p tcp -s 192.168.0.0/24 &#8211;dport 22 -j ACCEPT</p>
<p>利 用来源 IP 进行过滤容让我们能安全地开放 22 号端口上的 SSH 给可信任的 IP 地址来访问。举个例說，我们可以用这个方法允许工作与家用机器之间的登录。对於其它 IP 地址来說，这个端口（与及服务）就好像了关闭了一樣，而服务亦依被停用，因此扫描端口的骇客多数会略过我们。</p>
<p>8. 总结</p>
<p>这裡只是很初步地介绍 iptables 可以做的事情，但我希望这份教学文档提供了一个良好的基础，帮助各位创建更复杂的规则集。</p>
<p>9. 链接</p>
<p>http://www.centos.org/docs/5/html/Deployment_Guide-en-US/ch-fw.html</p>
<p>http://www.centos.org/docs/5/html/Deployment_Guide-en-US/ch-iptables.html</p>
<p><em>原文出自：http://hi.baidu.com/gaolongquan/blog/item/3b35e5d3e1fb990c3bf3cfae.html</em></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.sitearth.com/centos%e4%b8%8biptables%e8%af%a6%e8%a7%a3/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CodeIgniter中使用Smarty模板引擎</title>
		<link>http://blog.sitearth.com/codeigniter%e4%b8%ad%e4%bd%bf%e7%94%a8smarty%e6%a8%a1%e6%9d%bf%e5%bc%95%e6%93%8e?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=codeigniter%25e4%25b8%25ad%25e4%25bd%25bf%25e7%2594%25a8smarty%25e6%25a8%25a1%25e6%259d%25bf%25e5%25bc%2595%25e6%2593%258e</link>
		<comments>http://blog.sitearth.com/codeigniter%e4%b8%ad%e4%bd%bf%e7%94%a8smarty%e6%a8%a1%e6%9d%bf%e5%bc%95%e6%93%8e#comments</comments>
		<pubDate>Fri, 25 Nov 2011 08:01:25 +0000</pubDate>
		<dc:creator>一棵葱</dc:creator>
				<category><![CDATA[CodeIgniter]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[codeigniter]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[smarty]]></category>
		<category><![CDATA[开源]]></category>
		<category><![CDATA[模板]]></category>
		<category><![CDATA[模板引擎]]></category>

		<guid isPermaLink="false">http://blog.sitearth.com/?p=96</guid>
		<description><![CDATA[版权声明：原创作品，转载请务必以超链接形式标明文章 原始出处 、作者和本声明，否则将追究法律责任。 刚接触了 codeigniter，感觉其模板解析类比较简单，教程中有一句“模板解析类不是一个完善的模板解析方案。为了保持最高性能，我们的模板解析类非常精简。”，这也说明了这一点。所以还是用 smarty 吧。 1. 下载 Smarty-3.1.5 并解压，将其中的 libs 目录复制到 application/third_party 并改名为 Smarty-3.1.5（当然你可以复制到其它位置） 2. 在目录 application/libraries 下建立一个类文件 CI_Smarty.php（当然也可以命名为 MY_Smarty.php，只要前缀定义的是 MY） &#60;?php if ( ! defined(&#039;BASEPATH&#039;)) exit(&#039;No direct script access allowed&#039;); require_once APPPATH.&#039;third_party/Smarty-3.1.5/Smarty.class.php&#039;; /** * Smarty Class * * Lets you use smarty engine in CodeIgniter. * * @package Application * @subpackage Libraries [...]]]></description>
			<content:encoded><![CDATA[<p><div style="margin-bottom:10px;border:1px dashed #ccc;padding:3px;color:#00F;">版权声明：原创作品，转载请务必以超链接形式标明文章 原始出处 、作者和本声明，否则将追究法律责任。 </div><br />
刚接触了 codeigniter，感觉其模板解析类比较简单，教程中有一句“模板解析类不是一个完善的模板解析方案。为了保持最高性能，我们的模板解析类非常精简。”，这也说明了这一点。所以还是用 smarty 吧。</p>
<p>1. 下载 Smarty-3.1.5 并解压，将其中的 libs 目录复制到 application/third_party 并改名为 Smarty-3.1.5（当然你可以复制到其它位置）</p>
<p>2. 在目录 application/libraries 下建立一个类文件 CI_Smarty.php（当然也可以命名为 MY_Smarty.php，只要前缀定义的是 MY）<br />
<span id="more-96"></span></p>
<pre>
&lt;?php  if ( ! defined(&#039;BASEPATH&#039;)) exit(&#039;No direct script access allowed&#039;);
require_once APPPATH.&#039;third_party/Smarty-3.1.5/Smarty.class.php&#039;;

/**
 * Smarty Class
 *
 * Lets you use smarty engine in CodeIgniter.
 *
 * @package		Application
 * @subpackage	Libraries
 * @category	Customize Class
 * @author		sitearth
 * @link		blog.sitearth.com
 */
class CI_Smarty extends Smarty {

	var $CI;

	/**
	 * Smarty constructor
	 *
	 * The constructor runs the session routines automatically
	 * whenever the class is instantiated.
	 */
	public function __construct()
	{
		parent::__construct();

		$this-&gt;CI =&amp; get_instance();
		$this-&gt;template_dir = APPPATH . &#039;views/&#039;;
		$this-&gt;compile_dir = &#039;cache/templates_c/&#039;;
		//$this-&gt;config_dir = $CI-&gt;config-&gt;item(&#039;configs_dir&#039;);
		//$this-&gt;cache_dir = $CI-&gt;config-&gt;item(&#039;cache&#039;);
		//$this-&gt;caching = true;
		//$this-&gt;cache_lifetime = ;
		//$this-&gt;debugging = true;
		$this-&gt;left_delimiter = &#039;{*&#039;;
		$this-&gt;right_delimiter = &#039;*}&#039;;
	}

	// --------------------------------------------------------------------

	/**
	 * An encapsulation of display method in smarty class
	 *
	 * @access	public
	 * @param	string
	 * @param   mixed
	 * @return	void
	 */
	public function view($template_file, $assigns = array())
	{
		if (strpos($template_file, &#039;.&#039;) === false)
		{
			$template_file .= &#039;.html&#039;;
		}

		if ( ! is_file($this-&gt;template_dir . &#039;/&#039; . $template_file)) {
			show_error(&quot;Smarty error: {$template_file} cannot be found.&quot;);
		}

		if (is_array($assigns) &amp;&amp; !empty($assigns))
		{
			foreach ($assigns as $key =&gt; $value)
				$this-&gt;assign($key, $value);
		}

		$this-&gt;display($template_file);
	}

}
/* End of file Smarty.php */
/* Location: ./application/libraries/Smarty.php */
</pre>
<p>当然，smarty的属性配置可以放到一个配置文件（如 smarty.php）中，把这个文件放到 application/config 目录中，就可以使用 $CI->config->item() 来获取了。<br />
btw：发现 smarty3 发生了一些变化，一个是在定义 $this->template_dir 的值后面必须有 ‘/‘（斜杠），否则会出现找不到模板文件的错误；另一个是模板文件中的分界符与变量之间不能有空格，否则不能正常输出变量，如分界符是 {* ，那么 {* $title *} 是不能输出变量 title 的，必须是 {*$title*} 。</p>
<p>3. 新建一个测试控制器 test</p>
<pre>
&lt;?php if ( ! defined(&#039;BASEPATH&#039;)) exit(&#039;No direct script access allowed&#039;);
class Test extends CI_Controller {

	/**
	 * Test construtor
	 */
	public function __construct()
	{
		parent::__construct();
	}
        /**
	 * Index Page for this controller.
	 */
        public function index()
	{
		$this-&gt;load-&gt;library(&#039;smarty&#039;);
		$this-&gt;smarty-&gt;view(&#039;test&#039;,array(&#039;title&#039;=&gt;&#039;测试&#039;));
	}
}
</pre>
<p>4. 新建一个模板文件 test.html 放到指定的模板目录 application/views 中</p>
<pre>
&lt;html&gt;
&lt;head&gt;
	&lt;title&gt;{*$title*}&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;

&lt;p&gt;Congratulations! The smarty worked well.&lt;/p&gt;

&lt;/body&gt;
&lt;/html&gt;
</pre>
<p>这样就可以看到输出的结果了。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.sitearth.com/codeigniter%e4%b8%ad%e4%bd%bf%e7%94%a8smarty%e6%a8%a1%e6%9d%bf%e5%bc%95%e6%93%8e/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>linux下configure命令详细介绍</title>
		<link>http://blog.sitearth.com/linux%e4%b8%8bconfigure%e5%91%bd%e4%bb%a4%e8%af%a6%e7%bb%86%e4%bb%8b%e7%bb%8d?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=linux%25e4%25b8%258bconfigure%25e5%2591%25bd%25e4%25bb%25a4%25e8%25af%25a6%25e7%25bb%2586%25e4%25bb%258b%25e7%25bb%258d</link>
		<comments>http://blog.sitearth.com/linux%e4%b8%8bconfigure%e5%91%bd%e4%bb%a4%e8%af%a6%e7%bb%86%e4%bb%8b%e7%bb%8d#comments</comments>
		<pubDate>Thu, 17 Nov 2011 02:07:03 +0000</pubDate>
		<dc:creator>一棵葱</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[configure]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[卸载软件]]></category>
		<category><![CDATA[命令参数]]></category>

		<guid isPermaLink="false">http://blog.sitearth.com/?p=94</guid>
		<description><![CDATA[Linux环境下的软件安装，并不是一件容易的事情;如果通过源代码编译后在安装，当然事情就更为复杂一些;现在安装各种软件的教程都非常普遍;但万变不 离其中，对基础知识的扎实掌握，安装各种软件的问题就迎刃而解了。Configure脚本配置工具就是基础之一，它是autoconf的工具的基本应用。 与一些技巧相比，Configure显得基础一些，当然使用和学习起来就显得枯燥乏味一些，当然要成为高手，对基础的熟悉不能超越哦。 为此我转载了一篇关于Configure选项配置的详细介绍。供大家参考 &#8216; configure&#8217;脚本有大量的命令行选项.对不同的软件包来说,这些选项可能会有变化,但是许多基本的选项是不会改变的.带上&#8217;&#8211; help&#8217;选项执行&#8217;configure&#8217;脚本可以看到可用的所有选项.尽管许多选项是很少用到的,但是当你为了特殊的需求而configure一个包 时,知道他们的存在是很有益处的.下面对每一个选项进行简略的介绍: &#8211;cache-file=FILE &#8216;configure&#8217;会在你的系统上测试存在的特性(或者bug!).为了加速随后进行的配置,测试的结果会存储在一个cache file里.当configure一个每个子树里都有&#8217;configure&#8217;脚本的复杂的源码树时,一个很好的cache file的存在会有很大帮助. &#8211;help 输出帮助信息.即使是有经验的用户也偶尔需要使用使用&#8217;&#8211;help&#8217;选项,因为一个复杂的项目会包含附加的选项.例如,GCC包里的&#8217;configure&#8217;脚本就包含了允许你控制是否生成和在GCC中使用GNU汇编器的选项. &#8211;no-create &#8216;configure&#8217;中的一个主要函数会制作输出文件.此选项阻止&#8217;configure&#8217;生成这个文件.你可以认为这是一种演习(dry run),尽管缓存(cache)仍然被改写了. &#8211;quiet &#8211;silent 当&#8217;configure&#8217;进行他的测试时,会输出简要的信息来告诉用户正在作什么.这样作是因为&#8217;configure&#8217;可能会比较慢,没有这种输出 的话用户将会被扔在一旁疑惑正在发生什么.使用这两个选项中的任何一个都会把你扔到一旁.(译注:这两句话比较有意思,原文是这样的:If there was no such output, the user would be left wondering what is happening. By using this option, you too can be left wondering!) &#8211;version 打印用来产生&#8217;configure&#8217;脚本的Autoconf的版本号. &#8211;prefix=PEWFIX &#8216;&#8211;prefix&#8217;是最常用的选项.制作出的&#8217;Makefile&#8217;会查看随此选项传递的参数,当一个包在安装时可以彻底的重新安置他的结构独立部 分. 举一个例子,当安装一个包,例如说Emacs,下面的命令将会使Emacs Lisp file被安装到&#8221;/opt/gnu/share&#8221;: $ ./configure [...]]]></description>
			<content:encoded><![CDATA[<p>      Linux环境下的软件安装，并不是一件容易的事情;如果通过源代码编译后在安装，当然事情就更为复杂一些;现在安装各种软件的教程都非常普遍;但万变不 离其中，对基础知识的扎实掌握，安装各种软件的问题就迎刃而解了。Configure脚本配置工具就是基础之一，它是autoconf的工具的基本应用。<br />
      与一些技巧相比，Configure显得基础一些，当然使用和学习起来就显得枯燥乏味一些，当然要成为高手，对基础的熟悉不能超越哦。<br />
       为此我转载了一篇关于Configure选项配置的详细介绍。供大家参考<br />
&#8216;       configure&#8217;脚本有大量的命令行选项.对不同的软件包来说,这些选项可能会有变化,但是许多基本的选项是不会改变的.带上&#8217;&#8211; help&#8217;选项执行&#8217;configure&#8217;脚本可以看到可用的所有选项.尽管许多选项是很少用到的,但是当你为了特殊的需求而configure一个包 时,知道他们的存在是很有益处的.下面对每一个选项进行简略的介绍:<br />
&#8211;cache-file=FILE<br />
&#8216;configure&#8217;会在你的系统上测试存在的特性(或者bug!).为了加速随后进行的配置,测试的结果会存储在一个cache file里.当configure一个每个子树里都有&#8217;configure&#8217;脚本的复杂的源码树时,一个很好的cache file的存在会有很大帮助.<br />
&#8211;help<br />
      输出帮助信息.即使是有经验的用户也偶尔需要使用使用&#8217;&#8211;help&#8217;选项,因为一个复杂的项目会包含附加的选项.例如,GCC包里的&#8217;configure&#8217;脚本就包含了允许你控制是否生成和在GCC中使用GNU汇编器的选项.<br />
&#8211;no-create<br />
      &#8216;configure&#8217;中的一个主要函数会制作输出文件.此选项阻止&#8217;configure&#8217;生成这个文件.你可以认为这是一种演习(dry run),尽管缓存(cache)仍然被改写了.<br />
&#8211;quiet<br />
&#8211;silent<br />
       当&#8217;configure&#8217;进行他的测试时,会输出简要的信息来告诉用户正在作什么.这样作是因为&#8217;configure&#8217;可能会比较慢,没有这种输出 的话用户将会被扔在一旁疑惑正在发生什么.使用这两个选项中的任何一个都会把你扔到一旁.(译注:这两句话比较有意思,原文是这样的:If there was no such output, the user would be left wondering what is happening. By using this option, you too can be left wondering!)<br />
&#8211;version<br />
打印用来产生&#8217;configure&#8217;脚本的Autoconf的版本号.<br />
<span id="more-94"></span><br />
&#8211;prefix=PEWFIX<br />
&#8216;&#8211;prefix&#8217;是最常用的选项.制作出的&#8217;Makefile&#8217;会查看随此选项传递的参数,当一个包在安装时可以彻底的重新安置他的结构独立部 分. 举一个例子,当安装一个包,例如说Emacs,下面的命令将会使Emacs Lisp file被安装到&#8221;/opt/gnu/share&#8221;:<br />
$ ./configure &#8211;prefix=/opt/gnu<br />
&#8211;exec-prefix=EPREFIX<br />
与&#8217;&#8211;prefix&#8217;选项类似,但是他是用来设置结构倚赖的文件的安装位置.编译好的&#8217;emacs&#8217;二进制文件就是这样一个问件.如果没有设置这个选项的话,默认使用的选项值将被设为和&#8217;&#8211;prefix&#8217;选项值一样.<br />
&#8211;bindir=DIR<br />
指定二进制文件的安装位置.这里的二进制文件定义为可以被用户直接执行的程序.<br />
&#8211;sbindir=DIR<br />
指定超级二进制文件的安装位置.这是一些通常只能由超级用户执行的程序.<br />
&#8211;libexecdir=DIR<br />
指定可执行支持文件的安装位置.与二进制文件相反,这些文件从来不直接由用户执行,但是可以被上面提到的二进制文件所执行.<br />
&#8211;datadir=DIR<br />
指定通用数据文件的安装位置.<br />
&#8211;sysconfdir=DIR<br />
指定在单个机器上使用的只读数据的安装位置.<br />
&#8211;sharedstatedir=DIR<br />
指定可以在多个机器上共享的可写数据的安装位置.<br />
&#8211;localstatedir=DIR<br />
指定只能单机使用的可写数据的安装位置.<br />
&#8211;libdir=DIR<br />
指定库文件的安装位置.<br />
&#8211;includedir=DIR<br />
指定C头文件的安装位置.其他语言如C++的头文件也可以使用此选项.<br />
&#8211;oldincludedir=DIR<br />
指定为除GCC外编译器安装的C头文件的安装位置.<br />
&#8211;infodir=DIR<br />
指定Info格式文档的安装位置.Info是被GNU工程所使用的文档格式.<br />
&#8211;mandir=DIR<br />
指定手册页的安装位置.<br />
&#8211;srcdir=DIR<br />
这个选项对安装没有作用.他会告诉&#8217;configure&#8217;源码的位置.一般来说不用指定此选项,因为&#8217;configure&#8217;脚本一般和源码文件在同一个目录下.<br />
&#8211;program-prefix=PREFIX<br />
指定将被加到所安装程序的名字上的前缀.例如,使用&#8217;&#8211;program-prefix=g&#8217;来configure一个名为&#8217;tar&#8217;的程序将会使 安装的程序被命名为&#8217;gtar&#8217;.当和其他的安装选项一起使用时,这个选项只有当他被`Makefile.in&#8217;文件使用时才会工作.<br />
&#8211;program-suffix=SUFFIX<br />
指定将被加到所安装程序的名字上的后缀.<br />
&#8211;program-transform-name=PROGRAM<br />
这里的PROGRAM是一个sed脚本.当一个程序被安装时,他的名字将经过`sed -e PROGRAM&#8217;来产生安装的名字.<br />
&#8211;build=BUILD<br />
指定软件包安装的系统平台.如果没有指定,默认值将是&#8217;&#8211;host&#8217;选项的值.<br />
&#8211;host=HOST<br />
指定软件运行的系统平台.如果没有指定,将会运行`config.guess&#8217;来检测.<br />
&#8211;target=GARGET<br />
指定软件面向(target to)的系统平台.这主要在程序语言工具如编译器和汇编器上下文中起作用.如果没有指定,默认将使用&#8217;&#8211;host&#8217;选项的值.<br />
&#8211;disable-FEATURE<br />
一些软件包可以选择这个选项来提供为大型选项的编译时配置,例如使用Kerberos认证系统或者一个实验性的编译器最优配置.如果默认是提供这些特性,可以使用&#8217;&#8211;disable-FEATURE&#8217;来禁用它,这里&#8217;FEATURE&#8217;是特性的名字.例如:<br />
$ ./configure &#8211;disable-gui<br />
-enable-FEATURE[=ARG]<br />
相反的,一些软件包可能提供了一些默认被禁止的特性,可以使用&#8217;&#8211;enable-FEATURE&#8217;来起用它.这里&#8217;FEATURE&#8217;是特性的名字.一个特性可能会接受一个可选的参数.例如:<br />
$ ./configure &#8211;enable-buffers=128<br />
`&#8211;enable-FEATURE=no&#8217;与上面提到的&#8217;&#8211;disable-FEATURE&#8217;是同义的.<br />
&#8211;with-PACKAGE[=ARG]<br />
在自由软件社区里,有使用已有软件包和库的优秀传统.当用&#8217;configure&#8217;来配置一个源码树时,可以提供其他已经安装的软件包的信息.例如, 倚赖于Tcl和Tk的BLT器件工具包.要配置BLT,可能需要给&#8217;configure&#8217;提供一些关于我们把Tcl和Tk装的何处的信息:<br />
$ ./configure &#8211;with-tcl=/usr/local &#8211;with-tk=/usr/local<br />
&#8216;&#8211;with-PACKAGE=no&#8217;与下面将提到的&#8217;&#8211;without-PACKAGE&#8217;是同义的.<br />
&#8211;without-PACKAGE<br />
有时候你可能不想让你的软件包与系统已有的软件包交互.例如,你可能不想让你的新编译器使用GNU ld.通过使用这个选项可以做到这一点:<br />
$ ./configure &#8211;without-gnu-ld<br />
&#8211;x-includes=DIR<br />
这个选项是&#8217;&#8211;with-PACKAGE&#8217;选项的一个特例.在Autoconf最初被开发出来时,流行使用&#8217;configure&#8217;来作为 Imake的一个变通方法来制作运行于X的软件.&#8217;&#8211;x-includes&#8217;选项提供了向&#8217;configure&#8217;脚本指明包含X11头文件的目录的方 法.<br />
&#8211;x-libraries=DIR<br />
类似的,&#8217;&#8211;x-libraries&#8217;选项提供了向&#8217;configure&#8217;脚本指明包含X11库的目录的方法.<br />
在源码树中运行&#8217;configure&#8217;是不必要的同时也是不好的.一个由&#8217;configure&#8217;产生的良好的&#8217;Makefile&#8217;可以构筑源码属于 另一棵树的软件包.在一个独立于源码的树中构筑派生的文件的好处是很明显的:派生的文件,如目标文件,会凌乱的散布于源码树.这也使在另一个不同的系统或 用不同的配置选项构筑同样的目标文件非常困难.建议使用三棵树:一棵源码树(source tree),一棵构筑树(build tree),一棵安装树(install tree).这里有一个很接近的例子,是使用这种方法来构筑GNU malloc包:<br />
$ gtar zxf mmalloc-1.0.tar.gz<br />
$ mkdir build &#038;&#038; cd build<br />
$ ../mmalloc-1.0/configure<br />
creating cache ./config.cache<br />
checking for gcc&#8230; gcc<br />
checking whether the C compiler (gcc ) works&#8230; yes<br />
checking whether the C compiler (gcc ) is a cross-compiler&#8230; no<br />
checking whether we are using GNU C&#8230; yes<br />
checking whether gcc accepts -g&#8230; yes<br />
checking for a BSD compatible install&#8230; /usr/bin/install -c<br />
checking host system type&#8230; i586-pc-linux-gnu<br />
checking build system type&#8230; i586-pc-linux-gnu<br />
checking for ar&#8230; ar<br />
checking for ranlib&#8230; ranlib<br />
checking how to run the C preprocessor&#8230; gcc -E<br />
checking for unistd.h&#8230; yes<br />
checking for getpagesize&#8230; yes<br />
checking for working mmap&#8230; yes<br />
checking for limits.h&#8230; yes<br />
checking for stddef.h&#8230; yes<br />
updating cache ../config.cache<br />
creating ./config.status<br />
这样这棵构筑树就被配置了,下面可以继续构筑和安装这个包到默认的位置&#8217;/usr/local&#8217;:<br />
$ make all &#038;&#038; make install<br />
一个软件包通过编译源代码安装后，如何完全的卸载??<br />
       如果原先的source还在的话，很多source的Makefile都有写uninstall规则，直接在Souce里make uninstall就可行，不过碰到无良作者没写的，那一句一句看Makefile里install部分他都干了些什么，然后挨个删除。<br />
如果source没了&#8230;..那就一边郁闷吧<br />
       到目前为止, 我装的都可以make uninstall&#8230;&#8230;.<br />
(因为总是不小心装错地方, 结果就make uninstall&#038;&#038;make clean,然后重新configure&#8230;&#8230;)<br />
linux下软件的基本安装和卸载<br />
       Linux软件的安装和卸载一直是困扰许多新用户的难题。在Windows中，我们可以使用软件自带的安装卸载程序或在控制面板中的“添加/删除程 序”来实现。与其相类似，在Linux下有一个功能强大的软件安装卸载工具，名为RPM。它可以用来建立、安装、查询、更新、卸载软件。该工具是在命令行 下使用的。在Shell的提示符后输入rpm，就可获得该命令的帮助信息。<br />
软件的安装<br />
        Linux下软件的安装主要有两种不同的形式。第一种安装文件名为xxx.tar.gz;另一种安装文件名为xxx.i386.rpm。以第一种方式发行的软件多为以源码形式发送的;第二种方式则是直接以二进制形式发送的。<br />
对于第一种，安装方法如下：<br />
1 .首先，将安装文件拷贝至你的目录中。例如，如果你是以root身份登录上的，就将软件拷贝至/root中。<br />
#cp xxx.tar.gz /root<br />
2 .由于该文件是被压缩并打包的,应对其解压缩。命令为：<br />
#tar xvzf filename.tar.gz 如果是filename.tar.bz2格式的，应该是tar jxvf filename.tar.bz2来解压<br />
3. 执行该命令后，安装文件按路径，解压缩在当前目录下。用ls命令可以看到解压缩后的文件。通常在解压缩后产生的文件中，有“Install”的文件。该文件为纯文本文件，详细讲述了该软件包的安装方法。<br />
4.执行解压缩后产生的一个名为configure的可执行脚本程序。它是用于检查系统是否有编译时所需的库，以及库的版本是否满足编译的需要等安装所需要的系统信息。为随后的编译工作做准备。命令为： #./configure<br />
如果您想把软件安装到指定目录，应该用#./configure &#8211;prefix=/您自己指定的目录，比如我想把一个mlterm安装到/opt/mlterm目录中，应该如下输入<br />
#./configure &#8211;prefix=/opt/mlterm<br />
5.检查通过后，将生成用于编译的MakeFile文件。此时，可以开始进行编译了。编译的过程视软件的规模和计算机性能的不同，所耗费的时间也不同。命令为： #make。<br />
6.成功编译后，键入如下的命令开始安装：<br />
#make install<br />
7.安装完毕，应清除编译过程中产生的临时文件和配置过程中产生的文件。键入如下命令：<br />
#make clean<br />
#make distclean<br />
至此，软件的安装结束。<br />
对于第二种，其安装方法要简单得多。<br />
同第一种方式一样，将安装文件拷贝至你的目录中。然后使用rpm来安装该文件。命令如下：<br />
#rpm -i filename.i386.rpm<br />
      rpm将自动将安装文件解包，并将软件安装到缺省的目录下。并将软件的安装信息注册到rpm的数据库中。参数i的作用是使rpm进入安装模式。<br />
软件的卸载<br />
1.软件的卸载主要是使用rpm来进行的。卸载软件首先要知道软件包在系统中注册的名称。键入命令：<br />
#rpm -q -a<br />
即可查询到当前系统中安装的所有的软件包。<br />
2. 确定了要卸载的软件的名称，就可以开始实际卸载该软件了。键入命令：<br />
#rpm -e [package name]<br />
即可卸载软件。参数e的作用是使rpm进入卸载模式。对名为[package name]的软件包进行卸载。由于系统中各个软件包之间相互有依赖关系。如果因存在依赖关系而不能卸载，rpm将给予提示并停止卸载。你可以使用如下的命令来忽略依赖关系，直接开始卸载：<br />
#rpm -e [package name] -nodeps<br />
忽略依赖关系的卸载可能会导致系统中其它的一些软件无法使用<br />
如果想知道rpm包安装到哪里了呢?<br />
应该用 #rpm -ql [package name]<br />
3.如何卸载用源码包安装的软件?<br />
最好是看README和INSTALL ;一般的情况下都有说，但大多软件没有提供源码包的卸载方法;我们可以找到软件的安装点删除。主要看你把它安装在哪了。<br />
比如：<br />
如果安装软件时，指定个目录。这个问题也不会难;<br />
比如用源码包安装gaim 的<br />
#./configure &#8211;prefix=/opt/gaim<br />
#make<br />
#make install<br />
如果安装mlterm<br />
#./configure &#8211;prefix=/opt/mlterm<br />
#make<br />
#make install<br />
把源码包安装的软件，都指定安装在 /opt目录中，这样不就知道了??<br />
如果删除，就删除相应的软件目录;<br />
有些软件要在解压安装目录中执行 make uninstall ，这样就卸载掉了</p>
<p>原文出自：http://liujianguangaaa.iteye.com/blog/1008153</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.sitearth.com/linux%e4%b8%8bconfigure%e5%91%bd%e4%bb%a4%e8%af%a6%e7%bb%86%e4%bb%8b%e7%bb%8d/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CentOS的防火墙iptables配置</title>
		<link>http://blog.sitearth.com/centos%e7%9a%84%e9%98%b2%e7%81%ab%e5%a2%99iptables%e9%85%8d%e7%bd%ae?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=centos%25e7%259a%2584%25e9%2598%25b2%25e7%2581%25ab%25e5%25a2%2599iptables%25e9%2585%258d%25e7%25bd%25ae</link>
		<comments>http://blog.sitearth.com/centos%e7%9a%84%e9%98%b2%e7%81%ab%e5%a2%99iptables%e9%85%8d%e7%bd%ae#comments</comments>
		<pubDate>Wed, 16 Nov 2011 03:17:25 +0000</pubDate>
		<dc:creator>一棵葱</dc:creator>
				<category><![CDATA[CentOS]]></category>
		<category><![CDATA[网络]]></category>
		<category><![CDATA[iptables]]></category>
		<category><![CDATA[配置]]></category>
		<category><![CDATA[防火墙]]></category>

		<guid isPermaLink="false">http://blog.sitearth.com/?p=92</guid>
		<description><![CDATA[在Linux中设置防火墙，以CentOS为例，打开iptables的配置文件： vi /etc/sysconfig/iptables 通过/etc/init.d/iptables status命令查询是否有打开80端口，如果没有可通过两种方式处理： 方法一： 1.修改vi /etc/sysconfig/iptables命令添加使防火墙开放80端口 -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT 2.关闭/开启/重启防火墙 /etc/init.d/iptables stop /etc/init.d/iptables start #restart 重启 方法二： 1.永久性关闭防火墙 chkconfig --level 35 iptables off /etc/init.d/iptables stop iptables -P INPUT DROP 2.打开主动模式21端口 iptables -A INPUT -p tcp --dport 21 -j ACCEPT 3.打开被动模式49152~65534之间的端口 iptables -A [...]]]></description>
			<content:encoded><![CDATA[<p>在Linux中设置防火墙，以CentOS为例，打开iptables的配置文件：</p>
<pre>
vi /etc/sysconfig/iptables
</pre>
<p>通过/etc/init.d/iptables status命令查询是否有打开80端口，如果没有可通过两种方式处理：<br />
方法一：<br />
<strong>1.修改vi /etc/sysconfig/iptables命令添加使防火墙开放80端口</strong></p>
<pre>
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
</pre>
<p>2.关闭/开启/重启防火墙</p>
<pre>
/etc/init.d/iptables stop
/etc/init.d/iptables start
#restart 重启
</pre>
<p><span id="more-92"></span><br />
方法二：<br />
1.永久性关闭防火墙</p>
<pre>
chkconfig --level 35 iptables off
/etc/init.d/iptables stop
iptables -P INPUT DROP
</pre>
<p>2.打开主动模式21端口</p>
<pre>
iptables -A INPUT -p tcp --dport 21 -j ACCEPT
</pre>
<p>3.打开被动模式49152~65534之间的端口</p>
<pre>
iptables -A INPUT -p tcp --dport 49152:65534 -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED -j ACCEPT
</pre>
<p>注意：<br />
一定要给自己留好后路,留VNC一个管理端口和SSh的管理端口<br />
需要注意的是，你必须根据自己服务器的情况来修改这个文件。<br />
全部修改完之后重启iptables:</p>
<pre>
service iptables restart
iptables -L  //验证一下是否规则都已经生效
</pre>
<p><strong>另外补充：</strong></p>
<pre>
iptables -I INPUT -p tcp --dport 80 -j ACCEPT
iptables -I INPUT -p tcp --dport 22 -j ACCEPT
/etc/init.d/iptables save     //保存
iptables -L -n       //查看配置
</pre>
<p>一些软件的默认端口：<br />
ftp用到端口是 20 21<br />
ssh 端口是 22<br />
http端口是 80<br />
telnet端口是 23<br />
rsync端口是 873<br />
svn 端口3690<br />
pop3端口110<br />
smtp端口25<br />
dns端口53<br />
mysql端口3306<br />
nfs端口111</p>
<p>1、查看本机关于 IPTABLES的设置情况,并关闭所有的端口,#慎重，要不你的ssh也失去链接了</p>
<pre>
iptables -L -n --line-number  //显示行号

iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP #慎重，要不你的ssh也失去链接了
</pre>
<p>2.添加规则</p>
<pre>
iptables -I INPUT -p tcp --dport 873 -j ACCEPT
iptables -I OUTPUT -p tcp --sport 873 -j ACCEPT
#加-s xxx.xxx.xxx.xxx为来源ip
</pre>
<p>3.保存规则</p>
<pre>
/etc/init.d/iptables save
</pre>
<p>4.重启iptables</p>
<pre>
service iptables restart
</pre>
<p>5.删除规则,删除相应的条目，然后记得保存和重启</p>
<pre>
iptables -L -n --line-number
iptables -D INPUT 2
iptables -D OUTPUT 2
</pre>
<p>6.例子如，加873端口号，只允许10.218.32.153访问</p>
<pre>
iptables -I INPUT -p tcp -s 10.218.32.153 --dport 873 -j ACCEPT
iptables -I OUTPUT -p tcp -d 10.218.32.153 --sport 873 -j ACCEPT
</pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.sitearth.com/centos%e7%9a%84%e9%98%b2%e7%81%ab%e5%a2%99iptables%e9%85%8d%e7%bd%ae/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

