mysql转义字符的问题

在php.ini中设置了 magic_quotes_gpc = On

或者在程序运行时进行了转义字符

那么存入mysql数据表中的 ‘ 将会变成 ’

反过来显示的时候

将会用到下面的函数进行处理。

function un_magic_quote($value) {
    $value = is_array($value) ? array_map("un_magic_quote", $value) : stripslashes($value);
    return $value;
}

参数$value的类型可以是数组或者字符串

这样得出来的值就会变成 ‘ 而不是 ’ 了。

在用SELECT … LIKE … 这个字段的时候,

要这样写

SELECT * FROM TABLE_NAME WHERE TABLE_FIELD LIKE “%\’%”

这样可以把带有 ’ 的数据搜索出来,注意这里是”而非’

不错的对联广告

var delta=0.15
var collection;
function floaters() {
this.items = [];
this.addItem = function(id,x,y,content)
{document.write('
'+content+'
'); var newItem = {}; newItem.object = document.getElementById(id); newItem.x = x; newItem.y = y; this.items[this.items.length] = newItem; } this.play = function() { collection = this.items setInterval('play()',10); } } function play() { for(var i=0;i0?1:-1)*Math.ceil(Math.abs(dx)); followObj.style.left=followObj.offsetLeft+dx; } if(followObj.offsetTop!=(document.body.scrollTop+followObj_y)) { var dy=(document.body.scrollTop+followObj_y-followObj.offsetTop)*delta; dy=(dy>0?1:-1)*Math.ceil(Math.abs(dy)); followObj.style.top=followObj.offsetTop+dy; } followObj.style.display = ''; } } var theFloaters = new floaters(); theFloaters.addItem('followDiv1','document.body.clientWidth-95',200,'

下拉菜单出现在flash下面

可以这样理解 下拉菜单通过执行一次显示命令出现在画面上,但是FLASH这样的动画不停地在执行显示命令(因为动画是动的呵呵),每次都更新了画面的显示,所以如果两者重叠,就会因为FLASH显示了新图象画面,下拉菜单的画面被覆盖.
解决办法:
方法一:把swf文件属性设置成透明,在flash参数里面加上
,如果你用dreamweaver,选中那个swf文件,属性面板上会有一个“参数…”按钮(在面板的最下面),点一下,在弹出框里左边“参数”下面加上wmode,对应右边的值输入transparent,确定后就可以了
方法二:dreamweaver有个排列的,把swf文件设置在最底层不就行了!

编写PHP的安全策略

PHP最初是被称作Personal Home Page,后来随着PHP成为一种非常流行的脚本语言,名称也随之改变了,叫做Professional HyperText PreProcessor。以PHP4.2为例支持它的WEB服务器有:Apache, Microsoft Internet information Sereve, Microsoft Personal web Server,AOLserver,Netscape Enterprise 等等。
PHP是一种功能强大的语言和解释器,无论是作为模块方式包含到web服务器里安装的还是作为单独的CGI程序程序安装的,都能访问文件、执行命令或者在服务器上打开链接。而这些特性都使得PHP运行时带来安全问题。虽然PH P是特意设计成一种比用Perl或C语言所编写的CGI程序要安全的语言,但正确使用编译时和运行中的一些配置选项以及恰当的应用编码将会保证其运行的安全性。
一、安全从开始编译PHP开始。
在编译PHP之前,首先确保操作系统的版本是最新的,必要的补丁程序必须安装过。另外使用编译的PHP也应当是最新的版本,关于PHP的安全漏洞也常有发现,请使用最新版本,如果已经安装过PHP请升级为最新版本:4.2.3
相关链接:http://security.e-matters.de/advisories/012002.html
安装编译PHP过程中要注意的3个问题:
1、只容许CGI文件从特定的目录下执行:首先把处理CGI脚本的默认句柄删除,然后在要执行CGI脚本的目录在http.conf 文件中加入ScriptAlias指令。
#Addhadler cgi-script .cgi
ScriptAlias /cgi-bin/ “/usr/local/apache/cgi-bin/”

AllowOverride None
Options ExecCGI
Order allow,deny
Allow from all

SriptAlias的第一个参数指明在Web中的可用相对路径,第二个参数指明脚本放在服务器的目录。应该对每个目录
别名都用Directory,这样可使得除系统管理员之外的人不知道Web服务器上CGI脚本的清单。
Directory允许用户创建自己的CGI脚本。也可用SriptAliasMatch,但Directory更容易使用。 允许用户创建自己
CGI脚本可能会导致安全问题,你可能不希望用户创建自己的CGI。 Apache默认配置是注释掉cgi—script的处理句柄,但有/cgi-bin目录使用SriptAlias和Directory指令。 你也可禁止CGI执行,但仍允许执行PHP脚本。
2.把PHP解析器放在web目录外
把PHP解析器放在Web目录树外是非常重要的做法。这样可以防止web服务器对PHP的解析器的滥用。特别是
不要把PHP解析器放在cgi-bin或允许执行CGI程序的目录下。然而,使用Action解析脚本是不可能的,因为用Action指令时,PHP解析器大多数要放在能够执行CGI的目录下只有当PHP脚本作为CGI程序执行时,才能把PHP解析器放在Web目录树之外。
如果希望PHP脚本作为CGI程序执行(这们可以把PHP解析器放在Web目录树之外),可以这样:
( 1)所有的PHP脚本必须位于能执行CGI程序的目录里。
( 2)脚本必须是可执行的(仅在UNIX/Linux机器里)。
(3)脚本必须在文件头包括PHP解析器的路径。
你可用下面命令使PHP脚本为可执行:
#chmod +x test.php4
这样使在当前目录下的文件名为test.PhP4的脚本变为可执行。 下面是一个能作为CGI程序运行的PHP脚的小例子。
#!/usr/local/bin/php
echo “This is a my small cgi program”
3. 按Apache模块方式安装:
当将PHP作为Apache模块使用时,它将继承Apche的用户权限(一般情况下用户为“nobody”)。这一点对于安全性和
验证有不少影响。例如,使用PHP访问数据库,除非数据库支持内建的访问控制,将不得不设置数据库对于用户“nobody”
的可访问权限。这将意味着恶意的脚本在没有访问用户名和密码,也能访问并修改数据库。通过Apache验证来保护数据不被暴露,或者也可使用LDAP、.htaccess文件等设计自己的访问控制模型,并在PHP脚本中将此代码作为其中部分引入。 通常,一旦安全性建立,此处PHP用户(此情形即Apache用户)就风险大大降低了,会发现PHP护现在已被封禁了将可能的染毒文件写入用户目录的能力。 此处最常犯的安全性错误是赋予Apache服务器根(root)权限。 将Apache用户权限提升到根权限是极端危险的。可能会危及整个系统,因此要小心使用sudo,chroot安全隐患大的命令等。除非你对安全有绝对的掌握,否则不要让其以ROOT权限运行。
二、让PHP的使用更安全。
1、以安全模式运行PHP
以安全模式运行PHP是使PHP脚本安全使用的好方法,特别是在允许用户使用自己开发的PHP脚本时。使用安全模式会使PHP在运行函数时检查是否存在安全问题。 include、readfile、fopen、file、unlink、rmdir等等:被包含的文件或者该文件所在目录的所有者必须是正在运行的脚本的所有者; Exec、System、Passthm等等:要执行的程序必须位于特定的目录(默认为/usr/local/php/bin)。编译PHP时可以用—with-exe-dir选项设定这个值。
Mysql—Connect:这个函数用可选的用户名连接MySQL数据库。在安全模式下,用户名必须是当前被执行的脚本的所有者,或运行httpd的用户名(通常是nobody)。
HTTP Authentication:包含HTTP验证代码脚本所有者的用户ID(数字型)会自动加到验证域。这样可以防止有人通过抓取密码的程序来欺骗同一个服务器上的HTTP验证脚本。
2、使用 用户识别和验证
有时需要唯一地确认一个用户。用户通常由请求和响应系统确认。用户名/口令组合就是这种系统的一个很好的例子,比如系统要求给出A1i的口令,响应的是Ali的口令。这样验证是因为只有Ali才知道这个口令。
(1)服务器端用户验征
这是用于服务端上对PHP程序要求最小的验证方法。只要让Apache来管理对用户的验证就行了。
AuthName “Secret page” # The realm
AuthType Basic
# The password file has been placed outside the web tree
AuthUserFile /home/car2002/website.pw
require valid-user

你需要把上述文件(文件名为.htaccess)放在需要保护的地方。用Apache的htpasswd程序,可以建立包含用户名和口令组合的文件。把这个文件放在Web目录树之外,只让该文件的拥有者查看和修改这个文件。当然,Web服务器必须能够读取这个文件。
如果想读取被保护的目录,Web服务器要求浏览器提供用户名和密码。浏览器弹出对话框,用户可以输入他们的用户名和密码。如果用户名和密码与口令文件中相符合,就允许用户读取被保护的页面;反之,将得到错误页面,告诉用户没有通过验证。被保护的域会显示出来以便用户知道输入那个用户名和密码。
(2)在PHP中进行用户识别和验证
和在Apache服务器端进行用户识别和验证相比,在PHP进行用户识别和验证有以下优点:
A、可注销。
B、可失效。如用户登录后40分钟没有浏览你的网站,你可强制他们重新通过验证。
C、可定制。
D、可基于数据库。你可以用保存在各种各样的数据库里的数据来验证用户,并且记录访问者访问网站的详细日志。
E、可用于每个页面。你可在每个页面上决定是否需要验证。
F、你也可以使浏览器弹出对话框。下面的例子显示了怎样从,MySQL数据库中检索用名和口令:让用户填人用户名和口令。

Only users with a working username/password combination can see this
(3) 检测IP地址
一般人们普遍认为一个IP地址唯一地确定一个访问者。但实际上并不是这样的。代理服务器可用相同的IP地址发送不同用户的请求。另外IP地址的盗用也普遍存在。检测 IP地址有它们的用处,但相当有限。例如你是一个论坛版主,你发现某个用户粘贴一些不健康的、违法的内容。你可以找到他的IP地址,把从这个IP连进来的用户逐出论坛。使用下面一行命令将会得到某个特定请求的源IP地址:
# ip = $REMOTE_ADDR
4、使用PHP加密技术
在PHP中,加密技术主要用来加密信息、产生校验和和摘要。使用加密技术可大大地增强安全性能。 这里只讲述使用加密技术的一些概念。如果你想进一步了解,应参考一些好的加密技术资料。加密技术的标准是Bmce Schneier的应用加密技术,非常值得一读。他的网站(www.counterpane.com/labs.html )是在互联网上查找加密技术资料的好起点。数据加密是一个非常复杂的话题,这里只简单介绍一下。
PHP中大多数的加密函数由mcrypt库和mhash库提供。你需要在系统中装上这两个库,在编译时加上–ith-mcrypt和–ith-hash选项。PHP从 3.013版本开始支持mcrypt库。
5、使用具有SSL技术
SSI是英文Server Side Includes的缩写。使用具有SSL(安全套接字协议层)功能的web服务器,可以不用改变一行代码而提高网站的安全性能。SSI使用加密方法来保护web服务器和浏览器之间的信息流。SSL不仅用于加密在互联网上传递的数据流,而且还提供双方身份验证。这样,你就可以安全地在线购物而不必担心别人矢随你的信用卡的信息。这种特性使得SSL适用于那些交换重要信息的地方,像电子商务和基于Web的邮件。
SSL使用公共密钥加密技术,服务器在连接结束时给客户端发送公用密钥用来加密信息,而加密的信息只有服务器用它自己持有的专用密钥才能解开。客户端用公用密钥加密数据,并且发送给服务端自己的密钥,以唯一确定自己,防止在系统两端之间有人冒充服务端或客户端进行欺骗。
加密的HTTP连接用443端口号代替80端口号,以区别于普通的不加密的HTTP。客户端使用加密HTTP连接时会自动使用443端口而不是80端口。这使得服务端更容易作出相应的响应。
在Apache服务器下,可以通过直接编辑服务器配置文件或者在需要使用SSI的目录中创建.htaccess文件来启动SSI。登录到服务器,找到配置文件的存放目录,使用文字编辑器打开文件srm.conf,找到以下几行:
# If you want to use server side includes, or CGI outside
# ScriptAliased directories, uncomment the following lines.
#AddType text/x-server-parsed-html .shtml
#AddType application/x-httpd-CGI .CGI
将以AddType开头的两行并且去掉每一行最前面的”#”符号即可。保存所做的修改,然后再打开文件access.conf。
    <Directory /usr/local/etc/httpd/htdocs>
    # This may also be “None”, “All”, or any combination of “Indexes”,
    # “Includes”, or “FollowSymLinks”
    Options Indexes FollowSymLinks
    </Directory>
    将其中的Options Indexes FollowSymLinks改为:Options Indexes FollowSymLinks Includes 即可。
6、使用Apache的suEXEC机制
通常CGI程序或PHP脚本只能以启动web服务器的用户权限来运行(通常为www或nobody),这样会出现的情况之一是可以读写和修改由另一个用户的CGI和PHP脚本生成的文件(如脚本和密码文件)。也可能使用户可以连接到其他用户的数据库,但这与数据库的配置有关。如MySQL的默认配置便是允许的,但可以通过强制数据库进行口令验证来弥补此不足。PHP的safe—mode减少了这些问题,但所有的脚本仍然以相同的用户标识运行。Apache可以解决这个问题。suEXEC(在执行前改变用户标识)是一个小工具,允许以任意用户标识运行CGI程序,当然也包括PHP脚本,但根用户除外。而且可以和UseDir和VirtualHost项一起使用。
所以suEXEC也叫CGI封装。这意味着在脚本运行之前它需要通过一系列规定的安全检查。随Apache2。0版发布的suEXEC有26个检查点。suEXEC能解决一些安全问题,同时允许用户开发和更安全地执行自己的脚本。但是suEXEC会降低服务性能,因为suEXEC只能运行在CGI版本的PHP上,而CGI版本比模块版本运行速度慢。原因是模块版本使用了线程,而使用CGI版本的是进程。在不同线程之间的环境转换和访问公用的存储区域显然要比在不同的进程之间要快得多。使用suEXEC的另外一个问题是它增加了编写和使用PHP脚本的难度。你要确保脚本能通过suEXEC的检验。否则,你的脚本不会被执行。我们建议在你对安全性能要求比较高时使用suEXEC ,为此你还要以牺牲速度为代价。
7、创建安全的PHP脚本
有很多编程技巧使PHP脚本更安全地运行。其中最重要的一条是使用一些安全常识。运行PHP比运行CGI脚本更安全,但它仍然有许多出现错误的地方。转换到安全运行模式能够限制出错所产生的结果。如果你的PHP脚本中有错误,可能会被人找到并且利用它来破坏站点甚至数据库。所以经常备份也是必要的。
(1)安全设置软件
基于Web的应用程序,如在线目录,通常都在无人密切监视的情况下运行。如果发生错误时,你不可能立即采取行动。通常访问者最先注意到所发生的问题,你应该使他们很容易地报告所发生的问题。更进一步,可以由构成这个网站的脚本来跟踪这些问题。例如,你的访问者可能做一些你想不到的事情。也可能你对于重要函数所返回值没有检查,脚本可能会以不可预料的方式运行。
写出更加安全的程序,就可以避免这些问题。例如你应该检查数据库函数的返回值,如果数据库崩溃,显示给用户的应该是出错的信息页面而不是满屏幕的错误。你甚至可以让脚本在发生严重问题,如数据库崩溃、硬盘空间已满的时候自动通知你。你也应该检查从用户传来的所有数据。显然后者更重要。 如果你的程序能够应付各种错误,那么你的程序不仅更加可靠,而且可以花更少的时间来维护。这些时间可大大弥补你开发程序时所花的额外时间。
(2)存储和交换敏感信息
显然,你应尽量避免在互联网上以GET、POST、cookie或URL编码的形式传递敏感信息,这样使信息很容易被窃取。使用支持SSL的web服务器能够做到这一点,因为它加密站点和访问者浏览器之间所有的信息流。
如果你没有支持SSL的Web服务器,那么你需要其他的办法。比如没有必要总是发送数据到浏览器;把数据保存在数据库中,只向浏览器发送关键字,这样也很容易查找到所需要的数据;并以加密的形式发送所有的数据等等。实现这种功能的最简单的办法是使用Session。 PHP4支持本地化的Session功能,PHP3则要使用PHPMB库。
HTTP 协议是一种无状态协议,它不负责为好连接的状态信息,因此无法跟踪客户端的各种信息,Session的出现改变这一状况。当用户浏览一个支持Session功能的CGI脚本时,在他离开这个网页前可以将用户信息保存在同意Session ID之下,也就是可以在不同的网页之间偕同存取用户信息。
如果不使用PHP的安全模式或在suEXEC下以CGI方式运行PHP,那么监视你的文件的内容就不可能实现。此时唯一防止别人读取数据的方法是尽快把数据保存到数据库中。
(3)检查用户输入
Per1语言有个特性叫污点检测(taint checking)。当污点检测生效时,即使没有发生重大错误,你也不能运行含有可疑变量的函数。一个变量,当它的值是用户提供数据的一部分或全部时就变成可疑的了,因为这些数据被认为是不安全的。这样可提高系统安性。 PHP没有这个特性,但PHP有escapeshellcmd函数,可以达到同样的效果。另一个不让用户滥用脚本的方法是只允许使用经过严格检查的输入。
(4)使用最新的PHP版本 4.2.xx
在很长一段时间内,PHP作为服务器端脚本语言的最大卖点之一就是会为从表单提交的值自动建立一个全局变量。在PHP 4.1中,PHP的制作者们推荐了一个访问提交数据的替代手段。在PHP 4.2中,他们取消了那种老的做法。在PHP 4.1中,添加了一组特殊数据以访问外部数据。这些数组可以在任何范围内调用,这使得外部数据的访问更方便。在PHP 4.2中,register_globals被默认关闭以鼓励使用这些数组以避免无经验的开发者编写出不安全的PHP代码。作出这样的变化是出于安全性的考虑的。
三、总结
彻底安全的系统从理论上讲不可能,因此我们所指安全性只是在代价与可用性间作平衡。若是用户提交的每一个变量都要求有生物学验证(如指纹鉴定),则将获得极高水平的可靠性。但是也会造成用户填写一个表格就要几十分钟。这时用户就会采取绕过安全验证的方法。一个系统的可靠性只能由整个链条中最薄弱的环节来决定。在任何安全系统里面,人是最脆弱的连接,单单技术本身不能让系统安全。
PHP 还处在不断发展的过程中,你需要经常关注他的安全信息。这里笔者推荐你经常关注安全焦点(www.security-focus.com )和Packetstorm(www.packetstorm.com )。

十分钟快速架设Linux下的WebMail

目前,网上能找到不少WebMail软件,但多为商业软件,动辄支持百万级用户。它们虽然功能很强,但对一般单位来讲,有点儿“大材小用”。那么,能否找到这样一个WebMail:免费的、对中文支持较好、能够让用户既保留原有使用习惯又能通过Web界面收发邮件?
  Open WebMail由Perl编写,遵循GPL版权,可运行于多种版本Linux/Unix上,对系统要求低,只需拥有支持CGI的Web Server和Perl 5.005及以上版本即可,无需数据库支持,安装容易,维护方便。作为一个轻量级的Webmail软件,Open WebMail较好地实现了收发邮件的各项功能,完全能满足一般的应用。它对系统要求低,维护方便,非常适合在科研院所、大专院校中使用。笔者所在实验室(运行环境为:邮件服务器 DELL L667r,配置为PⅢ667MHz/128M/15GB,RedHat6.2/Apache 1.3.12/Perl 5.005_03,用户数120人左右)已使用它半年多,运行良好,得到了用户的认可。
  下面就以RedHat 6.2为例,介绍一下Open WebMail 的安装方法。我们假设所有软件存放于/tmp目录,所有操作以Root身份进行。
  1.准备工作
  从网站下载如下软件包:
  CGI.pm-2.74.tar.gz
  MIME-Base64-2.12.tar.gz
  Authen-PAM-0.12.tar.gz
  ispell-3.1.20.tar.gz
  hc-30.tar.gz
  以CGI.pm为例,安装方法如下:
  cd /tmp
  tar -zxvf CGI.pm-2.74.tar.gz
  cd CGI.pm-2.74
  perl Makefile.PL
  make
  make install
  其它软件包的安装类似。
  2.下载openwebmail-X.XX.tgz (其中X.XX为版本号,截至2001年11月的稳定版本为1.51),做如下操作:
  cd /home/httpd
  tar -zxvBpf /tmp/openwebmail- X.XX.tgz
  mv data/openwebmail html/
  rmdir data
  3.配置
  (1)在/home/httpd/cgi-bin/ openwebmail目录下修改 openwebmail.pl、openwebmail-main.pl、openwebmail-prefs.pl、spellcheck.pl和checkmail.pl,把其中的/usr/local/www/cgi-bin/ openwebmail改为/home/httpd/ cgi-bin/openwebmail 。
  (2)修改 auth_unix.pl
  把 设为 /etc/shadow
  把 设为 none
  (3)修改 /home/httpd/cgi-bin/ openwebmail/etc/openwebmail.conf,根据机器配置调整mailspooldir、ow_htmldir、ow_cgidir、spellcheck 等参数,并设定 Webmail 的缺省参数,如邮件夹限额、闲置时间、背景、缺省签名档等。
  (4)修改/etc/sendmail.cf,在Trusted users中加入Thttpd_user,其中httpd_user根据系统设置来定,如nobody或apache。
  4.测试:打开浏览器,输入 your_server/cgi-bin/openwebmail /openwebmail.pl 即可。
  至此,Open WebMail 安装完毕。在其它版本Linux上安装与此类似,请参照软件包中的说明文件。对于Linux的熟练用户,10分钟便可完成上述操作。

  Open WebMail的主界面

配置aspseek建立强大的企业级搜索引擎

建立搜索引擎
没有全文检索,企业内部的知识管理系统就不能成为成功的系统。构建一个类似 GOOGLE 的全文检索系统的是否要花费巨大呢?看看 Google 的搜索引擎软件目录吧。

我对其中的两个开放源码的搜索引擎进行了测试。htdig 是一个不错的搜索引擎软件,可惜不支持中文的检索;ASPseek 接着走入我的视线,这个软件对中文的支持非常之好,就连CGI的界面、CGI传递参数都和 GOOGLE 非常类似。

ASPseek 由三个部分组成:前端的 cgi 程序 s.cgi 提供查询界面和返回查询结果;后端的守护程序 searchd 接收cgi程序的查询请求,执行数据库查询,返回结果;后台数据库的维护则由程序 index 完成。

相关链接:

Google的搜索引擎软件目录

参见:http://dir.google.com/alpha/Top/ … net/Servers/Search/

另一个搜索引擎软件目录:

Search Tools for Web Sites and Intranets :http://www.searchtools.com/tools/tools.html

ASPseek 网站

ASPseek.org:http://www.aspseek.org/

ASPseek论坛

关于ASPseek的求助信息,可以访问ASPseek论坛:http://forum.aspseek.org/。

2.1. 安装 ASPSeek
ASPseek 安装过程比较简单,需要注意的是 ASPseek 的安装和运行需要先安装和配置 MySQL。下面是一般的安装过程(假设MySQL已经正确的安装在路径 /usr/local/mysql/ 下):

root>; tar zxvf aspseek-1.2.10.tar.gz
root>; cd aspseek-1.2.10
root>; ./configure –with-mysql=/usr/local/mysql –prefix=/usr/local/aspseek 
root>; make && make install
root>; /usr/local/aspseek/sbin/aspseek-mysql-postinstall 
root>; cp /usr/local/aspseek/bin/s.cgi ;/cgi-bin/ 
root>; useadd aspseek 
root>; su – aspseek
aspseek>; /usr/local/aspseek/sbin/index  
aspseek>; /usr/local/aspseek/sbin/searchd -D  

指出 mysql 的安装路径和设置 ASPseek 的安装路径

初始化 ASPseek 数据库设置。创建数据库 aspseek12,访问该数据库的用户名和口令保存在配置文件 /usr/local/aspseek/etc/db.conf 中

将cgi程序 s.cgi 程序拷贝到WEB服务器的cgi-bin目录中

为确保系统安全,创建用户 aspseek,并使用该用户的身份,进行数据索引的维护和启动搜索引擎服务程序

以 aspseek 用户的身份,进行数据索引的维护

以 aspseek 用户的身份,启动搜索引擎服务程序
2.2. 数据库维护
index 程序完成的功能包括网站爬虫、网页下载、解析、数据库维护。

2.2.1. 配置文件: aspseek.conf
aspseek.conf 是 index 程序的配置文件,告诉 index 程序为哪个网址建立索引,如果建立索引等等。

Include db.conf
UtfStorage yes
Include ucharset.conf
Period 1d
Server URL

包含 db.conf 配置文件,设置连接 MySQL 数据库的用户名、口令等。例如:DBAddr mysql://aspseek12ASSWOR-IS-HERE@localhost/aspseek12/

设定网页重建索引的间隔,作用域到下一个 Period 命令或者文件结尾。对作用域内的 Server 指定的网站有效,因此可以对不同的网站设置不同的更新频率

以 UTF-8 格式存储 MySQL 数据库中信息

配置字符集。若需要能够对中文进行检索,需要打开 CharsetTableU2 和 Dictionary2 的配置

最重要的设置。告诉 index 为哪些网站建立索引,可通过多个 Server 配置设置多个服务器。注意:如果在URL中包含路径并不能将索引限制在该目录下,仍然会对整个网站建立索引。如果想限制某些路径,使用 Disallow 配置,例如下面的配置将对网站的索引限制在 url: http://members.aol.com/midlandsda 下。Server http://www.aol.com/
Allow ^http://members.aol.com/midlandsda
Disallow ^http://www.aol.com/

2.2.2. 用 index 程序定期更新搜索引擎数据库

index -a

为所有网页重新建立索引。不使用该参数,则参考配置中的 Period 参数,只对早于这个时间的网页重建索引。

index -S

显示数据库的统计信息

通过 crontab 设置定时启动 index 重建检索

0 0 * * * su -c ‘/usr/local/aspseek/sbin/index’ aspseek 

注意要以 aspseek 用户身份执行。

2.3. searchd 后台数据库检索
searchd 是 ASPseek 的守护进程,用来接收 cgi 程序(s.cgi)的查询请求,执行查询动作(搜索由 index 程序创建的数据库),将结果反馈给 cgi 程序(s.cgi)。

2.3.1. searchd.conf
searchd 程序的配置文件。

# Port 12345
Include db.conf
UtfStorage yes
Include ucharset.conf

设置 searchd 侦听的端口。确省为 12345

包含 db.conf 配置文件,设置连接 MySQL 数据库的用户名、口令等。例如:DBAddr mysql://aspseek12ASSWOR-IS-HERE@localhost/aspseek12/

以 UTF-8 格式存储 MySQL 数据库中信息

配置字符集。若需要能够对中文进行检索,需要打开 CharsetTableU2 和 Dictionary2 的配置
2.3.2. 运行 searchd
配置开机自动执行 searchd。

#!/bin/sh
# FileName: /etc/rc.d/rc3.d/S99aspseek
# Script to control aspseek
#

case "$1" in
’start’)
        echo "starting aspseek server …  "
        su aspseek -c "/usr/local/aspseek/sbin/searchd -D -R"
        echo done
        ;;
’stop’)
        echo "stopping news server …  "
        killall -9 searchd
        echo done
        ;;
*)
        echo "usage: news.sh {start | stop}"
        ;;
esac

2.4. s.cgi: 具有类似GOOGLE查询界面的cgi程序
搜索引擎的界面是由 CGI 提供的。ASPseek 的CGI程序叫做 s.cgi,当然可以改成其它名字。配置则非常简单,除了要将 Apache 配置为支持 cgi 外,只需要将 s.cgi 从 /usr/local/aspseek/bin/ 目录下拷贝到 Apache 的 cgi-bin 目录下即可。配置 Apache 可能非常简单,也许一句 “ScriptAlias /cgi-bin/ /PATH/cgi-bin/” 就足够了。

我感打赌,s.cgi 一下子就会抓住你的眼球,因为 s.cgi 程序提供的一流的查询界面,和伟大的 Google 太类似了,尤其是那一排字母 “e”。

ASPseek 查询界面

s.cgi 还提供了定制界面的方案:只需要修改模板文件 /usr/local/aspseek/etc/s.htm 即可。下面是 s.htm 定制的示例(只显示重要的改动):

注意:如果将 s.cgi 改名,相应的模板也需要改名。例如 cgi 改名为 search.cgi,则相应的模板文件为 search.htm。

;
;
;
  ;  
  ; 
;ASPseek: $Q;
;
;
  ;  

; ; ; ; ; ; ;
;ASPseek;; ; 搜索 ; ; ;
;
; … … … …
; ; ;
;
; ;Free search engine software: ASPseek $AV;;
; ; ;

将cgi查询的输出界面(HTML)的语言编码设置为中文

引用外部的样式表文件,这样可以根据需要改变查询界面而尽量少的修改模板文件。一个简单的样式表示例:

p {font-size:9pt}
h1 {font-size:20pt;line-height:130%;font-weight:"bold";align:"center";}
td,li,select,input {font-size:9pt}
.sect1 {font-size:9pt;line-height:150%;color:#333333;background-color:#E1E1E1;font-weight:bolder;}
.datetime {font-size:9pt;color="red"}
.star  {font-size:9pt;color="red"}
.gray {font-size:9pt;color="gray"}
.cvskw {font-size:9pt}
.footer           {font-size:9pt;font-weight:bolder}
.footer A:link    {font-size:9pt;font-weight:bolder}
.footer A:active  {font-size:9pt;font-weight:bolder}
.footer A:visited {font-size:9pt;font-weight:bolder}
.footer A:hover   {font-size:9pt;font-weight:bolder}
A:link {color: #000000;}
A:visited {color: #000000;}
A:active,A:hover {color : #000000}
HTML BODY { LINE-HEIGHT: 1.2; MARGIN: 0 0 2em 0 }
UL { list-style-image: url("/images/dot.gif") }

.em           {font-size:"9pt";color="red";font-weight:"bolder";font-style:"normal";letter-spacing:"2px";}
.em A:link    {color: "red";letter-spacing:"4px";}
.em A:active  {color: "red";letter-spacing:"4px";}
.em A:visited {color: "red";letter-spacing:"4px";}
.em A:hover   {color: "red";letter-spacing:"4px";font-size:"12pt";}



引用外部 javascript,显示头部信息,避免过多对该模板的修改。一个 header.js 示例:;");
document.write("        ;");
document.write("              ;");
document.write("                ;");
document.write("            ;");
document.write("              ;");
document.write("            ;");
document.write("                
;

;;Johnson’s Homepage;

;
;"); document.write(" ;;"); document.write(" ;"); //–>; 通过设置cgi的cs字段,用以支持中文查询 q 是真正的查询字段。看看 GOOGLE 的查询网页,看看是不是非常类似? 引用外部 javascript,显示脚注信息,避免过多对该模板的修改。一个 footer.js 示例:;"); document.write(" ;"); document.write(" ;"); document.write("
;"); if ($str) document.write(";" + $str + ";
;"); document.write(" ;CopyLeft 2003, ;Johnson;;
;"); document.write(" ;"); document.write(" ;"); document.write(" ;"); } //–>;

2.5. ASPseek对中文的支持
中文、日文、韩文等多字节文字不同于英文等单字节语言,是多字节语言。我们都知道英文是依靠空格和标点符号将单词分割开,搜索引擎只要依据空格和标点就可以分割出词表。对一些检索意义不大的单词,则将这些词列在所谓 stopwords 词表(又称为 badwords中),如: “a, an, and, the, …”,避免因为对这些词建立检索而耗费过多的资源。这些 stopwords 保存在目录 /usr/local/aspseek/etc/stopwords/ 中。

而中文则不能造此办理,没有空格开区分词和词组,因此需要建立相应的词表。这些词表保存在目录 /usr/local/aspseek/etc/tables/ 中。

为能够对中文文档进行检索,需要检查是否在配置文件 aspseek.conf 和 searchd.conf 配置了 “CharsetTableU2” 和 “Dictionary2″选项。这两个选项是在配置文件 ucharset.conf 中定义的,用语句 “Include ucharset.conf” 包含入配置文件 aspseek.conf 和 searchd.conf。 ucharset.conf 中”CharsetTableU2″ 和 “Dictionary2″的配置如下:

########################################################################
# Unicode charset definition for multibyte charsets
# (please comment all not needed charsets):
# CharsetTableU2 ; ;

; [;]
#
CharsetTableU2 big5 ch tables/big5.txt
CharsetTableU2 gb2312 ch tables/gb2312.txt

########################################################################
# Dictionary for tokenizing of text in Chinese, Japanese and Korean languages
# Dictionary2 ; ; [;]
# If file encoding is omitted, then file is assumed to be in unicode
# Must be set after encoding definition (CharsetTableU2)
# ; parameter must match ; in CharsetTableU2 directive.
Dictionary2 ch tables/chinese.txt big5

正则表达式学习笔记

正则表达式(regular expression)描述了一种字符串匹配的模式,可以用来检查一个串是否含有某种子串、将匹配的子串做替换或者从某个串中取出符合某个条件的子串等。
  列目录时, dir *.txt或ls *.txt中的*.txt就不是一个正则表达式,因为这里*与正则式的*的含义是不同的。
  为便于理解和记忆,先从一些概念入手,所有特殊字符或字符组合有一个总表在后面,最后一些例子供理解相应的概念。
正则表达式

  是由普通字符(例如字符 a 到 z)以及特殊字符(称为元字符)组成的文字模式。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。
  可以通过在一对分隔符之间放入表达式模式的各种组件来构造一个正则表达式,即/expression/
普通字符

  由所有那些未显式指定为元字符的打印和非打印字符组成。这包括所有的大写和小写字母字符,所有数字,所有标点符号以及一些符号。
非打印字符

字符	含义
\cx	匹配由x指明的控制字符。例如, \cM 匹配一个 Control-M 或回车符。x 的值必须为 A-Z 或 a-z 之一。否则,将 c 视为一个原义的 'c' 字符。
\f	匹配一个换页符。等价于 \x0c 和 \cL。
\n	匹配一个换行符。等价于 \x0a 和 \cJ。
\r	匹配一个回车符。等价于 \x0d 和 \cM。
\s	匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。
\S	匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。
\t	匹配一个制表符。等价于 \x09 和 \cI。
\v	匹配一个垂直制表符。等价于 \x0b 和 \cK。
特殊字符

  所谓特殊字符,就是一些有特殊含义的字符,如上面说的"*.txt"中的*,简单的说就是表示任何字符串的意思。如果要查找文件名中有*的文件,则需要对*进行转义,即在其前加一个\。ls \*.txt。正则表达式有以下特殊字符。
特别字符	说明
$	匹配输入字符串的结尾位置。如果设置了 RegExp 对象的 Multiline 属性,则 $ 也匹配 '\n' 或 '\r'。要匹配 $ 字符本身,请使用 \$。
( )	标记一个子表达式的开始和结束位置。子表达式可以获取供以后使用。要匹配这些字符,请使用 \( 和 \)。
*	匹配前面的子表达式零次或多次。要匹配 * 字符,请使用 \*。
+	匹配前面的子表达式一次或多次。要匹配 + 字符,请使用 \+。
.	匹配除换行符 \n之外的任何单字符。要匹配 .,请使用 \。
[	标记一个中括号表达式的开始。要匹配 [,请使用 \[。
?	匹配前面的子表达式零次或一次,或指明一个非贪婪限定符。要匹配 ? 字符,请使用 \?。
\	将下一个字符标记为或特殊字符、或原义字符、或向后引用、或八进制转义符。例如, 'n' 匹配字符 'n'。'\n' 匹配换行符。序列 '\\' 匹配 "\",而 '\(' 则匹配 "("。
^	匹配输入字符串的开始位置,除非在方括号表达式中使用,此时它表示不接受该字符集合。要匹配 ^ 字符本身,请使用 \^。
{	标记限定符表达式的开始。要匹配 {,请使用 \{。
|	指明两项之间的一个选择。要匹配 |,请使用 \|。
  构造正则表达式的方法和创建数学表达式的方法一样。也就是用多种元字符与操作符将小的表达式结合在一起来创建更大的表达式。正则表达式的组件可以是单个的字符、字符集合、字符范围、字符间的选择或者所有这些组件的任意组合。
限定符

  限定符用来指定正则表达式的一个给定组件必须要出现多少次才能满足匹配。有*或+或?或{n}或{n,}或{n,m}共6种。
*、+和?限定符都是贪婪的,因为它们会尽可能多的匹配文字,只有在它们的后面加上一个?就可以实现非贪婪或最小匹配。
  正则表达式的限定符有:
字符	描述
*	匹配前面的子表达式零次或多次。例如,zo* 能匹配 "z" 以及 "zoo"。* 等价于{0,}。
+	匹配前面的子表达式一次或多次。例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等价于 {1,}。
?	匹配前面的子表达式零次或一次。例如,"do(es)?" 可以匹配 "do" 或 "does" 中的"do" 。? 等价于 {0,1}。
{n}	n 是一个非负整数。匹配确定的 n 次。例如,'o{2}' 不能匹配 "Bob" 中的 'o',但是能匹配 "food" 中的两个 o。
{n,}	n 是一个非负整数。至少匹配n 次。例如,'o{2,}' 不能匹配 "Bob" 中的 'o',但能匹配 "foooood" 中的所有 o。'o{1,}' 等价于 'o+'。'o{0,}' 则等价于 'o*'。
{n,m}	m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,"o{1,3}" 将匹配 "fooooood" 中的前三个 o。'o{0,1}' 等价于 'o?'。请注意在逗号和两个数之间不能有空格。
定位符

  用来描述字符串或单词的边界,^和$分别指字符串的开始与结束,\b描述单词的前或后边界,\B表示非单词边界。不能对定位符使用限定符。
选择

  用圆括号将所有选择项括起来,相邻的选择项之间用|分隔。但用圆括号会有一个副作用,是相关的匹配会被缓存,此时可用?:放在第一个选项前来消除这种副作用。
  其中?:是非捕获元之一,还有两个非捕获元是?=和?!,这两个还有更多的含义,前者为正向预查,在任何开始匹配圆括号内的正则表达式模式的位置来匹配搜索字符串,后者为负向预查,在任何开始不匹配该正则表达式模式的位置来匹配搜索字符串。
后向引用

  对一个正则表达式模式或部分模式两边添加圆括号将导致相关匹配存储到一个临时缓冲区中,所捕获的每个子匹配都按照在正则表达式模式中从左至右所遇到的内容存储。存储子匹配的缓冲区编号从 1 开始,连续编号直至最大 99 个子表达式。每个缓冲区都可以使用 '\n' 访问,其中 n 为一个标识特定缓冲区的一位或两位十进制数。
  可以使用非捕获元字符 '?:', '?=', or '?!' 来忽略对相关匹配的保存。
各种操作符的运算优先级

  相同优先级的从左到右进行运算,不同优先级的运算先高后低。各种操作符的优先级从高到低如下:
操作符	描述
\	转义符
(), (?:), (?=), []	圆括号和方括号
*, +, ?, {n}, {n,}, {n,m}	限定符
^, $, \anymetacharacter	位置和顺序
|	“或”操作
全部符号解释

字符	描述
\	将下一个字符标记为一个特殊字符、或一个原义字符、或一个 向后引用、或一个八进制转义符。例如,'n' 匹配字符 "n"。'\n' 匹配一个换行符。序列 '\\' 匹配 "\" 而 "\(" 则匹配 "("。
^	匹配输入字符串的开始位置。如果设置了 RegExp 对象的 Multiline 属性,^ 也匹配 '\n' 或 '\r' 之后的位置。
$	匹配输入字符串的结束位置。如果设置了RegExp 对象的 Multiline 属性,$ 也匹配 '\n' 或 '\r' 之前的位置。
*	匹配前面的子表达式零次或多次。例如,zo* 能匹配 "z" 以及 "zoo"。* 等价于{0,}。
+	匹配前面的子表达式一次或多次。例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等价于 {1,}。
?	匹配前面的子表达式零次或一次。例如,"do(es)?" 可以匹配 "do" 或 "does" 中的"do" 。? 等价于 {0,1}。
{n}	n 是一个非负整数。匹配确定的 n 次。例如,'o{2}' 不能匹配 "Bob" 中的 'o',但是能匹配 "food" 中的两个 o。
{n,}	n 是一个非负整数。至少匹配n 次。例如,'o{2,}' 不能匹配 "Bob" 中的 'o',但能匹配 "foooood" 中的所有 o。'o{1,}' 等价于 'o+'。'o{0,}' 则等价于 'o*'。
{n,m}	m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,"o{1,3}" 将匹配 "fooooood" 中的前三个 o。'o{0,1}' 等价于 'o?'。请注意在逗号和两个数之间不能有空格。
?	当该字符紧跟在任何一个其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串 "oooo",'o+?' 将匹配单个 "o",而 'o+' 将匹配所有 'o'。
.	匹配除 "\n" 之外的任何单个字符。要匹配包括 '\n' 在内的任何字符,请使用象 '[.\n]' 的模式。
(pattern)	匹配 pattern 并获取这一匹配。所获取的匹配可以从产生的 Matches 集合得到,在VBScript 中使用 SubMatches 集合,在JScript 中则使用 $0…$9 属性。要匹配圆括号字符,请使用 '\(' 或 '\)'。
(?:pattern)	匹配 pattern 但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。这在使用 "或" 字符 (|) 来组合一个模式的各个部分是很有用。例如, 'industr(?:y|ies) 就是一个比 'industry|industries' 更简略的表达式。
(?=pattern)	正向预查,在任何匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如,'Windows (?=95|98|NT|2000)' 能匹配 "Windows 2000" 中的 "Windows" ,但不能匹配 "Windows 3.1" 中的 "Windows"。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。
(?!pattern)	负向预查,在任何不匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如'Windows (?!95|98|NT|2000)' 能匹配 "Windows 3.1" 中的 "Windows",但不能匹配 "Windows 2000" 中的 "Windows"。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始
x|y	匹配 x 或 y。例如,'z|food' 能匹配 "z" 或 "food"。'(z|f)ood' 则匹配 "zood" 或 "food"。
[xyz]	字符集合。匹配所包含的任意一个字符。例如, '[abc]' 可以匹配 "plain" 中的 'a'。
[^xyz]	负值字符集合。匹配未包含的任意字符。例如, '[^abc]' 可以匹配 "plain" 中的'p'。
[a-z]	字符范围。匹配指定范围内的任意字符。例如,'[a-z]' 可以匹配 'a' 到 'z' 范围内的任意小写字母字符。
[^a-z]	负值字符范围。匹配任何不在指定范围内的任意字符。例如,'[^a-z]' 可以匹配任何不在 'a' 到 'z' 范围内的任意字符。
\b	匹配一个单词边界,也就是指单词和空格间的位置。例如, 'er\b' 可以匹配"never" 中的 'er',但不能匹配 "verb" 中的 'er'。
\B	匹配非单词边界。'er\B' 能匹配 "verb" 中的 'er',但不能匹配 "never" 中的 'er'。
\cx	匹配由 x 指明的控制字符。例如, \cM 匹配一个 Control-M 或回车符。x 的值必须为 A-Z 或 a-z 之一。否则,将 c 视为一个原义的 'c' 字符。
\d	匹配一个数字字符。等价于 [0-9]。
\D	匹配一个非数字字符。等价于 [^0-9]。
\f	匹配一个换页符。等价于 \x0c 和 \cL。
\n	匹配一个换行符。等价于 \x0a 和 \cJ。
\r	匹配一个回车符。等价于 \x0d 和 \cM。
\s	匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。
\S	匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。
\t	匹配一个制表符。等价于 \x09 和 \cI。
\v	匹配一个垂直制表符。等价于 \x0b 和 \cK。
\w	匹配包括下划线的任何单词字符。等价于'[A-Za-z0-9_]'。
\W	匹配任何非单词字符。等价于 '[^A-Za-z0-9_]'。
\xn	匹配 n,其中 n 为十六进制转义值。十六进制转义值必须为确定的两个数字长。例如,'\x41' 匹配 "A"。'\x041' 则等价于 '\x04' & "1"。正则表达式中可以使用 ASCII 编码。.
\num	匹配 num,其中 num 是一个正整数。对所获取的匹配的引用。例如,'(.)\1' 匹配两个连续的相同字符。
\n	标识一个八进制转义值或一个向后引用。如果 \n 之前至少 n 个获取的子表达式,则 n 为向后引用。否则,如果 n 为八进制数字 (0-7),则 n 为一个八进制转义值。
\nm	标识一个八进制转义值或一个向后引用。如果 \nm 之前至少有 nm 个获得子表达式,则 nm 为向后引用。如果 \nm 之前至少有 n 个获取,则 n 为一个后跟文字 m 的向后引用。如果前面的条件都不满足,若 n 和 m 均为八进制数字 (0-7),则 \nm 将匹配八进制转义值 nm。
\nml	如果 n 为八进制数字 (0-3),且 m 和 l 均为八进制数字 (0-7),则匹配八进制转义值 nml。
\un	匹配 n,其中 n 是一个用四个十六进制数字表示的 Unicode 字符。例如, \u00A9 匹配版权符号 (?)。
部分例子

正则表达式	说明
/\b([a-z]+) \1\b/gi	一个单词连续出现的位置
/(\w+):\/\/([^/:]+)(:\d*)?([^# ]*)/	将一个URL解析为协议、域、端口及相对路径
/^(?:Chapter|Section) [1-9][0-9]{0,1}$/	定位章节的位置
/[-a-z]/	A至z共26个字母再加一个-号。
/ter\b/	可匹配chapter,而不能terminal
/\Bapt/	可匹配chapter,而不能aptitude
/Windows(?=95 |98 |NT )/	可匹配Windows95或Windows98或WindowsNT,当找到一个匹配后,从Windows后面开始进行下一次的检索匹配。

参考文献:
正则表达式
http://www.soulogic.com/code/doc/RegularExpressions/

阿新FreeBSD服务器安装流程

如果简单安装一个web服务器 FreeBSD 安装是非常傻瓜和友好的

1,安装系统

我的分区 120G为例

256M /
2048M swap (1G内存)
10240M /var
4096M /usr
1024M /home
1025M /tmp
剩下的 /pub
实验证明 这种分区目前美掉过数据

选择MINI安装,FreeBSD安装可能是所有系统中最快的,大概 4-5分钟

2,系通更新

cvsup down回来最新的源代码

cd /usr/src
make buildworld
修改内核
make buildkernel KERNCONF=NEWKERNEL
make installkernel KERNCONF=NEWKERNEL
make installworld
mergemaster -cv
输入 i 安装新的

reboot

正常启动 系统更新ok

这是个漫长的过程,这段时间我一般都在CS

3,安装应用程序

cvsup down回最新的ports库

1,perl

cd /usr/ports/lang/perl5.8
make install clean

2,apache

cd /usr/ports/lang/apache13-modssl
make APACHE_HARD_SERVER_LIMIT=1024 install clean
APACHE_HARD_SERVER_LIMIT=1024 apache最大连接数

3,mysql

cd /usr/ports/databases/mysql40-server

make WITH_CHARSET=gbk WITH_XCHARSET=all WITH_OPENSSL=yes WITH_PROC_SCOPE_PTH=yes BUILD_OPTIMIZED=yes install clean

进站了 在火车上再写

继续

4.php

cd /usr/ports/www/mod_php4

make install clean

5, perl

cd /usr/ports/www/mod_perl

make install clean

apache很多模块都可以在这里面安装

6,现在php的模块分离出来了,要另外安装

cd /usr/ports/lang/php4-extensions

make install clean

当中可以选择php模块,选的越多编译安装的时间越长,完全专家级的php安装

7,zend

cd /usr/ports/devel/ZendOptimizer

make install clean

ok搞定,简单吧

耗时大概 6个小时

用ports安装的好处:

1,简单

2,ports编译的安全

3,最重要的 升级非常简单
cd /usr/ports/sysutils/portupgrade
make install clean
安装他

运行 portupgrade -ar 全部自动下载升级所有安装的东东为最新版本,包扣各种补丁也上了

FreeBSD就是这么强大