测试与质量的关系 测试有助于提高软件的质量,但是提高软件的质量不能依赖于测试。测试与质量的关系很象在考试中“检查”与“成绩”的关系。 学习好的学生,在考试时通过认真检查能减少因疏忽而造成的答题错误,从而“提高”了考试成绩(取得他本来就该得的好成绩)。 而学习差的学生,他原本就不会做题目,无论检查多么细心,也不能提高成绩。 所以说,软件的高质量是设计出来的,而不是靠测试修补出来的。 I love U software testing

发布新日志

  • Cookies工具使用和php中Cookie及其使用

    2008-03-25 14:55:12

    现在很多网站都用到Cookies,特别是用户的登陆以及购物网站的购物车。 Cookies 通常用来存储用户信息和用户在某应用系统的操作,当一个用户使用Cookies 访问了某一个应用系统时,Web 服务器将发送关于用户的信息,把该信息以Cookies 的形式存储在客户端计算机上,这可用来创建动态和自定义页面或者存储登陆等信息。
    如果 Web 应用系统使用了Cookies ,就必须检查Cookies 是否能正常工 作测 试的内容包括Cookies是否起作用,存储的内容是否正确,是否按预定的时间进行保存,刷新对Cookies 有什么影响等。

    http://ccc.atmos.colostate.edu/~hail/howto/faq/coo...

    如果到\Local Settings\Temporary Internet Files文件夹下查看每个Cookies文件是一件很麻烦的事情,这个时候就需要有工具来帮助我们。

    1、Cookie Editor

    http://www.proxoft.com/CookieEditor.asp

    Cookie Editor is an application that helps you manage cookies set by Internet Explorer, Netscape or Mozilla Browsers.

    Cookie Editor allows you to maintain the level of your privacy by allowing you to see, edit or delete any unwanted cookies. It searches your drives for all IE cookies then displays them is easy grid-like format. You can examine content of any cookie or delete it.

    For advanced users, you can also edit the contents of cookies. So, for example, if you want to change your zip code for'movies.yahoo.com', or move up the expiration date of a given cookie, you could do so without even opening your browser!

    比较大的特点是可以显示出IE,Netscape和Firefox的Cookie;因为Netscape和Firefox的 Cookie不是存储在Temporary Internet Files文件夹下的,而是在Application Data文件夹下的对应文件夹里。

    2、IECookiesView

    http://www.nirsoft.net/utils/iecookies.html

    一 个可以帮你搜寻并显示出你计算机中所有的Cookies档案的数据,包括是哪一个网站写入Cookies的,内容有什么,写入的时间日期及此 Cookies的有效期限..等等资料。你是否常常怀疑一些网站写入Cookies内容到你的计算机中是否会对你造成隐私的侵犯!使用软件来看看这些 Cookies的内容都是些什么呢!如此你就不会再担心怀疑了。此软件只对IE浏览器的Cookies有效。

    3、Cookies Manager

    http://home.nordnet.fr/~pmdevigne/CookiesManager_e...

    Cookies Manager helps you to select which cookies you want to keep and which cookies you want to delete.

    4、My Cookie

    My Cookie是一款可以实时查看、修改IE内 Cookied的软件。并且可以设 置 Cookie值的生命周期。

    Cookie技术是一个非常有争议的技术,自经诞生它就成了广大网络用户和Web开发人员的
    一个争论焦点。有一些网络用户,甚至包括一些资深的Web专家也对它的产生和推广感到不满,这倒不是因为
    Cookie技术的功能太弱或别的技术性能上的原因,而仅仅是因为他们觉得Cookie 的使用,对网络用户的隐私
    构成了危害。因为Cookie是由Web服务器保存在用户浏览器上的小文本文件,它包含有关用户的信息(如身份
    识别号码、密码、用户在Web站点上购物的方式或用户访问该站点的次数)。 

      那么Cookie 技术究竟怎样呢?是否真的给网络用户带来了个人隐私的危害呢?还是让我们看了下面的内
    容,再做回答吧。 

      (1)Cookie技术简介 

       在WEB技术发展史上,Cookie技术的出现是一个重大的变革。最先是Netscape在它的Netscape Navigator
    浏览器中引入了Cookie技术,从那时起,World Wide Web 协会就开始支持Cookie标准。以后又经过微软的大
    力推广(因为微软的IIS Web服务器所采用的ASP技术很大程度的使用了Cookie技术),即在微软的Internet
    Explorer浏览器中完全支持Cookie技术。到现在,绝大多数的浏览器都支持Cookie技术,或者至少兼容Cookie
    技术的使用。 

      1)什么是Cookie? 

      按照Netscape官方文档中的定义,Cookie是在HTTP协议下,服务器或脚本可以维护客户工作站上信息的
    一种方式。Cookie 是由Web服务器保存在用户浏览器上的小文本文件,它可以包含有关用户的信息(如身份
    识别号码、密码、用户在Web站点购物的方式或用户访问该站点的次数)。无论何时用户链接到服务器,Web
    站点都可以访问Cookie信息。 

      通俗地讲,浏览器用一个或多个限定的文件来支持Cookie。这些文件在使用Windows操作系统的机器上叫
    做Cookie 文件,在Macintosh机器上叫做magic Cookie 文件,这些文件被网站用来在上面存储Cookie数据。
    网站可以在这些Cookie 文件中插入信息,这样对有些网络用户就有些副作用。有些用户认为这造成了对个人
    隐私的侵犯,更糟的是,有些人认为Cookie是对个人空间的侵占,而且会对用户的计算机带来安全性的危害。 

      目前有些Cookie 是临时的,另一些则是持续的。临时的Cookie只在浏览器上保存一段规定的时间,一旦
    超过规定的时间该Cookie就会被系统清除。例如在PHP中Cookie被用来跟踪用户进程直到用户离开网站。持续
    的Cookie则保存在用户的Cookie文件中,下一次用户返回时,仍然可以对它进行调用。 

      在Cookie文件中保存Cookie,一些用户会过分地认为这将带来很大的问题。主要是有些用户担心Cookie
    会跟踪用户网上冲浪的习惯,譬如用户喜爱到那些类型的站点、爱从事些什么活动等。害怕这种个人信息一
    旦落入一些别有用心的家伙手中,那么个人也就可能成为一大堆广告垃圾的对象,甚至遭到意外的损害。不
    过,这种担心压根儿不会发生,因为网站以外的用户是无法跨过网站来获得Cookie信息的。所以想以这种目
    的来应用Cookie是不可能的。不过,由于一些用户错误的理解以及“以讹传讹”,一些浏览器开发商别无选
    择,只好作出相识的响应(例如Netscape Navigator4.0和Internet Explorer3.0都提供了屏蔽Cookie 的选
    项)。 

      对Cookie技术期待了这么久的结果是,迫使许多浏览器开发商在它们的浏览器中提供了对Cookie的灵活
    性控制功能。例如,目前的两大主流浏览器Netscape Navigator 和 Internet Explorer是这样处理Cookie
    的:Netscape Navigator4.0不但可以接受Cookie进行警告,而且还可以屏蔽掉Cookie;InternetExplorer3.0
    也可以屏蔽Cookie,但在Internet Explorer4.0中就只能进行接受警告而没有提供屏蔽选项,不过在Internet
    Explorer4.0之后的更新版本中又加入了屏蔽Cookie的功能选项。 

      此外,很多最新的技术甚至已经可以在不能屏蔽Cookie的浏览器上进行Cookie的屏蔽了。例如,可以通
    过将Cookie文件设置成不同的类型来限制Cookie的使用。但是,非常不幸地是,要是你想完全屏蔽Cookie的
    话,肯定会因此拒绝许多的站点页面。因为当今已经有许多Web站点开发人员爱上了Cookie技术的强大功能,
    例如Session对象的使用就离不开Cookie的支持。 

      尽管今天仍有一些网络用户对于Cookie的争论乐此不倦,但是对于绝大多数的网络用户来说还是倾向于
    接受Cookie的。因此,我们尽可以放心地使用Cookie技术来开发我们的WEB页面。 

      2)Cookie是怎样工作的? 

      要了解Cookie,必不可少地要知道它的工作原理。一般来说,Cookie通过HTTP Headers从服务器端返回
    到浏览器上。首先,服务器端在响应中利用Set-Cookie header来创建一个Cookie ,然后,浏览器在它的请
    求中通过Cookie header包含这个已经创建的Cookie,并且反它返回至服务器,从而完成浏览器的论证。 

      例如,我们创建了一个名字为login的Cookie来包含访问者的信息,创建Cookie时,服务器端的Header 
    如下面所示,这里假设访问者的注册名是“Michael Jordan”,同时还对所创建的Cookie的属性如path、
    domain、expires等进行了指定。 

      Set-Cookie:login=Michael Jordan;path=/;domain=msn.com; 
      expires=Monday,01-Mar-99 00:00:01 GMT 

      上面这个Header会自动在浏览器端计算机的Cookie文件中添加一条记录。浏览器将变量名为“login”
    的Cookie赋值为“Michael Jordon”。注意,在实际传递过程中这个Cookie的值是经过了URLEncode方法的
    URL编码操作的。 这个含有Cookie值的HTTP Header被保存到浏览器的Cookie文件后,Header就通知浏览器
    将Cookie通过请求以忽略路径的方式返回到服务器,完成浏览器的认证操作。 

      此外,我们使用了Cookie的一些属性来限定该Cookie的使用。例如Domain属性能够在浏览器端对Cookie
    发送进行限定,具体到上面的例子,该Cookie只能传达室到指定的服务器上,而决不会跑到其他的如
    www.hp.com的Web站点上去。Expires属性则指定了该Cookie保存的时间期限,例如上面的Cookie在浏览器上
    只保存到1999年3月1日1秒。当然,如果浏览器上Cookie 太多,超过了系统所允许的范围,浏览器将自动对
    它进行删除。至于属性Path,用来指定Cookie将被发送到服务器的哪一个目录路径下。 

      说明:浏览器创建了一个Cookie后,对于每一个针对该网站的请求,都会在Header中带着这个Cookie;
    不过,对于其他网站的请求Cookie是绝对不会跟着发送的。而且浏览器会这样一直发送,直到Cookie过期为止。 

      上一部分讲了有关Cookie的技术背景,这部分来说说在PHP里如何设置、使用、删除Cookie,及Cookie
    的一些限制。PHP对Cookie支持是透明的,用起来非常方便。 

      1、设置Cookie

      PHP用SetCookie函数来设置Cookie。必须注意的一点是:Cookie是HTTP协议头的一部分,用于浏览器和
    服务器之间传递信息,所以必须在任何属于HTML文件本身的内容输出之前调用Cookie函数。SetCookie 函数
    定义了一个Cookie,并且把它附加在HTTP头的后面,SetCookie函数的原型如下:

    int SetCookie(string name, string value, int expire, string path, string domain, int secure); 

      除了name之外所有的参数都是可选的。value,path,domain 三个参数可以用空字符串代换,表示没有设
    置;expire和 secure两个参数是数值型的,可以用0表示。expire参数是一个标准的Unix时间标记,可以用
    time()或mktime() 函数取得,以秒为单位。secure参数表示这个Cookie是否通过加密的HTTPS协议在网络上
    传输。 

      当前设置的Cookie 不是立即生效的,而是要等到下一个页面时才能看到.这是由于在设置的这个页面里
    Cookie由服务器传递给客户浏览器,在下一个页面浏览器才能把Cookie从客户的机器里取出传回服务器的原
    因。在同一个页面设置Cookie,实际是从后往前,所以如果要在插入一个新的Cookie之前删掉一个,你必须
    先写插入的语句,再写删除的语句,否则可能会出现不希望的结果。 

      来看几个例子:

      简单的:

    SetCookie("MyCookie", "Value of MyCookie"); 

      带失效时间的: 

    SetCookie("WithExpire", "Expire in 1 hour", time()+3600);//3600秒=1小时 

      什么都有的: 

    SetCookie("FullCookie", "Full cookie value", time()+3600, "/forum", ".phpuser.com", 1); 

      这里还有一点要说明的,比如你的站点有几个不同的目录,那么如果只用不带路径的Cookie的话,在一
    个目录下的页面里设的Cookie在另一个目录的页面里是看不到的,也就是说,Cookie是面向路径的。实际上,
    即使没有指定路径,WEB 服务器会自动传递当前的路径给浏览器的,指定路径会强制服务器使用设置的路径。
    解决这个问题的办法是在调用SetCookie时加上路径和域名域名的格式可以是“www.phpuser.com”,也可
    是“.phpuser.com”。 

      SetCookie函数里表示value的部分,在传递时会自动被encode,也就是说,如果value的值是“test 
    value”在传递时就变成了“test%20value”,跟URL的方法一样。当然,对于程序来说这是透明的,因为在
    PHP接收Cookie的值时会自动将其decode。 

      如果要设置同名的多个Cookie,要用数组,方法是: 

    SetCookie("CookieArray[]", "Value 1"); 
    SetCookie("CookieArray[]", "Value 2"); 

      或 

    SetCookie("CookieArray[0]", "Value 1"); 
    SetCookie("CookieArray[1]", "Value 2"); 

      2、接收和处理Cookie 

      PHP对Cookie的接收和处理的支持非常好,是完全自动的,跟FORM变量的原则一样,特别简单。比如设
    置一个名为MyCookier的Cookie,PHP会自动从WEB服务器接收的HTTP头里把它分析出来,并形成一个与普通
    变量一样的变量,名为$myCookie,这个变量的值就是Cookie的值。数组同样适用。另外一个办法是引用PHP
    的全局变量$HTTP_COOKIE_VARS数组。 

      分别举例如下:(假设这些都在以前的页面里设置过了,并且仍然有效) 

    echo $MyCookie; 
    echo $CookieArray[0]; 
    echo count($CookieArray); 
    echo $HTTP_COOKIE_VARS["MyCookie"]; 

      就这么简单。 

      3、删除Cookie 

      要删除一个已经存在的Cookie,有两个办法: 

      一是调用只带有name参数的SetCookie,那么名为这个name的Cookie 将被从关系户机上删掉;另一个办
    法是设置Cookie的失效时间为time()或time()-1,那么这个Cookie在这个页面的浏览完之后就被删除了(其
    实是失效了)。 

      要注意的是,当一个Cookie被删除时,它的值在当前页在仍然有效的。 

      4、使用Cookie的限制 

      首先是必须在HTML文件的内容输出之前设置; 
      其次不同的浏览器对Cookie的处理不一致,且有时会出现错误的结果。比如:MS IE+SERVICE PACK 1
    不能正确处理带域名和路径的Cookie ,Netscape Communicator 4.05和MS IE 3.0不能正确处理不带路径和
    时间的Cookie。至于MS IE 5 好象不能处理带域名、路径和时间的Cookie。这是我在设计本站的页面时发现
    的。 
      第三个限制是在客户端的。一个浏览器能创建的Cookie数量最多为30个,并且每个不能超过4KB,每个WEB
    站点能设置的Cookie总数不能超过20个。 

      关于Cookie的话题,就说到这儿了。 

      (由于Cookie最初由Netscape定义的,所以附上Netscape公司关于Cookie的官方原始定义的网址:
    _spec.html" target=_blank>
    http://www.netscape.com/newsref/std/cookie_spec.html

    Cookie技术是一个非常有争议的技术,自经诞生它就成了广大网络用户和Web开发人员的
    一个争论焦点。有一些网络用户,甚至包括一些资深的Web专家也对它的产生和推广感到不满,这倒不是因为
    Cookie技术的功能太弱或别的技术性能上的原因,而仅仅是因为他们觉得Cookie 的使用,对网络用户的隐私
    构成了危害。因为Cookie是由Web服务器保存在用户浏览器上的小文本文件,它包含有关用户的信息(如身份
    识别号码、密码、用户在Web站点上购物的方式或用户访问该站点的次数)。 

      那么Cookie 技术究竟怎样呢?是否真的给网络用户带来了个人隐私的危害呢?还是让我们看了下面的内
    容,再做回答吧。 

      (1)Cookie技术简介 

       在WEB技术发展史上,Cookie技术的出现是一个重大的变革。最先是Netscape在它的Netscape Navigator
    浏览器中引入了Cookie技术,从那时起,World Wide Web 协会就开始支持Cookie标准。以后又经过微软的大
    力推广(因为微软的IIS Web服务器所采用的ASP技术很大程度的使用了Cookie技术),即在微软的Internet
    Explorer浏览器中完全支持Cookie技术。到现在,绝大多数的浏览器都支持Cookie技术,或者至少兼容Cookie
    技术的使用。 

      1)什么是Cookie? 

      按照Netscape官方文档中的定义,Cookie是在HTTP协议下,服务器或脚本可以维护客户工作站上信息的
    一种方式。Cookie 是由Web服务器保存在用户浏览器上的小文本文件,它可以包含有关用户的信息(如身份
    识别号码、密码、用户在Web站点购物的方式或用户访问该站点的次数)。无论何时用户链接到服务器,Web
    站点都可以访问Cookie信息。 

      通俗地讲,浏览器用一个或多个限定的文件来支持Cookie。这些文件在使用Windows操作系统的机器上叫
    做Cookie 文件,在Macintosh机器上叫做magic Cookie 文件,这些文件被网站用来在上面存储Cookie数据。
    网站可以在这些Cookie 文件中插入信息,这样对有些网络用户就有些副作用。有些用户认为这造成了对个人
    隐私的侵犯,更糟的是,有些人认为Cookie是对个人空间的侵占,而且会对用户的计算机带来安全性的危害。 

      目前有些Cookie 是临时的,另一些则是持续的。临时的Cookie只在浏览器上保存一段规定的时间,一旦
    超过规定的时间该Cookie就会被系统清除。例如在PHP中Cookie被用来跟踪用户进程直到用户离开网站。持续
    的Cookie则保存在用户的Cookie文件中,下一次用户返回时,仍然可以对它进行调用。 

      在Cookie文件中保存Cookie,一些用户会过分地认为这将带来很大的问题。主要是有些用户担心Cookie
    会跟踪用户网上冲浪的习惯,譬如用户喜爱到那些类型的站点、爱从事些什么活动等。害怕这种个人信息一
    旦落入一些别有用心的家伙手中,那么个人也就可能成为一大堆广告垃圾的对象,甚至遭到意外的损害。不
    过,这种担心压根儿不会发生,因为网站以外的用户是无法跨过网站来获得Cookie信息的。所以想以这种目
    的来应用Cookie是不可能的。不过,由于一些用户错误的理解以及“以讹传讹”,一些浏览器开发商别无选
    择,只好作出相识的响应(例如Netscape Navigator4.0和Internet Explorer3.0都提供了屏蔽Cookie 的选
    项)。 

      对Cookie技术期待了这么久的结果是,迫使许多浏览器开发商在它们的浏览器中提供了对Cookie的灵活
    性控制功能。例如,目前的两大主流浏览器Netscape Navigator 和 Internet Explorer是这样处理Cookie
    的:Netscape Navigator4.0不但可以接受Cookie进行警告,而且还可以屏蔽掉Cookie;InternetExplorer3.0
    也可以屏蔽Cookie,但在Internet Explorer4.0中就只能进行接受警告而没有提供屏蔽选项,不过在Internet
    Explorer4.0之后的更新版本中又加入了屏蔽Cookie的功能选项。 

      此外,很多最新的技术甚至已经可以在不能屏蔽Cookie的浏览器上进行Cookie的屏蔽了。例如,可以通
    过将Cookie文件设置成不同的类型来限制Cookie的使用。但是,非常不幸地是,要是你想完全屏蔽Cookie的
    话,肯定会因此拒绝许多的站点页面。因为当今已经有许多Web站点开发人员爱上了Cookie技术的强大功能,
    例如Session对象的使用就离不开Cookie的支持。 

      尽管今天仍有一些网络用户对于Cookie的争论乐此不倦,但是对于绝大多数的网络用户来说还是倾向于
    接受Cookie的。因此,我们尽可以放心地使用Cookie技术来开发我们的WEB页面。 

      2)Cookie是怎样工作的? 

      要了解Cookie,必不可少地要知道它的工作原理。一般来说,Cookie通过HTTP Headers从服务器端返回
    到浏览器上。首先,服务器端在响应中利用Set-Cookie header来创建一个Cookie ,然后,浏览器在它的请
    求中通过Cookie header包含这个已经创建的Cookie,并且反它返回至服务器,从而完成浏览器的论证。 

      例如,我们创建了一个名字为login的Cookie来包含访问者的信息,创建Cookie时,服务器端的Header 
    如下面所示,这里假设访问者的注册名是“Michael Jordan”,同时还对所创建的Cookie的属性如path、
    domain、expires等进行了指定。 

      Set-Cookie:login=Michael Jordan;path=/;domain=msn.com; 
      expires=Monday,01-Mar-99 00:00:01 GMT 

      上面这个Header会自动在浏览器端计算机的Cookie文件中添加一条记录。浏览器将变量名为“login”
    的Cookie赋值为“Michael Jordon”。注意,在实际传递过程中这个Cookie的值是经过了URLEncode方法的
    URL编码操作的。 这个含有Cookie值的HTTP Header被保存到浏览器的Cookie文件后,Header就通知浏览器
    将Cookie通过请求以忽略路径的方式返回到服务器,完成浏览器的认证操作。 

      此外,我们使用了Cookie的一些属性来限定该Cookie的使用。例如Domain属性能够在浏览器端对Cookie
    发送进行限定,具体到上面的例子,该Cookie只能传达室到指定的服务器上,而决不会跑到其他的如
    www.hp.com的Web站点上去。Expires属性则指定了该Cookie保存的时间期限,例如上面的Cookie在浏览器上
    只保存到1999年3月1日1秒。当然,如果浏览器上Cookie 太多,超过了系统所允许的范围,浏览器将自动对
    它进行删除。至于属性Path,用来指定Cookie将被发送到服务器的哪一个目录路径下。 

      说明:浏览器创建了一个Cookie后,对于每一个针对该网站的请求,都会在Header中带着这个Cookie;
    不过,对于其他网站的请求Cookie是绝对不会跟着发送的。而且浏览器会这样一直发送,直到Cookie过期为止。 

      上一部分讲了有关Cookie的技术背景,这部分来说说在PHP里如何设置、使用、删除Cookie,及Cookie
    的一些限制。PHP对Cookie支持是透明的,用起来非常方便。 

      1、设置Cookie

      PHP用SetCookie函数来设置Cookie。必须注意的一点是:Cookie是HTTP协议头的一部分,用于浏览器和
    服务器之间传递信息,所以必须在任何属于HTML文件本身的内容输出之前调用Cookie函数。SetCookie 函数
    定义了一个Cookie,并且把它附加在HTTP头的后面,SetCookie函数的原型如下:

    int SetCookie(string name, string value, int expire, string path, string domain, int secure); 

      除了name之外所有的参数都是可选的。value,path,domain 三个参数可以用空字符串代换,表示没有设
    置;expire和 secure两个参数是数值型的,可以用0表示。expire参数是一个标准的Unix时间标记,可以用
    time()或mktime() 函数取得,以秒为单位。secure参数表示这个Cookie是否通过加密的HTTPS协议在网络上
    传输。 

      当前设置的Cookie 不是立即生效的,而是要等到下一个页面时才能看到.这是由于在设置的这个页面里
    Cookie由服务器传递给客户浏览器,在下一个页面浏览器才能把Cookie从客户的机器里取出传回服务器的原
    因。在同一个页面设置Cookie,实际是从后往前,所以如果要在插入一个新的Cookie之前删掉一个,你必须
    先写插入的语句,再写删除的语句,否则可能会出现不希望的结果。 

      来看几个例子:

      简单的:

    SetCookie("MyCookie", "Value of MyCookie"); 

      带失效时间的: 

    SetCookie("WithExpire", "Expire in 1 hour", time()+3600);//3600秒=1小时 

      什么都有的: 

    SetCookie("FullCookie", "Full cookie value", time()+3600, "/forum", ".phpuser.com", 1); 

      这里还有一点要说明的,比如你的站点有几个不同的目录,那么如果只用不带路径的Cookie的话,在一
    个目录下的页面里设的Cookie在另一个目录的页面里是看不到的,也就是说,Cookie是面向路径的。实际上,
    即使没有指定路径,WEB 服务器会自动传递当前的路径给浏览器的,指定路径会强制服务器使用设置的路径。
    解决这个问题的办法是在调用SetCookie时加上路径和域名域名的格式可以是“www.phpuser.com”,也可
    是“.phpuser.com”。 

      SetCookie函数里表示value的部分,在传递时会自动被encode,也就是说,如果value的值是“test 
    value”在传递时就变成了“test%20value”,跟URL的方法一样。当然,对于程序来说这是透明的,因为在
    PHP接收Cookie的值时会自动将其decode。 

      如果要设置同名的多个Cookie,要用数组,方法是: 

    SetCookie("CookieArray[]", "Value 1"); 
    SetCookie("CookieArray[]", "Value 2"); 

      或 

    SetCookie("CookieArray[0]", "Value 1"); 
    SetCookie("CookieArray[1]", "Value 2"); 

      2、接收和处理Cookie 

      PHP对Cookie的接收和处理的支持非常好,是完全自动的,跟FORM变量的原则一样,特别简单。比如设
    置一个名为MyCookier的Cookie,PHP会自动从WEB服务器接收的HTTP头里把它分析出来,并形成一个与普通
    变量一样的变量,名为$myCookie,这个变量的值就是Cookie的值。数组同样适用。另外一个办法是引用PHP
    的全局变量$HTTP_COOKIE_VARS数组。 

      分别举例如下:(假设这些都在以前的页面里设置过了,并且仍然有效) 

    echo $MyCookie; 
    echo $CookieArray[0]; 
    echo count($CookieArray); 
    echo $HTTP_COOKIE_VARS["MyCookie"]; 

      就这么简单。 

      3、删除Cookie 

      要删除一个已经存在的Cookie,有两个办法: 

      一是调用只带有name参数的SetCookie,那么名为这个name的Cookie 将被从关系户机上删掉;另一个办
    法是设置Cookie的失效时间为time()或time()-1,那么这个Cookie在这个页面的浏览完之后就被删除了(其
    实是失效了)。 

      要注意的是,当一个Cookie被删除时,它的值在当前页在仍然有效的。 

      4、使用Cookie的限制 

      首先是必须在HTML文件的内容输出之前设置; 
      其次不同的浏览器对Cookie的处理不一致,且有时会出现错误的结果。比如:MS IE+SERVICE PACK 1
    不能正确处理带域名和路径的Cookie ,Netscape Communicator 4.05和MS IE 3.0不能正确处理不带路径和
    时间的Cookie。至于MS IE 5 好象不能处理带域名、路径和时间的Cookie。这是我在设计本站的页面时发现
    的。 
      第三个限制是在客户端的。一个浏览器能创建的Cookie数量最多为30个,并且每个不能超过4KB,每个WEB
    站点能设置的Cookie总数不能超过20个。 

      关于Cookie的话题,就说到这儿了。 thanks

  • 使用 yum 升级和 yum 使用简介

    2008-03-24 13:11:19

    使用 yum 升级和 yum 使用简介
                                         

    什么是 yum?
    yum 是 yellowdog updater modified 的缩写。yellowdog 是一个 Linux 的 distribution,RH 将这种升级技术利用到自己的 distribution 形成了现在的 yum,感觉上 yum 和 apt 的原理类似,但是 apt 是编译代码,执行效率远高于使用 python 写成的 yum。这是 yum 的主页。

    yum 的理念是使用一个中心仓库(repository)管理一部分甚至一个 distribution 的应用程序相互关系,根据计算出来的软件依赖关系进行相关的升级、安装、删除等等操作,减少了 Linux 用户一直头痛的 dependencies 的问题。这一点上,yum 和 apt 相同。apt 原为 debian 的 deb 类型软件管理所使用,但是现在也能用到 RH 门下的 rpm 了。

    一般这类软件通过一个或者多个配置文件描述对应的 repository 的网络地址,通过 http 或者 ftp 协议在需要的时候从 repository 获得必要的信息,下载相关的软件包。这样,本地用户通过建立不同的 repository 的描述说明,在有 Internet 连接时就能方便进行系统的升级维护工作。另外,如果需要使用代理,可以用 http_proxy 和 ftp_proxy 这些 shell 里面标准环境变量的设定。

    repository 是用 yum-arch 或者 createrepo 命令创建的,也可以用别人已有的 repository 作为镜像,这里部探讨如何建立一个 repository。
    yum 的基本操作
    yum 的基本操作包括软件的安装(本地,网络),升级(本地,网络),卸载,另外还有一定的查询功能。
    设定好了本地的 yum 之后,就可以很方便的进行安装(现在假设就用 fc5 自带的 yum 进行安装),如我们需要安装虚拟机 bochs,可以使用
    # yum install bochs
    如果本地有相关的 rpm 文件,可以用
    # yum localinstall ur.rpm
    前者导致 yum 搜索现有 repository 中的数据(一般先会连接到这些 repository 下载更新数据),如果发现有此软件,则会通过分析其 dependencies 然后下载并安装所需软件。

    如果需要卸载,可以使用
    # yum remove bochs
    或者
    # yum erase bochs
    这也会消解对应的 dependencies,如删除 firefox 会把 R 同时删掉,因为 R 依赖于 firefox

    更新某个软件可以用
    # yum update firefox
    如果不带后面的程序名,将会升级所有可以升级的软件。过时的软件如果需要处理(如删掉)可以添加 --obsolete 参数,或者使用 upgrade。如果需要更自动化一些的操作(避免回答一些问题)还可以增加一些参数,如
    # yum -y upgrade

    如果做完一次系统级的升级,将会下载大量 rpm 等等东西,这将占用较多的硬盘,可以使用
    # yum clean packages
    将相关的 rpm 文件删除,其他的一些有 headers, packages, cache, metadata, all

    查看什么 rpm 提供某个程序可以使用
    $ yum provides /bin/rpm
    而使用
    $ yum list rpm
    会列出 rpm 相关的信息,而
    $ yum list info
    给出详细的说明,可以用
    $ yum search rpm
    获得一切能找到的与 rpm 相关的程序,搜索的对象是每个程序的描述部分。

    更详细的参数说明请查阅相关的 man pages。在 yum-utils 里面可以找到叫 yumdownloader 的程序。使用它可以方便下载,如 srpm 等包
    $ yumdownloader --source firefox
    如何使用 yum 升级我的 fc?
    升级的核心部分很简单,首先,需要让 yum 能用新的 repository,fc 管理自己版本也用了一个 rpm,可以用如下命令更新这个包
    # rpm -Uvh http://download.fedora.redhat.com/pub/fedora\
    /linux/core/5/i386/os/Fedora/RPMS/fedora-release-5-5.\
    noarch.rpm
    此后就是用 yum 把 fc4 相关的程序更新到 fc5,
    # yum -y upgrade
    注意,由于某些自己安装的程序没有相关的 repository 程序替代,因此很可能干扰这个过程,如 qterm,原来的 repository 里面没有,偷懒的办法自然是先找到相关的 repository 并添加到 yum 的配置文件,笨拙的方法是先卸载这些东西... 进行了漫长的等待之后(我做的那次下载了 1.5Gb+ 的东西),就可以看着一个一个的软件更新了,然后重启,用新内核 boot 成功就几乎大功告成了。

    也许有一些应用软件无法处理老版本的配置文件,需要手动配置一下基本就行了。我的 fc5 就这样从 fc4 上长了出来~

    FC 本身有一个关于升级的 FAQ,可以参考。
    怎样配制 yum 添加新的 repository?
    这主要需要关心 yum 的配置文件。它的主配置文件在 /etc/yum.conf,其说明可以参考这里。
    其中重要的有 repository 的相关信息,在 fc5 里面,repository 的信息是分开存储的,一般在 /tec/yum.repos.d/ 里面,一般一个 repository 写成一个文件,如 fedora-core.repo。

    网上一般提供 yum 升级的 repository 都会提供类似的说明,如 DAG,他提供了可供安装的 rpm,装上后 yum 就配置好了,可以直接用上面的命令执行系统维护,又如 dries,可以建立一个 dries.repo 文件,内容是

    [dries]
    name=Extra Fedora rpms dries - $releasever - $basearch
    baseurl=http://ftp.belnet.be/packages/dries.ulyssis.org/redhat/el3/en/i386/dries

    这个一般看见就明白了,恕不赘述。
    一些其他的工具
    在 yum-utils 里面还有一些有用的工具,如 package-cleanup 用于清除本地安装的 rpm,还有维护 repository 的一些工具,如 repo-graph,repo-rss,repoclosure,repomanage,repoquery,reposync,repotrack, yum-builddep。

  • linux 文件结构是什么样的分析

    2008-01-11 16:09:30

    一 、linux文件结构
    文件结构是文件存放在磁盘等存贮设备上的组织方法。主要体现在对文件和目录的组织上。
    目录提供了管理文件的一个方便而有效的途径。
    linux使用标准的目录结构,在安装的时候,安装程序就已经为用户创建了文件系统和完整而固定的目录组成形式,并指定了每个目录的作用和其中的文件类型。



    /根目录

    ┏━━━┳━━━━┳━━━━┳━━━━╋━━━━┳━━━━┳━━━━┳━━━━┓
    ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃
    bin home dev etc lib sbin tmp usr var
    ┃ ┃
    ┏━┻━┓ ┏━━━━┳━━━┳━┻━┳━━━┳━━━┓
    ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃
    rc.d cron.d X11R6 src lib local man bin
    ┃ ┃ ┃
    ┏━━━┳━━━┳━┻━┳━━━━┓ ┃ ┏━━━╋━━━┓
    ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃
    init.d rc0.d rc1.d rc2.d …… linux bin lib src



    linux 采用的是树型结构。最上层是根目录,其他的所有目录都是从根目录出发而生成的。微软的DOS和windows也是采用树型结构,但是在DOS和 windows中这样的树型结构的根是磁盘分区的盘符,有几个分区就有几个树型结构,他们之间的关系是并列的。但是在linux中,无论操作系统管理几个磁盘分区,这样的目录树只有一个。从结构上讲,各个磁盘分区上的树型目录不一定是并列的。
    如果这样讲不好理解的话,我来举个例子:

    有一块硬盘,分成了4个分区,分别是/;/boot;/usr和windows下的fat
    对于/和/boot或者/和/usr,它们是从属关系;对于/boot和/usr,它们是并列关系。
    如果我把windows下的fat分区挂载到/mnt/winc下,(挂载??哦,别急,呵呵,一会就讲,一会就讲。)那么对于/mnt/winc和/usr或/mnt/winc和/boot来说,它们是从属于目录树上没有任何关系的两个分支。


    因为linux是一个多用户系统,制定一个固定的目录规划有助于对系统文件和不同的用户文件进行统一管理。但就是这一点让很多从windows转到linux的初学者感到头疼。下面列出了linux下一些主要目录的功用。


    /bin 二进制可执行命令
    /dev 设备特殊文件
    /etc 系统管理和配置文件
    /etc/rc.d 启动的配置文件和脚本
    /home 用户主目录的基点,比如用户user的主目录就是/home/user,可以用~user表示
    /lib 标准程序设计库,又叫动态链接共享库,作用类似windows里的.dll文件
    /sbin 系统管理命令,这里存放的是系统管理员使用的管理程序
    /tmp 公用的临时文件存储点
    /root 系统管理员的主目录(呵呵,特权阶级)
    /mnt 系统提供这个目录是让用户临时挂载其他的文件系统。
    /lost+found 这个目录平时是空的,系统非正常关机而留下“无家可归”的文件(windows下叫什么.chk)就在这里
    /proc 虚拟的目录,是系统内存的映射。可直接访问这个目录来获取系统信息。
    /var 某些大文件的溢出区,比方说各种服务的日志文件
    /usr 最庞大的目录,要用到的应用程序和文件几乎都在这个目录。其中包含:
    /usr/X11R6 存放X window的目录
    /usr/bin 众多的应用程序
    /usr/sbin 超级用户的一些管理程序
    /usr/doc linux文档
    /usr/include linux下开发和编译应用程序所需要的头文件
    /usr/lib 常用的动态链接库和软件包的配置文件
    /usr/man 帮助文档
    /usr/src 源代码,linux内核的源代码就放在/usr/src/linux里
    /usr/local/bin 本地增加的命令
    /usr/local/lib 本地增加的库





    二 、linux文件系统
    文件系统指文件存在的物理空间,linux系统中每个分区都是一个文件系统,都有自己的目录层次结构。linux会将这些分属不同分区的、单独的文件系统按一定的方式形成一个系统的总的目录层次结构。一个操作系统的运行离不开对文件的操作,因此必然要拥有并维护自己的文件系统。
    linux文件系统使用索引节点来记录文件信息,作用像windows的文件分配表。
    索引节点是一个结构,它包含了一个文件的长度、创建及修改时间、权限、所属关系、磁盘中的位置等信息。一个文件系统维护了一个索引节点的数组,每个文件或目录都与索引节点数组中的唯一一个元素对应。系统给每个索引节点分配了一个号码,也就是该节点在数组中的索引号,称为索引节点号。
    linux文件系统将文件索引节点号和文件名同时保存在目录中。所以,目录只是将文件的名称和它的索引节点号结合在一起的一张表,目录中每一对文件名称和索引节点号称为一个连接。
    对于一个文件来说有唯一的索引节点号与之对应,对于一个索引节点号,却可以有多个文件名与之对应。因此,在磁盘上的同一个文件可以通过不同的路径去访问它。
    可以用ln命令对一个已经存在的文件再建立一个新的连接,而不复制文件的内容。
    连接有软连接和硬连接之分,软连接又叫符号连接。它们各自的特点是:

    硬连接:原文件名和连接文件名都指向相同的物理地址。
    目录不能有硬连接;硬连接不能跨越文件系统(不能跨越不同的分区)
    文件在磁盘中只有一个拷贝,节省硬盘空间;
    由于删除文件要在同一个索引节点属于唯一的连接时才能成功,因此可以防止不必要的误删除。

    符号连接:用ln -s命令建立文件的符号连接
    符号连接是linux特殊文件的一种,作为一个文件,它的数据是它所连接的文件的路径名。类似windows下的快捷方式。
    可以删除原有的文件而保存连接文件,没有防止误删除功能。


    这一段的的内容过于抽象,又是节点又是数组的,我已经尽量通俗再通俗了,又不好加例子作演示。大家如果还是云里雾里的话,我也没有什么办法了,只有先记住,日后在实际应用中慢慢体会、理解了。这也是我学习的一个方法吧。





    三 、挂载文件系统
    由上一节知道,linux系统中每个分区都是一个文件系统,都有自己的目录层次结构。linux会将这些分属不同分区的、单独的文件系统按一定的方式形成一个系统的总的目录层次结构。这里所说的“按一定方式”就是指的挂载。
    将一个文件系统的顶层目录挂到另一个文件系统的子目录上,使它们成为一个整体,称为挂载。把该子目录称为挂载点。
    举个例子吧:


    根分区:


    /根目录

    ┏━━━━┳━━━━┳━━━━┳━━━━╋━━━━┳━━━━┳━━━━┳━━━━┓
    ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃
    bin home dev etc lib sbin tmp usr var

    ┏━┻━┓
    ┃ ┃
    rc.d cron.d

    ┏━━━┳━━━┳━┻━┳━━━━┓
    ┃ ┃ ┃ ┃ ┃
    init.d rc0.d rc1.d rc2.d ……




    /usr分区 :

    usr

    ┏━━━━┳━━━╋━━━┳━━━┳━━━┓
    ┃ ┃ ┃ ┃ ┃ ┃
    X11R6 src lib local man bin
    ┃ ┃
    ┃ ┏━━━╋━━━┓
    ┃ ┃ ┃ ┃
    linux bin lib src




    挂载之后就形成了文章开始时的那个图。像不像挂上去的?

    注意:1、挂载点必须是一个目录。

    2、一个分区挂载在一个已存在的目录上,这个目录可以不为空,但挂载后这个目录下以前的内容将不可用。
    对于其他操作系统建立的文件系统的挂载也是这样。但是需要理解的是:光盘、软盘、其他操作系统使用的文件系统的格式与linux使用的文件系统格式是不一样的。光盘是ISO9660;软盘是fat16或ext2;windows NT是fat16、NTFS;windows98是fat16、fat32;windows2000和windowsXP是fat16、fat32、 NTFS。挂载前要了解linux是否支持所要挂载的文件系统格式。


    挂载时使用mount命令:
    格式:mount [-参数] [设备名称] [挂载点]

    其中常用的参数有
    -t<文件系统类型> 指定设备的文件系统类型,常见的有:
    minix linux最早使用的文件系统
    ext2 linux目前常用的文件系统
    msdos MS-DOS的fat,就是fat16
    vfat windows98常用的fat32
    nfs 网络文件系统
    iso9660 CD-ROM光盘标准文件系统
    ntfs windows NT 2000的文件系统
    hpfs OS/2文件系统
    auto 自动检测文件系统
    -o<选项> 指定挂载文件系统时的选项。有些也可用在/etc/fstab中。常用的有
    codepage=XXX 代码页
    iocharset=XXX 字符集
    ro 以只读方式挂载
    rw 以读写方式挂载
    nouser 使一般用户无法挂载
    user 可以让一般用户挂载设备



    提醒一下,mount命令没有建立挂载点的功能,因此你应该确保执行mount命令时,挂载点已经存在。(不懂?说白了点就是你要把文件系统挂载到哪,首先要先建上个目录。这样OK?)

    例子:windows98装在hda1分区,同时计算机上还有软盘和光盘需要挂载。
    # mk /mnt/winc
    # mk /mnt/floppy
    # mk /mnt/cdrom
    # mount -t vfat /dev/hda1 /mnt/winc
    # mount -t msdos /dev/fd0 /mnt/floppy
    # mount -t iso9660 /dev/cdrom /mnt/cdrom
    现在就可以进入/mnt/winc等目录读写这些文件系统了。

    要保证最后两行的命令不出错,要确保软驱和光驱里有盘。(要是硬盘的磁盘片也可以经常随时更换的话,我想就不会犯这样的错误了:-> )
    如果你的windows98目录里有中文文件名,使用上面的命令挂载后,显示的是一堆乱码。这就要用到 -o 参数里的codepage iocharset选项。codepage指定文件系统的代码页,简体中文中文代码是936;iocharset指定字符集,简体中文一般用cp936或 gb2312。


    当挂载的文件系统linux不支持时,mount一定报错,如windows2000的ntfs文件系统。可以重新编译linux内核以获得对该文件系统的支持。关于重新编译linux内核,就不在这里说了。

    四 、自动挂载
    每次开机访问windows分区都要运行mount命令显然太烦琐,为什么访问其他的linux分区不用使用mount命令呢?
    其实,每次开机时,linux自动将需要挂载的linux分区挂载上了。那么我们是不是可以设定让linux在启动的时候也挂载我们希望挂载的分区,如windows分区,以实现文件系统的自动挂载呢?
    这是完全可以的。在/etc目录下有个fstab文件,它里面列出了linux开机时自动挂载的文件系统的列表。我的/etc/fstab文件如下:



    /dev/hda2 / ext3 defaults 1 1
    /dev/hda1 /boot ext3 defaults 1 2
    none /dev/pts devpts gid=5,mode=620 0 0
    none /proc proc defaults 0 0
    none /dev/shm tmpfs defaults 0 0
    /dev/hda3 swap swap defaults 0 0
    /dev/cdrom /mnt/cdrom iso9660 noauto,codepage=936,iocharset=gb2312 0 0
    /dev/fd0 /mnt/floppy auto noauto,owner,kudzu 0 0
    /dev/hdb1 /mnt/winc vfat defaults,codepage=936,iocharset=cp936 0 0
    /dev/hda5 /mnt/wind vfat defaults,codepage=936,iocharset=cp936 0 0




    在/etc/fstab文件里,第一列是挂载的文件系统的设备名,第二列是挂载点,第三列是挂载的文件系统类型,第四列是挂载的选项,选项间用逗号分隔。第五六列不知道是什么意思,还望高手指点。

    在最后两行是我手工添加的windows下的C;D盘,加了codepage=936和ocharset=cp936参数以支持中文文件名。参数defaults实际上包含了一组默认参数:

    rw 以可读写模式挂载
    suid 开启用户ID和群组ID设置位
    dev 可解读文件系统上的字符或区块设备
    exec 可执行二进制文件
    auto 自动挂载
    nouser 使一般用户无法挂载
    async 以非同步方式执行文件系统的输入输出操作

    大家可以看到在这个列表里,光驱和软驱是不自动挂载的,参数设置为noauto。(如果你非要设成自动挂载,你要确保每次开机时你的光驱和软驱里都要有盘,呵呵。)

     

    GCC参数详解

    [介绍] 
    gcc and g++分别是gnu的c & c++编译器 

    gcc/g++在执行编译工作的时候,总共需要4步 

    1.预处理,生成.i的文件 
    2.将预处理后的文件不转换成汇编语言,生成文件.s 
    3.有汇编变为目标代码(机器代码)生成.o的文件 
    4.连接目标代码,生成可执行程序 

    [参数详解] 

    -c  
      只激活预处理,编译,和汇编,也就是他只把程序做成obj文件 
      例子用法: 
      gcc -c hello.c 
      他将生成.o的obj文件  
    -S 
      只激活预处理和编译,就是指把文件编译成为汇编代码。 
      例子用法 
      gcc -S hello.c 
      他将生成.s的汇编代码,你可以用文本编辑器察看 
    -E 
      只激活预处理,这个不生成文件,你需要把它重定向到一个输出文件里 
      面. 
      例子用法: 
      gcc -E hello.c > pianoapan.txt 
      gcc -E hello.c | more 
      慢慢看吧,一个hello word 也要与处理成800行的代码 
    -o 
      制定目标名称,缺省的时候,gcc 编译出来的文件是a.out,很难听,如果 
      你和我有同感,改掉它,哈哈 
      例子用法 
      gcc -o hello.exe hello.c (哦,windows用习惯了) 
      gcc -o hello.asm -S hello.c 
    -ansi 
      关闭gnu c中与ansi c不兼容的特性,激活ansi c的专有特性(包括禁止一 
      些asm inline typeof关键字,以及UNIX,vax等预处理宏, 

    -wall

          显示警告信息
    -fno-asm 
      此选项实现ansi选项的功能的一部分,它禁止将asm,inline和typeof用作 
      关键字。 
         
    -fno-strict-prototype 
      只对g++起作用,使用这个选项,g++将对不带参数的函数,都认为是没有显式 
      的对参数的个数和类型说明,而不是没有参数. 
      而gcc无论是否使用这个参数,都将对没有带参数的函数,认为城没有显式说 
      明的类型 
       
    -fthis-is-varialble 
      就是向传统c++看齐,可以使用this当一般变量使用. 
       
    -fcond-mismatch 
      允许条件表达式的第二和第三参数类型不匹配,表达式的值将为void类型 
       
    -funsigned-char 
    -fno-signed-char 
    -fsigned-char 
    -fno-unsigned-char 
      这四个参数是对char类型进行设置,决定将char类型设置成unsigned char(前 
      两个参数)或者 signed char(后两个参数) 

    -include file 
      包含某个代码,简单来说,就是便以某个文件,需要另一个文件的时候,就可以 
      用它设定,功能就相当于在代码中使用#include 
      例子用法: 
      gcc hello.c -include /root/pianopan.h 
       
    -imacros file 
      将file文件的宏,扩展到gcc/g++的输入文件,宏定义本身并不出现在输入文件 
      中 
       
    -Dmacro 
      相当于C语言中的#define macro 
       
    -Dmacro=defn 
      相当于C语言中的#define macro=defn 
       
    -Umacro 
      相当于C语言中的#undef macro 

    -undef 
      取消对任何非标准宏的定义 
       
    -Idir 
      在你是用#include"file"的时候,gcc/g++会先在当前目录查找你所制定的头 
      文件,如果没有找到,他回到缺省的头文件目录找,如果使用-I制定了目录,他 
      回先在你所制定的目录查找,然后再按常规的顺序去找. 
      对于#include,gcc/g++会到-I制定的目录查找,查找不到,然后将到系 
      统的缺省的头文件目录查找 
       
    -I- 
      就是取消前一个参数的功能,所以一般在-Idir之后使用 
       
    -idirafter dir 
      在-I的目录里面查找失败,讲到这个目录里面查找. 
       
    -iprefix prefix 
    -iwithprefix dir 
      一般一起使用,当-I的目录查找失败,会到prefix+dir下查找 
       
    -nostdinc 
      使编译器不再系统缺省的头文件目录里面找头文件,一般和-I联合使用,明确 
      限定头文件的位置 
       
    -nostdin C++ 
      规定不在g++指定的标准路经中搜索,但仍在其他路径中搜索,.此选项在创建 
      libg++库使用 
       
    -C 
      在预处理的时候,不删除注释信息,一般和-E使用,有时候分析程序,用这个很 
      方便的 
       
    -M 
      生成文件关联的信息。包含目标文件所依赖的所有源代码 
      你可以用gcc -M hello.c来测试一下,很简单。 
       
    -MM 
      和上面的那个一样,但是它将忽略由#include造成的依赖关系。 
       
    -MD 
      和-M相同,但是输出将导入到.d的文件里面 
       
    -MMD 
      和-MM相同,但是输出将导入到.d的文件里面 
       
    -Wa,option 
      此选项传递option给汇编程序;如果option中间有逗号,就将option分成多个选 
      项,然后传递给会汇编程序 
       
    -Wl.option 
      此选项传递option给连接程序;如果option中间有逗号,就将option分成多个选 
      项,然后传递给会连接程序. 
       

    -llibrary  
      制定编译的时候使用的库 
      例子用法 
      gcc -lcurses hello.c 
      使用ncurses库编译程序 
       
    -Ldir 
      制定编译的时候,搜索库的路径。比如你自己的库,可以用它制定目录,不然 
      编译器将只在标准库的目录找。这个dir就是目录的名称。 
       
    -O0 
    -O1 
    -O2 
    -O3 
      编译器的优化选项的4个级别,-O0表示没有优化,-O1为缺省值,-O3优化级别最 
      高   
       
    -g 
      只是编译器,在编译的时候,产生条是信息。 
       
    -gstabs 
      此选项以stabs格式声称调试信息,但是不包括gdb调试信息. 
       
    -gstabs+ 
      此选项以stabs格式声称调试信息,并且包含仅供gdb使用的额外调试信息. 
       
    -ggdb 
      此选项将尽可能的生成gdb的可以使用的调试信息.

  • Linux 基初到深入介绍(学习好东西,会继续总结的)

    2008-01-11 16:08:14

    用 umask 命令,在 /etc/init.dev 文件中进行系统范围内的、或在 .profile 文件中进行的本地的文件权限默认设置。这个命令指示用 777 减去这个数字来获取默认的权限: 
    # umask 022
    这将为用户创建的所有新文件生成一个默认的文件权限 755。

    umask 

        1.作用
        umask设置用户文件和目录的文件创建缺省屏蔽值,若将此命令放入profile文件,就可控制该用户后续所建文件的存取许可。它告诉系统在创建文件时不给谁存取许可。使用权限是所有用户。 

        2.格式
        umask [-p] [-S] [mode] 

        3.参数
        -S:确定当前的umask设置。
        -p:修改umask 设置。
        [mode]:修改数值。 

        4.说明
        传统Unix的umask值是022,这样就可以防止同属于该组的其它用户及别的组的用户修改该用户的文件。既然每个用户都拥有并属于一个自己的私有组,那么这种“组保护模式”就不在需要了。严密的权限设定构成了Linux安全的基础,在权限上犯错误是致命的。需要注意的是,umask命令用来设置进程所创建的文件的读写权限,最保险的值是0077,即关闭创建文件的进程以外的所有进程的读写权限,表示为-rw-------。在~/.bash_profile中,加上一行命令umask 0077可以保证每次启动Shell后, 进程的umask权限都可以被正确设定。 

        5.应用实例 

    umask -S
    u=rwx,g=rx,o=rx
    umask -p 177
    umask -S
    u=rw,g=,o=
     
        上述5行命令,首先显示当前状态,然后把umask值改为177,结果只有文件所有者具有读写文件的权限,其它用户不能访问该文件。这显然是一种非常安全的设置。

     

    Linux的系统安全命令

    虽然Linux和Windows NT/2000系统一样是一个多用户的系统,但是它们之间有不少重要的差别。对于很多习惯了Windows系统的管理员来讲,如何保证Linux操作系统安全、可靠将会面临许多新的挑战。本文将重点介绍Linux系统安全的命令。 

        passwd 

        1.作用
        passwd命令原来修改账户的登陆密码,使用权限是所有用户。 

        2.格式
        passwd [选项] 账户名称 

        3.主要参数 
        -l:锁定已经命名的账户名称,只有具备超级用户权限的使用者方可使用。
        -u:解开账户锁定状态,只有具备超级用户权限的使用者方可使用。 
        -x, --maximum=DAYS:最大密码使用时间(天),只有具备超级用户权限的使用者方可使用。
        -n, --minimum=DAYS:最小密码使用时间(天),只有具备超级用户权限的使用者方可使用。
        -d:删除使用者的密码, 只有具备超级用户权限的使用者方可使用。 
        -S:检查指定使用者的密码认证种类, 只有具备超级用户权限的使用者方可使用。 

        4.应用实例 

    $ passwd
    Changing password for user cao.
    Changing password for cao
    (current) UNIX password:
    New UNIX password:
    Retype new UNIX password:
    passwd: all authentication tokens updated successfully.
     


        从上面可以看到,使用passwd命令需要输入旧的密码,然后再输入两次新密码。 

        su 

        1.作用
        su的作用是变更为其它使用者的身份,超级用户除外,需要键入该使用者的密码。 

        2.格式
        su [选项]... [-] [USER [ARG]...] 

        3.主要参数
        -f , --fast:不必读启动文件(如 csh.cshrc 等),仅用于csh或tcsh两种Shell。
        -l , --login:加了这个参数之后,就好像是重新登陆为该使用者一样,大部分环境变量(例如HOME、SHELL和USER等)都是以该使用者(USER)为主,并且工作目录也会改变。如果没有指定USER,缺省情况是root。
        -m, -p ,--preserve-environment:执行su时不改变环境变数。
        -c command:变更账号为USER的使用者,并执行指令(command)后再变回原来使用者。
        USER:欲变更的使用者账号,ARG传入新的Shell参数。 

        4.应用实例
        变更账号为超级用户,并在执行df命令后还原使用者。    su -c df root 

        umask 

        1.作用
        umask设置用户文件和目录的文件创建缺省屏蔽值,若将此命令放入profile文件,就可控制该用户后续所建文件的存取许可。它告诉系统在创建文件时不给谁存取许可。使用权限是所有用户。 

        2.格式
        umask [-p] [-S] [mode] 

        3.参数
        -S:确定当前的umask设置。
        -p:修改umask 设置。
        [mode]:修改数值。 

        4.说明
        传统Unix的umask值是022,这样就可以防止同属于该组的其它用户及别的组的用户修改该用户的文件。既然每个用户都拥有并属于一个自己的私有组,那么这种“组保护模式”就不在需要了。严密的权限设定构成了Linux安全的基础,在权限上犯错误是致命的。需要注意的是,umask命令用来设置进程所创建的文件的读写权限,最保险的值是0077,即关闭创建文件的进程以外的所有进程的读写权限,表示为-rw-------。在~/.bash_profile中,加上一行命令umask 0077可以保证每次启动Shell后, 进程的umask权限都可以被正确设定。 

        5.应用实例 

    umask -S
    u=rwx,g=rx,o=rx
    umask -p 177
    umask -S
    u=rw,g=,o=
     


        上述5行命令,首先显示当前状态,然后把umask值改为177,结果只有文件所有者具有读写文件的权限,其它用户不能访问该文件。这显然是一种非常安全的设置。 

        chgrp 

        1.作用
        chgrp表示修改一个或多个文件或目录所属的组。使用权限是超级用户。 

        2.格式
        chgrp [选项]... 组 文件...
        或
        chgrp [选项]... --reference=参考文件 文件... 

        将每个<文件>的所属组设定为<组>。 

        3.参数
        -c, --changes :像 --verbose,但只在有更改时才显示结果。
        --dereference:会影响符号链接所指示的对象,而非符号链接本身。
        -h, --no-dereference:会影响符号链接本身,而非符号链接所指示的目的地(当系统支持更改符号链接的所有者,此选项才有效)。
        -f, --silent, --quiet:去除大部分的错误信息。
        --reference=参考文件:使用<参考文件>的所属组,而非指定的<组>。
        -R, --recursive:递归处理所有的文件及子目录。
        -v, --verbose:处理任何文件都会显示信息。 

        4.应用说明
        该命令改变指定指定文件所属的用户组。其中group可以是用户组ID,也可以是/etc/group文件中用户组的组名。文件名是以空格分开的要改变属组的文件列表,支持通配符。如果用户不是该文件的属主或超级用户,则不能改变该文件的组。 

        5.应用实例
        改变/opt/local /book/及其子目录下的所有文件的属组为book,命令如下:
        $ chgrp - R book /opt/local /book 

        chmod 

    Chmod使用格式:
    Chmod [参数][模式]<文件或目录>
    参数:-R:改变目录及其所有子目录的文件权限。
    举例:
    #chmod u+x inittab
    #chmod ug+wx,o-x inittab
    #chmod 0644 inittab
    #chmod 0755 inittab
    #chmod –R 700 ~

    目录权限的补充说明:
    1、目录的只读访问不允许使用cd进入目录,必须要有执行的权限才能进入。
    2、只有执行权限只能进入目录,不能看到目录下的内容,要想看到目录下的文件名和目录名,需要可读权限。
    3、一个文件能不能被删除,主要看该文件所在的目录对用户是否具有写权限,如果目录对用户没有写权限,则该目录下的所有文件都不能被删除,文件所有者除外


    对特殊位的举例说明: 操作这些特殊位与操作文件权限的命令是一样的, 都是 chmod. 有两种方法来操作, 1) chmod u+s temp : 为temp文件加上setuid标志. (setuid 只对文件有效) chmod g+s tempdir :为tempdir目录加上setgid标志 (setgid 只对目录有效) chmod o+t tempdir : 为temp文件加上sticky标志 (sticky只对目录有效)

    2) 采用八进制方式. 对一般文件通过三组八进制数字来置标志, 如 666, 777, 644等. 如果设置这些特殊标志, 则在这组数字之外外加一组八进制数字. 如 4666, 2777等.
    设置完这些标志后, 可以用 ls -l 来查看. 如果有这些标志, 则会在原来的执行标志位置上显示. 如 rwsrw-r-- 表示有setuid标志 rwxrwsrw- 表示有setgid标志 rwxrw-rwt 表示有sticky标志 那么原来的执行标志x到哪里去了呢? 系统是这样规定的, 如果本来在该位上有x, 则这些特殊标志显示为小写字母 (s, s, t). 否则, 显示为大写字母 (S, S, T) 


        1.作用
        chmod命令是非常重要的,用于改变文件或目录的访问权限,用户可以用它控制文件或目录的访问权限,使用权限是超级用户。 

        2.格式
        chmod命令有两种用法。一种是包含字母和操作符表达式的字符设定法(相对权限设定);另一种是包含数字的数字设定法(绝对权限设定)。 

        (1)字符设定法 
        chmod [who] [+ | - | =] [mode] 文件名 

        ◆操作对象who可以是下述字母中的任一个或它们的组合
        u:表示用户,即文件或目录的所有者。 
        g:表示同组用户,即与文件属主有相同组ID的所有用户。
        o:表示其它用户。 
        a:表示所有用户,它是系统默认值。 

        ◆操作符号 
        +:添加某个权限。 
        -:取消某个权限。 
        =:赋予给定权限,并取消其它所有权限(如果有的话)。 

        ◆设置mode的权限可用下述字母的任意组合
        r:可读。 
        w:可写。 
        x:可执行。 
        X:只有目标文件对某些用户是可执行的或该目标文件是目录时才追加x属性。 
        s:文件执行时把进程的属主或组ID置为该文件的文件属主。方式“u+s”设置文件的用户ID位,“g+s”设置组ID位。 
        t:保存程序的文本到交换设备上。 
        u:与文件属主拥有一样的权限。 
        g:与和文件属主同组的用户拥有一样的权限。 
        o:与其它用户拥有一样的权限。 
        文件名:以空格分开的要改变权限的文件列表,支持通配符。
        一个命令行中可以给出多个权限方式,其间用逗号隔开。 

        (2) 数字设定法 
        数字设定法的一般形式为: chmod [mode] 文件名 

        数字属性的格式应为3个0到7的八进制数,其顺序是(u)(g)(o)文件名,以空格分开的要改变权限的文件列表,支持通配符。 

        数字表示的权限的含义如下:0001为所有者的执行权限;0002为所有者的写权限;0004为所有者的读权限;0010为组的执行权限;0020为组的写权限;0040为组的读权限;0100为其他人的执行权限;0200为其他人的写权限;0400为其他人的读权限;1000为粘贴位置位;2000表示假如这个文件是可执行文件,则为组ID为位置位,否则其中文件锁定位置位;4000表示假如这个文件是可执行文件,则为用户ID为位置位。 

        3.实例
        如果一个系统管理员写了一个表格(tem)让所有用户填写,那么必须授权用户对这个文件有读写权限,可以使用命令:#chmod 666 tem 

        上面代码中,这个666数字是如何计算出来的呢?0002为所有者的写权限,0004为所有者的读权限,0020为组的写权限,0040为组的读权限,0200为其他人的写权限,0400为其他人的读权限,这6个数字相加就是666(注以上数字都是八进制数),结果见图1所示。 



    图1 用chmod数字方法设定文件权限


        从图1可以看出,tem文件的权限是-rw-rw-rw-,即用户对这个文件有读写权限。 

        如果用字符权限设定使用下面命令:
        #chmod a =wx tem 
        chown 

        1.作用
        更改一个或多个文件或目录的属主和属组。使用权限是超级用户。 

        2.格式
        chown [选项] 用户或组 文件 

        3.主要参数
        --dereference:受影响的是符号链接所指示的对象,而非符号链接本身。
        -h, --no-dereference:会影响符号链接本身,而非符号链接所指示的目的地(当系统支持更改符号链接的所有者,此选项才有效)。
        --from=目前所有者:目前组只当每个文件的所有者和组符合选项所指定的,才会更改所有者和组。其中一个可以省略,这已省略的属性就不需要符合原有的属性。
        -f, --silent, --quiet:去除大部分的错误信息。
        -R, --recursive:递归处理所有的文件及子目录。
        -v, --verbose:处理任何文件都会显示信息。 

        4.说明
        chown将指定文件的拥有者改为指定的用户或组,用户可以是用户名或用户ID;组可以是组名或组ID;文件是以空格分开的要改变权限的文件列表,支持通配符。系统管理员经常使用chown命令,在将文件拷贝到另一个用户的目录下以后,让用户拥有使用该文件的权限。 

        5.应用实例
        1.把文件shiyan.c的所有者改为wan 
        $ chown wan shiyan.c 

        2.把目录/hi及其下的所有文件和子目录的属主改成wan,属组改成users。 
        $ chown - R wan.users /hi 

        chattr 

        1.作用
        修改ext2和ext3文件系统属性(attribute),使用权限超级用户。 

        2.格式
        chattr [-RV] [-+=AacDdijsSu] [-v version] 文件或目录 

        3.主要参数
        -R:递归处理所有的文件及子目录。
        -V:详细显示修改内容,并打印输出。
        -:失效属性。
        +:激活属性。
        = :指定属性。
        A:Atime,告诉系统不要修改对这个文件的最后访问时间。
        S:Sync,一旦应用程序对这个文件执行了写操作,使系统立刻把修改的结果写到磁盘。 
        a:Append Only,系统只允许在这个文件之后追加数据,不允许任何进程覆盖或截断这个文件。如果目录具有这个属性,系统将只允许在这个目录下建立和修改文件,而不允许删除任何文件。 
        i:Immutable,系统不允许对这个文件进行任何的修改。如果目录具有这个属性,那么任何的进程只能修改目录之下的文件,不允许建立和删除文件。 
        D:检查压缩文件中的错误。
        d:No dump,在进行文件系统备份时,dump程序将忽略这个文件。 
        C:Compress,系统以透明的方式压缩这个文件。从这个文件读取时,返回的是解压之后的数据;而向这个文件中写入数据时,数据首先被压缩之后才写入磁盘。 
        s:Secure Delete,让系统在删除这个文件时,使用0填充文件所在的区域。 
        u:Undelete,当一个应用程序请求删除这个文件,系统会保留其数据块以便以后能够恢复删除这个文件。 

        4.说明
        chattr命令的作用很大,其中一些功能是由Linux内核版本来支持的,如果Linux内核版本低于2.2,那么许多功能不能实现。同样-D检查压缩文件中的错误的功能,需要2.5.19以上内核才能支持。另外,通过chattr命令修改属性能够提高系统的安全性,但是它并不适合所有的目录。chattr命令不能保护/、/dev、/tmp、/var目录。 

        5.应用实例
        1.恢复/root目录,即子目录的所有文件
        # chattr -R +u/root 

        2.用chattr命令防止系统中某个关键文件被修改
        在Linux下,有些配置文件(passwd ,fatab)是不允许任何人修改的,为了防止被误删除或修改,可以设定该文件的“不可修改位(immutable)”,命令如下:
        # chattr +i /etc/fstab 

        sudo 

        1.作用
        sudo是一种以限制配置文件中的命令为基础,在有限时间内给用户使用,并且记录到日志中的命令,权限是所有用户。 

        2.格式 

    sudo [-bhHpV] [-s <shell>] [-u <用户>] [指令]
    sudo [-klv]
     


        3.主要参数 

    -b:在后台执行命令。
    -h:显示帮助。
    -H:将HOME环境变量设为新身份的HOME环境变量。
    -k:结束密码的有效期,即下次将需要输入密码。
    -l:列出当前用户可以使用的命令。
    -p:改变询问密码的提示符号。
    -s <shell>:执行指定的Shell。
    -u <用户>:以指定的用户为新身份,不使用时默认为root。
    -v:延长密码有效期5分钟。
     


        4.说明
        sudo命令的配置在/etc/sudoers文件中。当用户使用sudo时,需要输入口令以验证使用者身份。随后的一段时间内可以使用定义好的命令,当使用配置文件中没有的命令时,将会有报警的记录。sudo是系统管理员用来允许某些用户以root身份运行部分/全部系统命令的程序。一个明显的用途是增强了站点的安全性,如果需要每天以超级用户的身份做一些日常工作,经常执行一些固定的几个只有超级用户身份才能执行的命令,那么用sudo是非常适合的。 

        ps 

        1.作用
        ps显示瞬间进程 (process) 的动态,使用权限是所有使用者。 

        2.格式
        ps [options] [--help] 

        3.主要参数
        ps的参数非常多, 此出仅列出几个常用的参数。 

    -A:列出所有的进程。 
    -l:显示长列表。
    -m:显示内存信息。
    -w:显示加宽可以显示较多的信息。 
    -e:显示所有进程。
    a:显示终端上的所有进程,包括其它用户的进程。
    -au:显示较详细的信息。
    -aux:显示所有包含其它使用者的进程。
     


        4.说明
        要对进程进行监测和控制,首先要了解当前进程的情况,也就是需要查看当前进程。ps命令就是最基本、也是非常强大的进程查看命令。使用该命令可以确定有哪些进程正在运行、运行的状态、进程是否结束、进程有没有僵尸、哪些进程占用了过多的资源等。图2给出了ps-aux命令详解。大部分信息都可以通过执行该命令得到。最常用的三个参数是u、a、x。下面就结合这三个参数详细说明ps命令的作用:ps aux 



    图2 ps-aux命令详解


        图2第2行代码中,USER表示进程拥有者;PID表示进程标示符;%CPU表示占用的CPU使用率;%MEM占用的物理内存使用率;VSZ表示占用的虚拟内存大小;RSS为进程占用的物理内存值;TTY为终端的次要装置号码。 

        STAT表示进程的状态,其中D为不可中断的静止(I/O动作);R正在执行中;S静止状态;T暂停执行;Z不存在,但暂时无法消除;W没有足够的内存分页可分配;高优先序的进程;N低优先序的进程;L有内存分页分配并锁在内存体内 (实时系统或 I/O)。START为进程开始时间。TIME为执行的时间。COMMAND是所执行的指令。 

        4.应用实例
        在进行系统维护时,经常会出现内存使用量惊人,而又不知道是哪一个进程占用了大量进程的情况。除了可以使用top命令查看内存使用情况之外,还可以使用下面的命令:
        ps aux | sort +5n 

        who 

        1.作用
        who显示系统中有哪些用户登陆系统,显示的资料包含了使用者ID、使用的登陆终端、上线时间、呆滞时间、CPU占用,以及做了些什么。 使用权限为所有用户。 

        2.格式
        who - [husfV] [user] 

        3.主要参数 

    -h:不要显示标题列。 
    -u:不要显示使用者的动作/工作。
    -s:使用简短的格式来显示。
    -f:不要显示使用者的上线位置。 
    -V:显示程序版本。
     


        4.说明
        该命令主要用于查看当前在线上的用户情况。如果用户想和其它用户建立即时通信,比如使用talk命令,那么首先要确定的就是该用户确实在线上,不然talk进程就无法建立起来。又如,系统管理员希望监视每个登录的用户此时此刻的所作所为,也要使用who命令。who命令应用起来非常简单,可以比较准确地掌握用户的情况,所以使用非常广泛。 

        动手练习 

        1.使用Linux命令检测系统入侵者
        安装过Mandrake Linux和Red Hat Linux的用户都会知道,Linux系统会内置三种不同级别(标准、高、更高)的防火墙,当进行了Linux服务器的安装和一些基本的设置后,服务器应该说是比较安全的,但是也会有黑客通过各种方法利用系统管理员的疏忽侵入系统。如何快速查找黑客非常重要。一般来说,可以使用命令查询黑客是否入侵,见表1。 


    表1 查询黑客入侵现象的命令对应表



        举例说明,如果黑客嗅探网络,那么它必须使网卡接口处于混杂模式,使用下面命令进行查询: 

    #ifconfig -a
    eth0  Link encap:Ethernet  HWaddr 00:00:E8:A0:25:86
          inet addr:192.168.1.7  Bcast:192.168.1.255  Mask:255.255.255.0
          UP BROADCAST RUNNING PROMISCUOUS  MTU:1500  Metric:1
    ......
     


        从这个命令的输出中,可以看到上面讲到的这些概念。第一行的00:00:E8:A0:25:86是mac地址,第二行的192.168.1.7是IP地址,第四行讲的是接收数据状态,这时正在被黑客嗅探。一般而言,网卡有几种接收数据帧的状态,如Broadcast、Multicast、Promiscuous等。Broadcast是指接收所有类型为广播报文的数据帧;Multicast是指接收特定的组播报文;Promiscuous则是通常说的混杂模式,是指对报文中的目的硬件地址不加任何检查、全部接收的工作模式。 

        2.限制su命令的滥用
        我们知道,超级用户在Linux中有最大的权利,几乎所有黑客都想得到这个目标。Linux可以增加对切换到超级用户的限制。使用PAM(Pluggable Authentication Modules)可以禁止除在wheel组以外的任何人su成root,修改/etc/pam.d/su文件,除去屏蔽标识#。使用/usr/sbin/usermod G10 bjecadm将bjecadm这个账号加入gid为10的组,就是wheel组。命令如下: 

    /etc/pam.d/su   # 使用密码验证#
    auth sufficient /lib/security/pam_wheel.so debug 
    # 限制只有wheel组用户才可以切换到root#
    auth required /lib/security/pam_wheel.so use_uid
    chmod -G10 bjecadm
     


        另外,每当用户试图使用su命令进入系统用户时,命令将在/usr/adm/sulog文件中写一条信息,若该文件记录了大量试图用su进入root的无效操作信息,则表明了可能有人企图破译root口令。 

        Linux命令有着强大的功能。对于Linux系统管理员来说,往往只需要通过各种安全命令技巧,组合构成安全防线。从计算机安全的角度看,世界上没有绝对安全的计算机系统,Linux系统也不例外。

     

    其他信息列述

     

    1.1 Linux操作系统概述
    开放性的系统
    多用户多任务的系统
    具有出色的稳定性和速度性能
    具有可靠的系统安全性
    提供了丰富的网络功能
    标准兼容性和可移植性
    提供了良好的用户界面
    Linux系统的组成
    Kernel(内核)和版本
    Linux 发行套件
    Linux Shell
    Linux 文件系统
    Linux 文件系统标准结构
    1.2 红旗Linux的安装
    1.2.1 安装前的准备
    1.2.2 使用安装光盘从CD-ROM安装
    1.2.3 使用Linux启动盘从硬盘安装
    1.2.1 安装前的准备
    收集计算机硬件信息
    规划硬盘空间
    选取工作站类型:至少需要1.2G左右空间;最多需要1.5G左右空间。
    选取服务器类型:至少需要650M左右空间,最多需要1.2G左右空间。
    选取便携式类型:与工作站类型所需空间相当。
    选取自定义类型:至少需要350M左右空间,最多需要2.4G左右空间。
    规划网络配置信息
    1.2.2 使用安装光盘从CD-ROM安装
    设置CMOS
    安装
    安装红旗linux
    Server和Workstation模式:自动分割硬盘
    Custom:手工分割 ? Mount Point
    / ? root根分区(建议:256MB)
    SWAP ?交换分区(建议:略小于实际内存2倍)
    /usr:? 安装软件存放位置(建议:2.5GB)
    /home:? 视用户多少而定
    /var:? 存放临时文件(建议:256MB)
    /boot: ? 存放启动文件(建议:32MB)
    1.2.3 Linux的其他安装方式
    本地安装
    远程网络安装
    使用Linux启动盘从硬盘安装
    制作启动软盘
    1、在DOS下创建:
    进入dosutils子目录,运行rawrite程序 。
    输入../images/boothd.img 。
    2、在linux下创建:
    #dd if=/images/boothd.img ōf=/dev/fd0 bs=1440
    修改CMOS设置中的引导顺序
    明确系统文件在硬盘中的存放位置
    使用Linux安装启动盘从远程FTP服务器安装
    远程网络安装Linux系统的方法和本地硬盘安装类似,也需要制作启动软盘。制作启动软盘的步骤和前面相同,唯一不同的是制作启动软盘时使用的软盘镜像文件是bootnet.img。
    1.3、linux安装须具备的知识
    磁盘的标识:
    IDE硬盘:/dev/hdxx:其中第一个X表示第几块硬盘,采用a、b、c、d分别对应四块硬盘,第二个X表示分区,1-4表示主分区或扩展分区,逻辑分区从5开始。
    SCSI硬盘:/dev/sdxx
    光盘:/dev/cdrom
    软盘:/dev/fd0


    1.4 Linux运行级别和系统的启动和关闭
    21.4.1 Linux的运行级别和切换
    21.4.2 Linux的启动过程
    1.4.1 Linux的运行级别和切换
    Linux的运行级别
    Linux运行级别的切换
    Linux的启动、关闭和重新启动
    Linux的运行级别
    Linux运行级别的切换
    在inittab文件中,操作initdefault将在系统初始化之后启动预设的运行级别,用户可以通过更改此项设置来改变系统的预设运行级别。
    用户也可以在系统运行过程当中来改变系统的运行级别,方法是用init命令,后面加上要切换到的运行级别。
    Linux的启动、关闭和重新启动
    linux启动
    红旗linux在启动过程中首先加载Linux内核,在内存中执行内核操作,检查硬件,挂载根文件系统,然后启动init进程。init进程就会根据inittab文件中的设置来使系统进入预设的运行级别,读取相关的配置文件和脚本程序,最后启用相关服务,完成整个系统的启动。

    Linux的重启方法
    Reboot
    Init 6
    Ctrl+alt+delete
    Shutdown –r time [warning-message]
    如:#shutdown –r +3 “system will be down in 3 minites,please save you work”
    #shutdown –r now
    #shutdown –r 03:15


    Linux关机的方法
    Halt
    Init 0
    Shutdown –h time [warning-message]
    如:#shutdown –h now
    1.5 Linux的初步使用
    1.5.1 Linux的字符运行方式
    1.5.2 linux的图形界面
    1.5.3 常见问题
    1.5.1 Linux的字符运行方式
    登录和注销 :
    超级用户登录后的操作提示符是“#”;普通用户登录后的操作提示符是“$”
    若要注销登录,用户可以在当前的登录终端上输入logout命令或使用Ctrl+d热键进行。
    终端之间的切换采用:alt+f1—f7
    1.5.2 linux的图形界面
    图形界面下运行终端命令:rxvt
    图形界面切换到字符界面:ctrl+alt +f1—f6
    图形界面下的注销:ctrl+alt+delete
    图形界面下的锁定:ctrl+alt+L

    1.5.3 常见问题
    最基本的安全问题
    root口令丢失的解决方法
    删除Linux操作系统
    最基本的安全问题
    如果机箱有锁,应该上锁,并保证钥匙与机箱分离放置;
    若机箱没有锁,如果必要,当正常运行后断开电源按钮和复位按钮的连接线;
    禁止三键热启功能,修改/etc/inittab,将此行注释掉;
    禁止BIOS中的软驱启动功能,并设置BIOS开机密码;
    禁止公开root密码,若有多个系统管理员则应该避免root密码的扩散;
    必须准备引导软盘以防硬盘无法启动时使用。
    root口令丢失的解决方法
    使用单用户模式 ,重设root密码
    在红旗linux4桌面版中,在开始菜单中选3按e,再选2按e,把3改成1,回车再按b。

    删除Linux操作系统
    首先要修改MBR,删除LILO。
    在DOS或Windows下用fdisk命令加上/mbr参数来完成 。
    重新格式化ext3分区为FAT32分区或NTFS分区。
     

    hls
    查看公开信息
    发送悄悄话给hls
    给hls发送Email
    查找hls发表的更多帖子
    添加 hls 到好友列表

    第2章:linux shell和常用命令
    2.1 linux常用命令
    2.2 shell
    2.3 vi的使用
    2.1 linux的常用命令
    第一节:文件目录类命令
    1、 查看联机帮助信息
    man 命令 如:#man ls
    info 命令 如:#info cd
    2、列出当前目录或指定目录的文件名和目录名
    ls [选项] 文件或目录
    常用[选项]如下:
    -a:显示所有的文件,包括以“.”开头的隐含文件。
    -l:长格式输出


    -m:宽行输出
    -F:以各种符号表示不同的文件类型
    --color:彩色输出
    -R:递归输出
    3、touch
    功能:修改文件的创建日期或以当前系统日期创建一个空文件。
    -d:修改文件的日期。
    #touch –d 20030123 test.txt

     


    4、cp
    功能:复制文件
    用法:cp [选项] 源文件或目录 目标文件或目录
    选项:
    a: 该选项通常在拷贝目录时使用。它保留链接、文件属性,并递归地拷贝目录,其作用等于dpR选项的组合。
    - d 拷贝时保留链接。
    - f 删除已经存在的目标文件而不提示。
    - i 和f选项相反,在覆盖目标文件之前将给出提示要求用户确认。回答y时目标文件将被覆盖,是交互式拷贝。
    - p 此时cp除复制源文件的内容外,还将把其修改时间和访问权限也复制到新文件中。
    - r 若给出的源文件是一目录文件,此时cp将递归复制该目录下所有的子目录和文件。此时目标文件必须为一个目录名。

    5、mv
    功能:给文件或目录改名或将一个文件或目录移到另一个目录
    用法:mv [选项] 源文件或目录 目标文件或目录
    -i 交互方式操作。如果mv操作将导致对已存在的目标文件的覆盖,此时系统询问是否重写,要求用户回答y或n,这样可以避免误覆盖文件。
    - f 禁止交互操作。在mv操作要覆盖某已有的目标文件时不给任何指示,指定此选项后,i选项将不再起作用。

    6、rm
    功能:删除文件或目录
    用法:rm [选项] 文件…
    - f 强制删除
    - r 指示rm将参数中列出的全部目录和子目录均递归地删除。
    - i 进行交互式删除

    7、cd
    功能:改变工作目录。
    语法:cd [directory]
    用法:
    #cd ..返回上一层目录
    #cd ~进入自家目录
    8、pwd
    功能:显示当前工作目录
    用法:#pwd

    9、mkdir
    功能:创建一个目录(类似MSDOS下的md命令)。
    语法:mkdir [选项] dir-name
    - m 对新建目录设置存取权限。也可以用chmod命令设置。
    - p 可以是一个路径名称。此时若路径中的某些目录尚不存在, 加上此选项后, 系统将自动建立好那些尚不存在的目录,即一次可以建立多个目录。
    #mkdir –m a=rwx test
    #mkdir –m u=rwx,g=rx,o=rx test1
    #mkdir –m 755 test2
    #mkdir –p test3/test4(test3和test4均为新目录)

    10、rmdir
    功能:删除空目录。
    语法:rmdir [选项] dir-name
    - p 递归删除目录dirname,当子目录删除后其父目录为空时,也一同被删除。
    11、file
    功能:查看文件类型
    语法:file 文件名

    12、cat
    功能:查看文本文件的内容
    语法:cat 文件名
    13、more
    功能:分屏显示文本文件的内容。
    14、less
    功能:显示文本文件的内容,可使用pageup和pagedown上翻页下翻页。

    15、head
    功能:查看文件的开头部分内容
    语法:head [行数] 文件名
    用法:#head test.txt:显示前10行内容
    #head -20 test.txt 显示前20行内容。
    16、tail
    功能:查看文件的结尾部分内容。
    语法:tail [行数] 文件名
    默认的行数为10行。

    17、sort
    功能:对文本文件中的各行进行排序
    用法:sort 文件名
    例:#sort 123.txt >456.txt 将123.txt排序后重定向到456.txt文件中。
    18、uniq
    功能:将重复行从输出文件中删除,只留下每条记录的唯一样本
    语法: uniq 文件名
    #uniq 456.txt文件中的重复行删除后输出

    19、pr
    功能:处理文件以便打印,输出到标准输出
    语法:pr [参数] 文件名列表
    [参数]
    -d:将输出的每一行后加一新的空白行
    -n:输出行号
    如:#pr –n 123.txt


    20、ln
    功能:建立链接文件
    语法:ls [-s] 源文件名 目标文件名
    说明:链接文件分为硬连接和软连接,硬连接相当于一个数据源有两个文件名,删除一个文件另一个文件不变,修改一个文件的内容另一个文件的内容也跟着改变。硬连接不能和另一个目录链接,也不能和其他文件系统的文件进行链接。软链接相当于快捷方式,没有上面的限制,加-s参数创建软链接。

     

     

    21、wc
    功能:统计文件的行数、字符数和单词数。
    语法:wc [-lwc] 文件名
    -l: 只显示行数,-w:只显示单词数,-c:只显示字符总数。
    22、whatis
    功能:可以用一行内容显示对命令行后输入的关键词的说明。
    语法:whatis 关键词
    用法:#whatis find whereis

    23、Whereis
    功能:确定指定文件的源程序/二进制程序和手册部分的位置。
    用法:#whereis ls
    24、which
    功能:显示可执行命令的路径和它的别名。
    用法:#which ls
    25、locate
    功能:可以查找具体文件或命令的路径,可以查找具体的字符串或子串
    用法:locate 文件名或关键字

    26、du
    功能:统计文件和目录所占用的磁盘空间
    语法:du [-ask] 文件名或目录名
    -a:显示对涉及到的所有文件的统计,而不仅仅统计目录
    -s:只打印出合计数
    -k:以kB字节数显示

    Find使用范例
    find . -name ls.txt
    find . -name ls.txt –print
    find / -name ‘c??’ –print
    find / -name ‘f*’ –print
    find . -name ‘f*’ –exec ls –l {} \;
    find . -name f\* –ok rm {} \; (交互式提问)
    find . -perm 644 –mtime 4
    find . -name ‘c??’ –o -name ‘d??’


    28、grep
    功能:在文件中搜寻匹配的行并进行输出
    语法:grep [参数]<要找的字串><原文件>
    -num:输出匹配行前后各num行的内容
    -A num:输出匹配行后num行的内容
    -B num:输出匹配行前num行的内容
    -i:忽略大小写的区别
    -v:只显示出那些不包括某字串的行和文件,和默认的相反

    二、文件压缩和归档类命令
    1、gzip
    功能:是一种压缩程序,特点是可以得到最佳的压缩率,但速度较慢。
    语法:gzip [-vd9] 文件名
    -v:冗长型选项,可以显示每个文件的大小等
    -d:解压
    -9:产生最佳压缩效果,但速度较慢。

    2、gunzip
    功能:可以把压缩的文件解压成原始文件状态,可以解压扩展名为.gz,.z,.Z和.tgz等类型的压缩文件
    语法:gunzip [-v] 文件名
    -v:显示解压缩文件的冗长结果

    3、tar
    功能:可以归档多个文件和目录到一个.tar文件下,还可以从一个归档文件中抽取一个文件和目录。
    语法:tar [-c][-r][-t][-x][-v][-z][f 文件名] 文件和目录名
    -c:创建归档文件
    -r:增加文件到归档文件中
    -t:查看归档文件中的文件
    -x:解开归档文件
    -v:显示冗长信息
    -z:进行压缩和解压


    如: #tar –cvf back.tar 文件1 目录1 文件2
    #tar –rvf back.tar 文件3
    #tar –tf back.tar
    #tar –xvf back.tar
    #tar –czvf back.tar.gz 文件1 目录1 文件2
    #tar –xzvf back.tar.gz

     

    4、安装以rpm方式提供的软件
    Rpm(the red hat package manager)是一个开放的软件包管理系统。
    功能:可以安装和卸载RPM包的软件
    #rpm –ivh *.rpm 安装RPM包;
    #rpm –ivh –force *.rpm 在原先安装的基础上再强行安装一次;
    #rpm –Uvh *.rpm 升级rpm包
    #rpm –qa 查找列出系统中所有安装的rpm包
    #rpm –q sendmail:查看sendmail包的情况
    #rpm –ql sendmail:查看sendmail安装的位置
    #rpm –e *.rpm 卸载rpm包
    #rpm - qlp name.rpm 查看name.rpm有哪些文件
    #rpm - qf name.rpm 查看已经装好的文件属于哪个rpm包
    #rpm2cpio filename.rpm 使用“rpm2cpio”来从RPM文档中提取文件

    5、安装以源代码方式提供的软件
    (1)、解包解压:
    #tar –xzvf *.tar.gz 解包解压后会在当前目录下建立一个子目录,如xxxx
    (2)、#cd xxxx
    (3)、#./configure
    (4)、#make
    (5)、#make install

    三、系统状态类命令
    1、dmesg
    功能:显示引导时内核显示的状态信息
    #dmesg |grep -4 “eth0”显示状态信息中与eth0相关的前后4行内容
    2、uname
    功能:显示当前的系统信息
    #uname -a


    3、uptime
    功能:显示当前时间,自从上次重新引导之后系统运行的时间,服务器和多少用户链接以及系统前1、5、15分钟的负载信息。
    4、who
    功能:显示当前登录在系统上的用户信息。
    -r:查看系统运行等级
    -w,在登录帐号后面显示一个字符来表示用户的信息状态:
    +:允许写信息; -:不允许写信息; ?:不能找到终端设备

    5、w
    功能:查看其他登录的用户(who增强版)
    第一行输出内容:当前时间,系统启动到现在的时间,登录用户的数目,系统在最近1秒、5秒和15秒的平均负载
    第二行输出内容:登录帐号、终端名称、远程主机名、登录时间、空闲时间、JCPU、PCPU、当前正在运行进程的命令行。
    *JCPU时间指的是和该终端(tty)连接的所有进程占用的时间
    *PCPU时间则是指当前进程(即在WHAT项中显示的进程)所占用的时间

    6、whoami
    功能:显示当前用户名
    7、hostname
    功能:显示系统的主机名
    8、cal [月份] [年份]
    功能:显示日历
    9、bc
    功能:计算器,使用quit退出
    10、date
    功能:显示或修改日期时间。


    11、df
    功能:报告文件系统磁盘空间的使用情况
    语法:df[参数]
    [参数]
    -h:用常见的格式显示出大小(例如:1K,23M,2G等)
    -t:只显示指定类型的文件系统
    12、free
    功能:查看当前内存和交换空间的使用情况
    四、网络类命令
    1、write
    功能:向另外一个用户发信息,以Ctrl+D作为结束,普通用户发信息受到mesg状态影响。
    语法:write <用户名>
    2、wall
    功能:向所有用户广播信息,普通用户受到mesg状态影响。
    语法:wall [message]

    3、mesg
    功能:显示或设置是否接受其他用户发来的信息。
    语法:mesg [参数]
    [参数]
    y:接受从其他用户发来的信息
    n:不接受从其他用户发来的信息
    #mesg
    显示当前是否接受其他用户发来的信息

    4、ping
    功能:通过检查网络中其他主机的应答信息,来确认网络的连通性。
    语法:ping [参数] 主机名(或ip地址)
    参数:
    -c count:共发出count次信息。
    -R:显示路由表的详细信息

    5、telnet
    功能:远程登录
    语法:telnet [<主机名>][:端口号]
    6、ifconfig
    功能:配置网络接口
    语法:
    ifconfig [interface] [up][down][netmask mask]
    #ifconfig
    #ifconfig eth0 192.168.0.3 netmask 255.255.255.0 up

    7、netstat
    功能:显示本地系统的网络连接状态
    语法:netstat [-a][-r][-c][-i]
    -a:显示所有本地系统中的网络连接
    -r:显示路由表
    -c:显示连续的网络连接状态
    -i:显示全部网络接口信息。

    8、ftp
    功能:文件传输
    语法:ftp [<主机名>]
    子命令:
    ?:列出所有的FTP命令;
    pwd:显示远程主机的当前目录
    lcd:切换和显示本机主机的当前目录
    ls:列出远程主机当前目录下的内容
    !dir:列出本机主机的当前目录下的内容
    cd:切换远程主机的目录

    get:下载一个文件
    mget:成批下载文件
    put:上传一个文件
    mput:成批上传文件
    prompt:使用mget和mput时是否采用交互式询问
    bye:中止一个FTP连接
    open:打开一个FTP连接
    close:关闭一个FTP连接
    binary:采用二进制模式传输
    ascii:采用ascii模式传输
    type:查看传输模式

    2.2 shell
    一、shell简介
    二、shell功能

    一、shell简介
    (一)、定义:shell是用户与操作系统内核之间的接口,具有命令解释器和编程语言的双重功能。
    (二)、shell中的命令分为内部命令和外部命令,内部命令包含在shell自身之中的,如cd,exit等,查看内部命令的方法可用help命令;而外部命令是存在于文件系统某个目录下的具体的可执行程序,如cp等,查看外部命令的路径可用which。

    (三)、命令解释过程
    二、shell功能
    (一)、命令行解释
    1、交互模式
    2、后台运行:如#fsck / &
    (二)、通配符
    *:表示任一串字符
    ?:表示任一个字符
    […]:匹配方括号内的任意字符
    [!...]或[^…]:匹配除方括号内的任意字符
    [a-zA-Z]:匹配首字符是字母的所有文件


    (三)、重定向
    1、>:输出重定向 如:#ls >1.txt
    2、>>:追加重定向
    如:#cat /etc/inittab >>1.txt
    3、<:输入重定向 如#wc </etc/passwd
    4、<<!...!:输入重定向特例
    如#wc <<!
    hello
    it is a nice day
    !
    5、2>:错误重定向
    6、&>:同时实现输出重定向和错误重定向

    (四)、管道操作符 |
    功能:把一个命令的输出内容作为另外一个命令的输入内容。
    #ls |more:分屏显示
    #dmesg |grep eth0
    (五)、命令替换符` `
    功能:把一个命令的输出内容作为另外一个命令的参数。
    #cd `pwd`
    #tar –cvf zsan.tar `find / -user “zsan”`
    #tar –cvf conf.tar `ls /etc *.conf`

    (六)、命令执行顺序
    1、;按顺序执行命令 如#date;cal
    2、&&逻辑与的关系,只有前面的命令执行成功后面的命令才会被执行。
    如:#mail
    zsan@sje.cn <123.txt &&rm –fr 123.txt
    3、||逻辑或的关系,只有前面的命令执行失败后面的命令才会被执行。
    如:#write zsan <123.txt ||mail
    zsan@sje.cn <123.txt
    4、( )组合命令行中的命令,改变执行顺序
    如:#date;cal|wc与#(date;cal)|wc

    (七)、自动补全:在bash下输入命令时不必把命令输全,bash就能判断出用户所要输入的命令,可通过tab键完成自动补全功能。
    (八)、命令别名
    功能:可以使工作变得轻松的工具
    语法:alias [<别名>=“<原文件名>”]
    #alias 显示所有的别名
    #alias md=“mkdir” 建立别名
    #unalias md 取消别名

    (九)、命令历史
    功能:可以记录一定数目的以前在shell中输入的命令以避免重复劳动
    1、查看所有的历史命令:#history
    2、查看某条历史命令:#history n
    3、引用历史命令:#!<命令编号>

    2.3 vi的使用

    一、编辑模式下的常用命令
    1、0:移光标到当前行的行首
    2、$:移光标到当前行的行尾
    3、H:移光标到当前屏第一行的行首
    4、M:移光标到当前屏中间行的行首
    5、L:移光标到当前屏最后一行的行首
    6、pageup、pagedown:上翻页,下翻页
    7、ctrl+g:显示状态信息
    8、X:删除一个字符
    9、dd:删除或剪切光标所在的行
    10、d0:删除光标处到行首的内容
    11、d$:删除光标处到行尾的内容
    12、u:取消上次命令
    13、. :重复操作
    14、YY:复制当前行
    15、p:粘贴

    二、命令状态下操作:
    1、:n 跳行
    2、:w 保存
    3、:q 退出(须先保存)
    4、:w filename 另存为
    5、:wq 保存退出
    6、:q! 不保存强制退出
    7、:a,b w filename 将a行到b行的内容另存为
    8、:.,$ w filename 将当前行到行尾的内容另存为
    9、:1,. W filename 将第一行到当前行的内容另存为
    10、:/string 在全文中查找string字符串
    11、:a,b s/string1/string2/g 将a行到b行之间的所有string1替换成string2
    12、:% s/string1/string2/g 将全文中的string1替换成string2
    13、:e filename 新建文件
    14、: r filename 打开一个文件
    15、:f filename 重命名当前文件

    16、:n1,n2 co n3 将n1和n2行的内容复制到n3行位置上
    17、:n1,n2 m n3 将n1和n2行的内容移到n3行的位置上
    18、:n1,n2 d 将n1到n2行的内容删除掉
    19、:set number 设置行号
    20、:set autoindent 设置自动缩进
    21、:!Cmd 执行shell命令
    22、:r ! Cmd 将shell命令的执行结果作为文件的内容
    23、:sh 暂时退出vi到系统下,按ctrl+d结束
    24、:X 文件保存退出前加密。
     

    hls
    查看公开信息
    发送悄悄话给hls
    给hls发送Email
    查找hls发表的更多帖子
    添加 hls 到好友列表

    第三章:文件系统管理
    3.1 文件系统概述
    一、文件管理
    (一)、文件的类型
    1、普通文件:包括文本文件和二进制文件
    2、目录文件
    3、链接文件:包括硬链接和软链接。
    4、特殊文件:
    设备文件:包括字符类设备(如打印机)和块设备(如硬盘)以及空设备(null)
    管道文件:是一个先进先出(FIFO)的缓冲区。

    文件类型及其代表字符

    (二)、文件权限
    1、chmod
    功能:改变文件(目录)的访问权限
    权限的表示法有两种:
    一是采用符号标记模式进行更改
    二是采用八进制数指定新的访问权限
    符号表示法的格式:[ugoa][+-=][rwx]
    u:表示文件的所有者;
    g:表示文件所有者同组的用户;
    o:其他用户
    a:所有用户
    +:添加权限
    -:撤消权限
    =:指定权限
    r:读权限
    w:写权限
    x:执行权(或对目录的访问权)

    八进制数字表示法:
    用1—4个八进制数来表示,其中:
    第一位:
    用4表示setuid:设置使文件在执行阶段具有文件所有者的权限,如/usr/bin/passwd的权限设置 ;
    用2表示setgid:该权限只对目录有效. 目录被设置该位后, 任何用户在此目录下创建的文件都具有和该目录所属的组相同的组;
    用1表示sticky bit :该位可以理解为防删除位,一个文件是否可以被某用户删除, 主要取决于该文件所在的目录是否对该用户具有写权限. 如果没有写权限, 则这个目录下的所有文件都不能被删除, 同时也不能添加新的文件. 如果希望用户能够添加文件但同时不能删除别的文件, 则可以对目录使用sticky bit位. 用户对目录设置该位后, 就算对目录具有写权限, 也不能删除不属于该用户的文件。

    第二位:用来设置文件所有者的权限,用4表示可读,用2表示可写,用1表示可执行
    第三位:用来设置文件所在组用户的权限,用4表示可读,用2表示可写,用1表示可执行
    第四位:用来设置其他用户的权限,用4表示可读,用2表示可写,用1表示可执行。


    Chmod使用格式:
    Chmod [参数][模式]<文件或目录>
    参数:-R:改变目录及其所有子目录的文件权限。
    举例:
    #chmod u+x inittab
    #chmod ug+wx,o-x inittab
    #chmod 0644 inittab
    #chmod 0755 inittab
    #chmod –R 700 ~

    目录权限的补充说明:
    1、目录的只读访问不允许使用cd进入目录,必须要有执行的权限才能进入。
    2、只有执行权限只能进入目录,不能看到目录下的内容,要想看到目录下的文件名和目录名,需要可读权限。
    3、一个文件能不能被删除,主要看该文件所在的目录对用户是否具有写权限,如果目录对用户没有写权限,则该目录下的所有文件都不能被删除,文件所有者除外


    对特殊位的举例说明: 操作这些特殊位与操作文件权限的命令是一样的, 都是 chmod. 有两种方法来操作, 1) chmod u+s temp : 为temp文件加上setuid标志. (setuid 只对文件有效) chmod g+s tempdir :为tempdir目录加上setgid标志 (setgid 只对目录有效) chmod o+t tempdir : 为temp文件加上sticky标志 (sticky只对目录有效)

    2) 采用八进制方式. 对一般文件通过三组八进制数字来置标志, 如 666, 777, 644等. 如果设置这些特殊标志, 则在这组数字之外外加一组八进制数字. 如 4666, 2777等.
    设置完这些标志后, 可以用 ls -l 来查看. 如果有这些标志, 则会在原来的执行标志位置上显示. 如 rwsrw-r-- 表示有setuid标志 rwxrwsrw- 表示有setgid标志 rwxrw-rwt 表示有sticky标志 那么原来的执行标志x到哪里去了呢? 系统是这样规定的, 如果本来在该位上有x, 则这些特殊标志显示为小写字母 (s, s, t). 否则, 显示为大写字母 (S, S, T)


    2、chown
    功能:修改文件(目录)所有者和组别
    语法:
    chown [参数]<用户名[.组名]><文件或目录>
    参数:-R:递归地修改目录及其下面内容的所有权。
    #chown zsan history.doc
    #chown –R zsan.sales /home/zsan

    3、chgrp
    功能:改变文件的组所有权
    格式:chgrp [参数]<组><文件或目录>
    [参数]:-R:递归地将指定目录下的所有文件和子目录的组名修改为指定的组。
    #chgrp –R student /home/st01
    4、umask
    功能:用于设置文件的默认生成掩码,告诉系统当创建一个文件或目录时不应该赋予其哪些权限。

    (三)ext2(ext3)文件系统安全选项
    A:Atime。告诉系统不要修改对这个文件的最后访问时间
    S:Sync。一旦应用程序对这个文件执行了写操作,使系统立刻把修改的结果写到磁盘。 a:Append Only。系统只允许在这个文件之后追加数据,不允许任何进程覆盖或者截断这个文件。如果目录具有这个属性,系统将只允许在这个目录下建立和修改文件,而不允许删除任何文件。 i:Immutable。系统不允许对这个文件进行任何的修改。如果目录具有这个属性,那么任何的进程只能修改目录之下的文件,不允许建立和删除文件。
    ext2(ext3)文件系统安全选项
    d:No dump。在进行文件系统备份时,dump程序将忽略这个文件。 C:Compress。系统以透明的方式压缩这个文件。从这个文件读取时,返回的是解压之后的数据;而向这个文件中写入数据时,数据首先被压缩之后,才写入磁盘。 s:Secure Delete。让系统在删除这个文件时,使用0填充文件所在的区域。 u:Undelete。当一个应用程序请求删除这个文件,系统会保留其数据块以便以后能够恢复删除这个文件。
    chattr修改文件属性
    chattr +i filename 设置i属性
    chattr –i filename 取消i属性
    lsattr 查看设置的属性


    二、linux支持的文件系统:
    Ext2或ext3文件系统
    FAT(适用各种版本的DOS)
    NTFS(适用Windows NT -- Windows 2000)
    VFAT和FAT32(适用Windows 9x)
    HFS(适用MacOS)
    HPFS(适用OS/2)
    Swap(交换分区)

    3.2 fdisk分区工具
    #fdisk –l /dev/hda
    #fdisk /dev/hda
    :m 列出所有的分区命令
    :p 显示分区情况
    :d 删除原有的分区
    :n 增加新分区
    :t 改变分区类型
    :l 查看分区类型
    :a 设置活动分区
    : w 保存退出
    : q 不保存退出


    3.3 使用mkfs创建文件系统
    mkfs命令的格式是:mkfs 选项 设备名
    例如:
    mkfs –t ext2 –c /dev/hda2
    -t:指定文件系统类型
    -c:建立文件系统前先检测有无坏块

    #mke2fs –c /dev/hda2
    3.4 挂载和卸载文件系统
    挂载文件系统
    卸载文件系统
    挂载文件系统
    mount /dev/sdb1 /tmp/test1
    mount /mnt/floppy
    mount
    注意
    挂载目录必须存在
    Linux专门提供了挂载目录/mnt
    不要在挂载目录下进行挂载操作
    将软盘或光盘放入驱动器后在实施挂载操作
    卸载前不要取出软盘或光盘
    不能在同一个目录下挂载两个文件系统
    卸载文件系统
    umount /mnt/cdrom
    umount /dev/sdb1
    umount /tmp/test1
    mount –a:卸载所有挂载设备

    注意:不能在挂载目录下进行卸载操作
    3.5 软盘、光盘、USB硬盘的使用
    1、软盘格式化:fdformat –n /dev/fd0H1440
    2、建立文件系统
    mkfs –t ext2 –c /dev/fd0H1440
    3、挂载文件系统
    mount –t ext2 /dev/fd0H1440 /mnt/floppy
    4、使用
    cp /etc/lilo.conf /mnt/floppy
    mkdir /mnt/floppy/mydir1
    5、卸载
    umount /mount/floppy
    1、挂载文件系统
    mount –t iso9660 /dev/cdrom /mnt/cdrom

    mount /mnt/cdrom
    2、卸载
    umount /mnt/cdrom
    eject(弹出光盘)
    USB硬盘的使用
    USB硬盘在Linux系统下是被模拟成SCSI设备来使用的,因此对应的设备文件是/dev/sda,如果有多块USB硬盘,则设备文件依次是/dev/sdb、/dev/sdc等。
    用mount命令加-o loop选项挂载光盘镜像文件
    1、#mkdir /mnt/iso
    2、#mount –o loop rfdesktop4.iso /mnt/iso


    3.6在系统启动时自动挂装文件系统
    要系统自动挂载文件系统必须修改系统配置文件/etc/fstab。系统启动所要挂载的文件系统、挂载点、文件系统类型等都记录在/etc/fstab文件里。
    3.7 文件系统管理的常用命令
    df:显示文件系统的统计数据
    du:显示硬盘使用的统计信息
    ln:创建链接文件
    tar:文件打包
    fsck:文件系统检查命令
    dd:文件拷贝命令
    fsck
    功能:检查文件系统
    语法:fsck [选项]<设备名>
    选项:
    -t fstype:检查的文件系统类型
    -A 检查所有在/etc/fstab中列出的文件系统
    -p:整理文件系统,自动修正所有问题
    注意:
    1、当检查一个文件系统时,应该确保处于未挂装状态
    2、当要检查根文件系统时,应该使用急救软盘或安装光盘重新引导机器后时行

    fsck命令输入的错误代码

    Linux引导盘的制作
    #cd /lib/modules
    #mkbootdisk --device /dev/fd0 2.4.20-8
    制作引导盘的好处:
    1、替代LILO
    2、紧急情况下使用引导盘和急救盘恢复系统
    3、当其他系统覆盖了LILO
    dd:文件拷贝命令
    制作Linux安装启动盘
    dd if=boot.img ōf=/dev/fd0 bs=1440k
    制作redhat linux急救盘
    #dd if=rescue.img ōf=/dev/fd0
    rescue.img存放在redhat linux安装光盘的images目录中。
    备份和恢复软盘数据
    dd if= /dev/fd0 ōf=backup
    dd if=backup ōf= /dev/fd0


    第四章:用户管理
    本章主要内容
    4.1 用户和组管理概述
    4.2 用户帐号的管理
    4.3 组的管理
    4.4 磁盘限额

    4.1 用户和组管理概述
    一、帐号管理包括用户的管理、组的管理和口令的管理
    二、linux下的用户分为三类:
    1、超级用户:超级用户的uid和gid均为0
    2、普通用户:普通用户的uid和gid是在500-60000范围内的一个值
    3、伪用户:uid的值是在1-499之间,不能登录,只是满足系统管理的要求,如bin,sys,lp 等。

    三、linux下的组分为标准组和私有组:
    1、当在创建一个新用户时,若没有指定他所属于的组,系统就会建立一个和该用户同名的私有组;
    2、标准组可以容纳多个用户,若使用标准组,在创建一个新的用户时就可以指定他所属于的组。
    四、帐号系统文件
    1、linux下的帐号系统文件主要有/etc/passwd,/etc/group,/etc/shadow ,这些文件只有超级用户才可以修改


    2、其他文件或目录
    (1)、默认设置文件
    /etc/login.defs,/etc/default/useradd
    (2)、默认设置目录
    /etc/skel
    2.1 用户帐号管理
    一、创建新的用户帐号系统将会
    1、在/etc/passwd中添加一笔记录
    2、创建用户的自家目录
    3、在用户自家目录中设置默认的配置文件
    4、设置用户初始口令
    二、创建帐号
    Useradd [<选项>]<用户名>

     

    [<选项>]
    -u uid:指定新用户的uid,默认为使用当前最大的uid加1
    -g group:指定新用户所在的组,该组必须已经存在
    -G group:指定新用户的附加组
    -d dir :指定新用户的自家目录
    -s shell:指定新用户使用的shell,默认为bash,也可以使用chsh命令修改,/etc/shells
    -c comment:说明新用户的附加信息,如全名等
    -e expire:指定用户的登录失交效时间,格式yyyy-mm-dd
    -m 建立新用户的自家目录
    -M 不建立新用户的自家目录
    -R 建立一个系统用户

    举例:
    #useradd –g ll –e 12/31/2001 lei
    #passwd lei
    三、删除已存在的用户帐号
    Userdel –r lei
    -r :表示连同自家目录一起删除
    四、修改用户属性
    Usermod [<选项>]<用户名>
    其中[<选项>]和useradd中的选项基本相同,但增加
    -l:更改用户的帐号名
    -L:锁定用户
    -U:取消帐号锁定
    #usermod –l xjlei –d /home/xjlei –G girl lei


    五、成为超级用户
    修改用户的uid和gid为0即可。
    命令:usermod –u 0 –o zsan
    -o:强迫修改uid
    六、禁用和恢复用户帐户
    命令:passwd [<选项>]<用户名>
    [选项]
    -l:锁定用户
    -u:对被锁定的用户解锁
    -d:删除用户密码
    -S:查看用户帐号的状态,如是否被锁定等

     

    七、切换到其他用户
    命令:su [-] [username]
    说明:如果目录用户是普通用户,则可以切换到超级用户或其他普通用户,但需要口令,如果目录用户是超级用户,则可以直接切换到普通用户,不需要密码。
    [-] :连同工作环境一起切换。


    八、sudo
    sudo是可以让普通用户执行某个超级用户执行的程序,如:sudo vi /etc/shadow
    所有这些配置项要保存在/etc/sudoers文件中
    sudo文件中语法如下:
    1、用Host_Alias关键字定义主机列表
    如:Host_Alias RED=www,ftp
    2、用User_Alias关键字定义用户别名列表
    如:User_Alias US=wdn,zsan
    3、用Cmnd_Alias关键字定义命令别名列表
    如:Cmnd_Alias CMDS=/bin/rm,/bin/chown

    一个实例:/etc/sudoers
    User_Alias US=wdn
    User_Alias US1=lsi,wemz
    User_Alias US2=zsan
    US ALL=ALL
    US1 ALL=/sbin/shutdown
    US2 ALL=ALL,!/bin/su

    4.3 组的管理
    一、添加组
    命令:groupadd [<选项>]<组名>
    [选项]
    -g gid:指定新组的gid,默认为使用当前最大的gid加1
    -r:建立一个系统用户组,不指定-g选项,则分配一个1-499之间的值
    #groupadd –g 888 ll

    二、删除组
    命令:groupdel <组名>
    三、修改组的属性
    命令:groupmod [<选项>]<组名>
    其中选项与groupadd选项基本相同,但增加一个-n选项,用于修改新的组名。
    #groupmod –n girl ll
    四、为标准组添加用户
    命令:gpasswd [选项][用户][组]
    -a:把用户加入组
    -d:把用户从组中删除
    #gpasswd –a zsan sales

     

    五、查看当前用户属于哪些组
    groups [username]
    六、切换到某组运行(必须已属此组)
    newgrp [group]

     

    七、其他命令
    1、id命令
    功能:可以查看一个用户的uid和gid
    格式:id 用户名
    2、finger
    功能:查看用户的相关信息
    格式:finger 用户名
    3、chfn
    功能:修改用户信息
    格式:chfn 用户名
    4.4 磁盘限额
    一、安装磁盘限额
    在安装光盘中找到quota的rpm软件包。如:
    #rpm –ivh quota-version.i386.rpm
    可用rpm –q quota查看是否安装
    二、启用系统的quota功能
    编辑etc/fstab,在要启用磁盘限额的分区
    (如/home)行中的添加相应参数如
    /dev/hda6 /home ext3 rw defaults,usrquota,grpquota 0 2

    三、创建quota文件
    在/home分区中添加aquota.user和aquota.group文件
    #touch aquota.user
    #touch aquota.group
    系统重启,运行quotacheck –avug命令在配额文件中创建磁盘信息。
    四、设置用和组的quota
    对一个用户的磁盘使用限制有两种,一种是软限制(soft limit),一种是硬限制(hard limit),硬限制是分配给用户的最大磁盘空间,使用完了就立即拒绝用户再存放文件,而当用户的磁盘使用空间超过了软限制时,在一定期限内仍可继续存储文件,但系统会有警告。而这个期限可用edquota –t 来设置

    1、为用户设置quota
    #edquota –u zsan
    2、为组设置quota
    #edquota –g sales
    3、若为多个用户重复设置quota
    #edquota –p 参考用户 待设置用户
    #edquota –p zsan lsi wdn
    四、启动quota
    #quotaon -avug

    五、查看磁盘限额的情况
    #quota zsan
    #quota –a
    六、显示有关quota的摘要信息
    # repquota /home
     

    hls
    查看公开信息
    发送悄悄话给hls
    给hls发送Email
    查找hls发表的更多帖子
    添加 hls 到好友列表

    第五章 进程管理
    本章主要内容
    5.1 进程的基本概念
    5.2 进程的管理和监控
    5.3 进程的自动执行
    5.1 进程的基本概念
    一、程序、进程和作业的概念
    1、程序是机器指令的集合,一般以文件的形式存储在磁盘上,是静态的。
    2、进程是一个程序在地址空间中的一次执行活动,是动态的。
    3、作业是指用户提交给计算机进行加工的一项任务,是由用户程序、数据以及某种形式的控制信息组成。

    二、进程的类型
    1、交互进程:由一个shell启动的进程,既可以在前台运行,也可以在后台运行。
    2、批处理进程:不与特定的终端相关联,提交到等待队列中顺序执行进程。
    3、守护进程:在linux启动是初始化,需要时运行于后台的一些服务进程。

    三、进程的启动方式:
    1、手工启动,分为前台启动和后台启动,通常情况下,我们执行一个命令就会启动一个进程。
    #ls / –R >test 前台启动
    #ls / -R >test & 后台启动
    2、调度启动:事先设置好,根据用户要求让系统自动启动。
    2.2 进程的管理和监控
    一、查看系统中的进程
    1、ps [选项]
    [选项]
    -a 显示所有用户的进程,但不包括没有控制终端的进程
    -u 显示用户名和启动时间
    -x 显示没有控制终端的进程


    PS命令输出的重要信息的含义
    PID:进程号
    PPID:父进程的进程号
    TTY:进程启动的终端
    STAT:进程当前的状态,S代表休眠,R代表运行,T代表追踪或停止,Z代表僵尸进程,W代表进程没有固定的pages,<表示高优先级的进程,N代表低优先级的进程。
    TIME:进程自从启动以来占用CPU的总时间
    COMMAND/CMD:进程的命令名
    USER:用户名
    %CPU:占用CPU的时间与总时间的百分比
    %mem:占用内存与系统总内存的百分比
    SIZE:进程代码大小

    二、控制系统中的进程
    1、kill
    功能:杀死一个进程
    格式:kill -9 进程号
    2、renice
    功能:改变一个正在运行进程的优先级
    格式:renice –n pid
    -n:进程的优先级,大于0是降低优先级,小于0是提高优先级,优先级的范围是从19到-20

    3、 nohup
    功能:当用户退出登录后,进程仍然能够在后台继续运行.
    语法:nohup myprogram &
    4、top
    功能:以动态的方式显示进程状态
    Top命令的显示栏说明:
    PID:进程号
    User:进程的所有者
    Pri:进程运行的优先级
    Ni:nice值,表示进程的优先级
    VIRT:进程占用的虚拟内存的总量
    RES:进程占用的非swap内存的总量
    SHR:和其他进程共享内存的总量。
    S:进程的状态
    TIME+:进程的累积运行时间

     

    Top中的子命令
    l,t,m:调整显示的摘要信息,l是平均负载,t是cpu状态,m是内存信息
    f:用来添加、删除显示栏位
    u:列出某个用户的进程
    n:设置显示总进程数的最大值
    k,r:k用来杀死某个进程,r是renice
    q:退出TOP

     

    5、进程的挂起和恢复
    按ctrl+z可以暂停正在运行的进程,
    执行jobs可以显示当前终端下有哪些程序在后台运行以及哪些进程被挂起了。
    执行fg可以在前台恢复一个被挂起的进程。
    执行bg可以在后台恢复一个被挂成的进程。
    5.3 进程的自动运行
    1、at
    功能:指定在某一时刻执行命令
    格式:at [选项] 时间
    选项:
    -l:列出已经排定的任务
    -d n 删除序号为n的任务
    -v:显示命令将被执行的时间


    时间表示法:
    HH:MM 当天中的某小时、某分钟,如果此时刻已经过去了,

  • 基于Linux系统的TAR 源码包和RPM包的介绍

    2008-01-11 15:57:43

     

    基于Linux系统的包过滤防火墙

    第1 章、基于路由器的包过滤防火墙
    1.1 包过滤防火墙的一般概念
    1.1.1 什么是包过滤防火墙
    包过滤防火墙是用一个软件查看所流经的数据包的包头(header),由此决定整个包的命运。它可能会决定丢弃(DROP)这个包,可能会接受(ACCEPT)这个包(让这个包通过),也可能执行其它更复杂的动作。
    在Linux系统下,包过滤功能是内建于核心的(作为一个核心模块,或者直接内建),同时还有一些可以运用于数据包之上的技巧,不过最常用的依然是查看包头以决定包的命运。
    1.1.2 包过滤防火墙的工作层次
    包过滤是一种内置于Linux内核路由功能之上的防火墙类型,其防火墙工作在网络层。
    1.1.3 包过滤防火墙的工作原理
    (1)使用过滤器。数据包过滤用在内部主机和外部主机之间,        过滤系统是一台路由器或是一台主机。过滤系统根据过滤规则来决定是否让数据包通过。用于过滤数据包的路由器被称为过滤路由器。
    数据包过滤是通过对数据包的IP头和TCP头或UDP头的检查来实现的,主要信息有:
    * IP源地址
    * IP目标地址
    * 协议(TCP包、UDP包和ICMP包)
    * TCP或UDP包的源端口
    * TCP或UDP包的目标端口
    * ICMP消息类型
    * TCP包头中的ACK位
    * 数据包到达的端口
    * 数据包出去的端口
    在TCP/IP中,存在着一些标准的服务端口号,例如,HTTP的端口号为80。通过屏蔽特定的端口可以禁止特定的服务。包过滤系统可以阻塞内部主机和外部主机或另外一个网络之间的连接,例如,可以阻塞一些被视为是有敌意的或不可信的主机或网络连接到内部网络中。
    (2)过滤器的实现。数据包过滤一般使用过滤路由器来实现,这种路由器与普通的路由器有所不同。
    普通的路由器只检查数据包的目标地址,并选择一个达到目的地址的最佳路径。它处理数据包是以目标地址为基础的,存在着两种可能性:若路由器可以找到一个路径到达目标地址则发送出去;若路由器不知道如何发送数据包则通知数据包的发送者“数据包不可达”。
    过滤路由器会更加仔细地检查数据包,除了决定是否有到达目标地址的路径外,还要决定是否应该发送数据包。“应该与否”是由路由器的过滤策略决定并强行执行的。
    路由器的过滤策略主要有:
    * 拒绝来自某主机或某网段的所有连接。
    * 允许来自某主机或某网段的所有连接。
    * 拒绝来自某主机或某网段的指定端口的连接。
    * 允许来自某主机或某网段的指定端口的连接。
    * 拒绝本地主机或本地网络与其它主机或其它网络的所有连接。
    * 允许本地主机或本地网络与其它主机或其它网络的所有连接。
    * 拒绝本地主机或本地网络与其它主机或其它网络的指定端口的连接。
    * 允许本地主机或本地网络与其它主机或其它网络的指定端口的连接。
    1.1.4 包过滤器操作的基本过程
    下面做个简单的叙述:
    (1)包过滤规则必须被包过滤设备端口存储起来。
    (2)当包到达端口时,对包报头进行语法分析。大多数包过滤设备只检查IP、TCP、或UDP报头中的字段。
    (3)包过滤规则以特殊的方式存储。应用于包的规则的顺序与包过滤器规则存储顺序必须相同。
    (4)若一条规则阻止包传输或接收,则此包便不被允许。
    (5)若一条规则允许包传输或接收,则此包便可以被继续处理。
    (6)若包不满足任何一条规则,则此包便被阻塞。
    1.1.5 包过滤技术的优缺点
    (1)优点:
    →对于一个小型的、不太复杂的站点,包过滤比较容易实现。
    →因为过滤路由器工作在IP层和TCP层,所以处理包的速度比代理服务器快。
    →过滤路由器为用户提供了一种透明的服务,用户不需要改变客户端的任何应用程序,也不需要用户学习任何新的东西。因为过滤路由器工作在IP层和TCP层,而IP层和TCP层与应用层的问题毫不相关。所以,过滤路由器有时也被称为“包过滤网关”或“透明网关”,之所被称为网关,是因为包过滤路由器和传统路由器不同,它涉及到了传输层。
    →过滤路由器在价格上一般比代理服务器便宜。
    (2)缺点:
    →一些包过滤网关不支持有效的用户认证。
    →规则表很快会变得很大而且复杂,规则很难测试。随着表的增大和复杂性的增加,规则结构出现漏洞的可能  性也会增加。
    →这种防火墙最大的缺陷是它依赖一个单一的部件来保护系统。如果这个部件出现了问题,会使得网络大门敞开,而用户其至可能还不知道。
    →在一般情况下,如果外部用户被允许访问内部主机,则它就可以访问内部网上的任何主机。
    →包过滤防火墙只能阻止一种类型的IP欺骗,即外部主机伪装内部主机的IP,对于外部主机伪装外部主机的IP欺骗却不可能阻止,而且它不能防止DNS欺骗。
    虽然,包过滤防火墙有如上所述的缺点,但是在管理良好的小规模网络上,它能够正常的发挥其作用。一般情况下,人们不单独使用包过滤网关,而是将它和其他设备(如堡垒主机等)联合使用。
    1.2 Netfilter/iptables架构
    1.2.1 Linux下的包过滤防火墙管理工具
    从1.1内核开始,Linux系统就已经具有包过滤功能了,随着Linux内核版本的不断升级,Linux下的包过滤系统经历了如下3个阶段:
    → 在2.0的内核中,采用ipfwadm来操作内核包过滤规则。
    → 在2.2的内核中,采用ipchains来控制内核包过滤规则。
    →  在2.4内核中,采用一个全新的内核包过滤管理工具—iptables.
    Linux因其健壮性、可靠性、灵活性以及几乎无限范围的可定制性而在IT界变得非常受欢迎。Linux具有许多内置的能力,使开发人员可以根据自己的需要定制其工具、行为和外观,而无需昂贵的第三方工具。如果Linux系统连接到因特网或LAN、服务器或连接LAN和因特网的代理服务器,所要用到的一种内置能力就是针对网络上Linux系统的防火墙配置。可以在Netfilter/iptables IP信息包过滤系统(它集成在2.4.x版本的Linux内核中)的帮助下运用这种能力。Netfilter/iptables是与最新的2.4.x版本Linux内核集成的IP信息包过滤系统。
    与ipfwadm和ipchains这样的Linux信息包过滤方案相比,Netfilter/iptables信息包过滤系统是最新的解决方案,使用户更易于理解其工作原理,也具有更为强大的功能。对于Linux系统管理员、网络管理员以及家庭用户(他们想要根据自己特定的需求来配置防火墙、在防火墙解决方案上节省费用和对IP信息包过滤具有完全控制权)来说,Netfilter/iptables系统十分理想,且更容易被使用。
    1.2.2 新一代的Netfilter网络底层架构
    Netfilter是一种内核中用于扩展各种网络服务的结构化底层构架。Netfilter的设计思想是生成一个模块结构使之能够比较容易的扩展。新的特性加入到内核中并不需要重新启动内核。这样,可以通过简单的构造一个内核模块来实现网络新特性的扩展。为底层的网络特性扩展带来了极大的便利,使更多从事网络底层研发的人员能够集中精力实现新的网络特性。
    事实上,我们可以将Netfilter视为网络协议堆栈中可以让其它模块操作网络数据包的一系列“钩子”,在数据包通过协议堆栈的某些特定的点上,Netfilter框架允许一个模块转发或丢弃数据包、通过某种方式改变数据包、在用户空间(非内核模式)对包进行排队,当然也可以根本不去干涉它。
    (1)Netfilter/iptables系统的含义。Linux 2.4内核中Netfilter是新的用来实现防火墙的过滤器。 iptables是用来指定Netfilter规则的用户工具。
    Iptables只是一个管理内核包过滤的工具,它为用户配置防火墙规则提供了方便。
    Iptables可以加入、插入或删除核心包过滤表格(链)中的规则。实际上真正来执行这些规则的netfilter及其相关模块(如iptables模块和nat模块等)。
    因此,要使用Netfilter/iptables系统,必须首先有2.4版本内核的相关支持,同时必须安装iptables软件包。在Red Hat 9.0发行版中,此系统是默认的配置。
    (2)使用Netfilter/iptables替代ipchains的原因:
    →连接跟踪
    →自动碎片重装
    →改良的匹配规则
    →增强的日志功能
    →允许撕裂包中的任何信息
    →用户队列允许用户空间对包进行编程
    →支持内置包转发而舍弃了IPMASQANDM
    (3)Netfilter/iptables系统的主要功能
    →状态包过滤(连接跟踪)
    →各种网络地址翻译
    →灵活、易扩展的急智机制
    →大量的增强型补丁包
    (4)Netfilter/iptables的用途
    →建立Internet防火墙和基于状态的包过滤
    →用NAT和伪装(masquerading)共享上网
    →用NAT实现透明代理
    →用修改IP包头的ToS字段来实现更复杂的功能
    →和tc+iprouter2配合使用可以实现QoS路由
    (5)Netfilter/iptables系统的优点。Netfilter/iptables的最大优点是它可以配置有状态的防火墙,这是ipfwadm和ipchains等以前的工具都无法提供的一种重要功能。有状态的防火墙能够指定并记住为发送或接收信息包所建立的连接的状态。防火墙可以从信息包的连接跟踪状态获得该信息。在决定新的信息包过滤时,防火墙所使用的这些状态信息可以增加其效率和速度。有4种有效状态,名称分别为ESTABLISHED、INVALID、NEW和RELATED。其中:
    →状态ESTABLISHED指出该信息包属于已建立的连接,该连接一直用于发送和接收信息包并且完全有效。
    →状态INVALID指出该信息包与任何已知的流或连接都不相关联,它可能包含错误的数据或头。
    →状态NEW意味着该项信息包已经或将启动新的连接,或者它与尚味用于发送和接收信息包的连接相关联。
    →状态RELATED表示该信息包正在启动新连接,以及它与已建立的连接相关联。
    Netfilter/iptables的另一个重要优点是,它使用户可以完全控制防火墙配置和信息包过滤。您可以定制自己的规则来懑足您的特定需求,从而只允许您想要的网络流量进入系统。
    此外,Netfilter/iptables是免费的,这对于那些想要节省费用的人来说十分理想,它可以代替昂贵的防火墙解决方案。
    总之,最新的Linux内核2.4.x具有Netfilter/iptables系统这种内置的IP信息包过滤工具,它使配置防火墙和信息包过滤变得便宜且方便。Netfilter/iptables系统使其用户可以完全控制防火墙配置和信息包过滤。它允许为防火墙建立可定制化的规则来控制信息包过滤。它还允许配置有状态的防火墙。
    1.2.3 Netfilter/iptables的内核空间和用户空间
    虽然netfilter/iptables IP信息包过滤系统被称为单个实体,但它实际上由两个组件netfilter和iptables组成。
    (1)内核空间。Netfilter组件也称为内核空间(KernelSpace),是内核的一部分,由一些“表”(table)组成,每个表由若干“链”组成,而每条链中可以有一条或数条规则(rule)。
    (2)用户空间。Iptables组件是一种工具,也称为用户空间(userspace),它使插入、修改和除去信息包过滤表中的规则变得容易。
    1.2.4 Netfilter/iptables过滤系统是如何工作的
    Netfilter/iptables IP信息包过滤系统是一种功能强大的工具,可用于添加、编辑和除去规则,这些规则是在做包过滤决定时所遵循的依据。这些规则存储在专用的信息包过滤表中,而这些表集成在Linux内核中。在信息包过滤表中,规则被分组在链(chain)中。
    (1)用户使用iptables命令在用户空间设置过滤规则。通过使用用户空间可以构建用户自己的定制过滤规则,这些规则存储在内核空间的信息包过滤表中。这些规则具有目标,它们告诉内核对来自某些源、前往某些目的地或具有某些协议类型的信息包做些什么。如果某个信息包与规则匹配,那么使用目标ACCEPT允许该信息包通过。还可以使用目标DROP或REJECT来阻塞并杀死信息包。对于可对信息包执行的其它操作,还有许多其它目标。
    根据规则所处理的信息包的类型,可以将规则分组在链中。
    →处理入站信息包的规则被添加到INPUT链中。
    →处理出站信息包的规则被添加到OUTPUT链中。
    →处理正在转发的信息包的规则被添加到FORWARD链中。
    这3个链是系统默认的表(filter)中内置的3个默认主链。每个链都有一个策略,它定义默认目标,也就是要执行的默认操作,当信息包与链中的任何规则都不匹配时,执行此操作。
    (2)内核空间接管过滤工作。当规则建立并将链放在filter表之后,        就可以开始进行真正的信息包过滤工作了。这时内核空间从用户空间接管工作。
    包过滤工作要经过如下的步骤:
    1)路由。当信息包到达防火墙时,内核先检查信息包的头信息,尤其是信息包的目的地。我们将这个过程称为路由。
    2)根据情况将数据包送往包过滤表(filter)的不同的链。
    →如果信息包源自外界并且数据包的目的地址是本机,而且防火墙是打开的,那么内核将它传递到内核空间信息包过滤表的INPUT链。
    →如果信息包源自系统本机,并且此信息包要前往另一个系统,那么信息包被传递到OUTPUT链。
    →信息包源自广域网前往局域网或相反方向的信息包被传递到FORWARD链。
    3)规则检查。将信息包的头信息与它所传递到的链中的每条规则进行比较,看它是否与某条规则完全匹配。
    →如果信息包与某条规则匹配,那么内核就对该信息包执行由该项规则的目标指定的操作。
    &如果目标为ACCEPT,则允许该信息包通过,并将该包发给相应的本地进程处理。
    &如果目标为DROP或REJECT,则不允许该信息包通过,并将该包阻塞并杀死。
    →如果信息包与这条规则不匹配,那么它将与链中的下一条规则进行比较。
    →最后,如果信息包与链中的任何规则都不匹配,那么内核将参考该链的策略来决定如何处理该信息包。理想的策略应该告诉内核DROP该信息包。
    1.2.5 Red Hat linux 9中的Netfilter/iptables
    Red Hat linux 9使用2.4版本的内核,并且内核的编译选项中包含对Netfilter的支持,同时iptables软件包是被默认安装的,所以可以直接使用。
    另外,为了完成转发功能,必须打开系统内核的IP转发功能。使Linux变成路由器。
    在Red Hat中有两种方法:
    (1)修改内核变量ip_forward
    #echo “1”>;/proc/sys/net/ipv4/ip_forward
    (2)修改脚本/etc/sysconfig/network。
    将FORWARD_IPV4=false
    改为FORWARD_IPV4=true
    第2章、用用户空间命令iptables实现包过滤
    2.1 相关的TCP/IP知识
    2.1.1建立TCP连接(通过3次握手实现)
    假如服务器A和客户机B通信。
    (1)B->;A。当B要和A通信时,B首先向A发一个SYN标记的包,告诉A请求建立连接。只有当A收到B发来的SYN包,才可以建立连接,除此之外别无它法。因此,如果你的防火墙丢弃所有的发往外网接口的SYN包,那么你将不能让外部任何主机主动建立连接。
    (2)B<-A。接着,A收到后会发一个对SYN包的确认包(SYN/ACK)回去,表示对第一个SYN包的确认,并继续握手操作。
    (3)B->;A。B收到SYN/ACK包后,B发一个确认包(ACK),通知A连接已建立。至此,3次握手完成,一个TCP连接完成。
    需要注意的是,当3次握手完成、连接建立以后,TCP连接的每个包都会设置ACK位。这就是为何连接跟踪很重要的原因了,没有连接跟踪,防火墙将无法判断收到的ACK包是否属于一个已经建立的连接。
    2.1.2 结束TCP连接(通过4次握手实现)
    假如服务器A和客户机B通信。注意,由于TCP连接是双向连接,因此关闭连接需要在两个方向上做。
    (1)B->;A。当B要与A结束通信时,B首先向A发一个FIN标记的包,告诉A请求结束连接。由于连接还没有关闭,FIN包总是打上ACK标记。没有ACK标记而仅有FIN标记的包不是合法的包,并且通常被认为是恶意的。
    (2)B<-A。A送出ACK包给B,表示成功地中止B->;A传输通道。不过A->;B可能还有数据包需要传送,所以A->;B传输通道仍旧继续畅通,直到传输完毕才会进入下一步。
    (3)B<-A。当A完成B<-A的传输后,便送出ACK/FIN包。
    (4)B->;A。B送出ACK包给A进行确认。
    2.1.3 发送连接复位包结束TCP连接
    4次握手不是结束TCP连接的唯一方法。有时,如果主机需要尽快关闭连接(或连接超时,端口或主机不可达),RST包将被发送。注意,由于RST包不是TCP连接中的必须部分,可以只发送RST包(即不带ACK标记)。但在正常的TCP连接中RST包可以带ACK确认标记。注意,RST包是可以不要收方进行确认的。
    2.1.4 无效的TCP标记
    至此,已经看到了SYN、ACK、FIN、和RST标记。另外,还有PSH和URG标记。
    最常见的非法组合是SYN/FIN包。注意,由于SYN包是用来初始化连接的,它不可能和FIN以及RST标记一起出现,这也是一个恶意攻击。
    当网络中出现别的一些组合(如SYN/FIN/PSH、SYN/FIN/RST、SYN/FIN/RST/PSH),很明显网络肯定受到了攻击。
    另外,已知的非法包还有FIN(无ACK标记)和“NULL”包。如同早先讨论的,由于ACK/FIN包的出现是为了结束一个TCP连接,那么正常的FIN包总是带有ACK标记的。“NULL”包就是没有任何TCP标记的包(URG、ACK、PSH、RST、SYN、FIN都为0)。
    在正常的网络活动下,到目前为止TCP协议栈不可能产生带有上面提到的任何一个标记组合的TCP包。当你发现这些不正常的包时,肯定有人对你的网络不怀好意。
    2.1.5 ICMP类型
    ICMP是网间控制消息协议,用来在主机/路由器之间传递控制信息的协议。ICMP包可以包含诊断信息(ping 、 tracerouter)、错误信息(网络/主机/端口不可达),信息(时间戳timestamp,地址掩码address mask等)、或控制信息(source quench、redirect等)。
    使用包过滤可以拒绝指定的ICMP类型。
    此外,下面类型的ICMP信息建议丢弃。
    Redirect(5)、Alternate Host Address(6)、Router Advertisement(9)能用来转发通信。       
    Echo(8)、Timestamp(13)、Address Mask Request(17)能用来分别判断主机是否启动、本地时间和地址掩码。它们是和返回的信息类别有关的。其本身是不能被利用的,但它们泄漏出的信息对攻击者是有用的,所以建议丢弃这些类型的ICMP。
    关于ICMP类型的更详细的表述参见RFC792。
    2.2 iptables语法
    2.2.1 Iptables的优点
    → iptables允许建立状态(stateful)防火墙,就是在内存中保存穿过防火墙的每条连接。这种模式对于有效地配置FTP和DNS以及其它网络服务是必要的。
    →iptables能够过滤TCP标志任意组合报文,还能够过滤MAC地址。
    →系统日志比ipchains更容易配置,扩展性也更好。
    →对于网络地址转换(Network Address Translation)和透明代理的支持,Netfilter更为强大和易于使用。
    →iptables能够阻止某些DoS攻击,例如SYS洪泛攻击。
    2.2.2 Iptables的规则要素
    一条iptables规则基本上应该包含5个要素:
    →指定表(table)
    →指定操作命令(command)
    →指定链(chains)
    →指定规则匹配器(matcher)
    →指定目标动作(target)
    (1)表。Iptables从其使用的3个表而得名,分别是filter、nat、mangle。对于包过滤防火墙只使用filter表。表filter是默认的表,无需显示说明。
    (2)操作命令。包括添加、删除、更新等。
    (3)链。对于包过滤防火墙可操作filter表中的INPUT链、OUTPUT链和FORWARD链。也可以操作由用户自己定义的自定义链。
    (4)规则匹配器。可以指定各种规则匹配,如IP地址、端口、包类型等。
    目标动作。当规则匹配一个包时,真正要执行的任务用目标标识。最常用的内置目标分别是:
    →ACCEPT表示允许包通过
    →DROP表示被丢弃
    此外,包过滤防火墙还可以使用扩展的目标:
    →REJECT表示拒绝包,丢弃包的同时给发送者发送没有接受的通知。
    →LOG表示包的有关信息被记录日志。
    →TOS表示改写包的ToS的值。
    要使用上述的扩展目标,必须在内核中激活相应选项或者装载了相应的内核模块。
    2.2.3 Iptables工具的调用语法
    Iptables的语法非常复杂,要查看该工具的完整语法,应该查看其手册页。
    Iptables的语法通常可以简化为下面的形式:
    Iptables[-t table]CMD[chain][rule-matcher][-j target]
    其中:tables为表名,CMD为操作命令,chain为链名,rule-matcher为规则匹配器,target为目标动作。
    2.2.4 制定永久性规则
      iptables软件包提供了两个命令分别用于保存和恢复规则集。可以使用下在的命令转储在内存中的内核规则集。其中/etc/sysconfig/iptables是iptables守护进程调用的默认规则集文件:
    #/sbin/iptables-save >; /etc/sysconfig/iptables
    要恢复原来的规则库,需使用命令:
    #/sbin/iptables-restore < /etc/sysconfig/iptables
    为了使得用iptables命令配置的规则在下次启动机器时还能被使用,有两种主法。
    (1)使用iptables的启动脚本实现。Iptables的启动脚本/etc/rc.d/init.d/iptables每次启动时都使用/etc/sysconfig/iptables所提供的规则进行规则恢复,并可以使用如下的命令保存规则:
    #service iptables save
    (2) 在自定义脚本中用iptables命令直接创建规则集。可以直接用iptables命令编写一个规则脚本,并在启动时执行这个脚本。
    例如:若规则脚本的文件名为/etc/fw/rules,则可以在启动脚本/etc/rd.d/init.d/rc.local中加入下面的代码:
    if[-x /etc/fw/rules];then /etc/fw/rules;fi;
    这样,机器每次启动时即可执行该规则脚本。
    如果使用此种方式,建议使用ntsysv命令关闭系统的iptables守护进程。
    2.3 iptables命令使用举例
    2.3.1 链的基本操作
    (1)清除所有的规则。通常在开始配置包过滤防火墙之初清除所有的规则,重新开始配置,以免原有的规则影响新的设定。使用如下命令进行:
    1)        清除预设表filter中所有规则链中的规则。
    #iptables -F
    2)清除预设表filter中使用者自定义链中的规则。
    #iptables -X
    3)将指定链所有规则的包字节记数器清零。
    #iptables -Z
    (2)设置链的默认策略。一般地,配置链的默认策略有两种方法。
    1)        首先允许所有的包,然后再禁止有危险的包通过防火墙。即“没有被拒绝的都允许”。这种方法对于用户而言比较灵活方便,但对系统而言,容易引起严重的安全问题。
    为此,应该使用如下的初始化命令:
    #iptables -P INPUT ACCEPT
    #iptables -P OUTPUT ACCEPT
    #iptables -P FORWARD ACCEPT
    2)        首先禁止所有的包,然后再根据需要的服务允许特定的包通过防火墙。即“没有明确允许的都被拒绝”。这种方法最安全,但不太方便。为了使得系统有足够的安全性,一般采用此种策略进行iptables防火墙的配置。
    为此,应该使用如下的初始化命令:
    #iptables -P INPUT DROP
    #iptables -P OUTPUT DROP
    #iptables -P FORWAED DROP
    3)列出表/链中的所有规则。包过滤防火墙只使用filter表,此表为默认的表,因此可以使用下面的命令列出filter表中所有规则:
    #iptables -L
    使用上面的命令时,iptables将逆向解析IP地址,这将发费很多时间,从而造成信息出来的非常慢。为了解决这个问题,可以使用下面的带有-n参数的命令(-n参数用于显示数字化的地址和端口):
    #iptables -L -n
    4)向链中添加规则。下面的语句用于开放网络接口:
    #iptables -A INPUT -i lo -j ACCEPT
    #iptables -A OUTPUT -o lo -j ACCEPT
    #iptables -A  INPUT -i  eth0 -j ACCEPT  
    #iptables -A OUTPUT -o eth0 -j ACCEPT
    #iptables -A FORWARD -i eth0 -j ACCEPT
    #iptables -A FPRWAED -o eth0 -j ACCEPT
    5)使用用户自定义链。下面是一个用户自定义链的创建、修改和调用的简单命令序列:
    #iptables -N custom
    #iptables -A custom -s 0/0 -d 0/0 -p icmp -j DROP
    #iptables -A INPUT -s 0/0 -d 0/0 -j custom
    首先使用带-N参数的iptables命令新建了一个名为custom的用户逢定义链。然后使用带-A参数的命令添加了一条用户自定义的堵截规则,该规则丢弃全部的ICMP包。最后向默认的INPUT链加入一条规则,使所有的包都由custom自定义链处理。结果全部的ICMP包都将被丢弃。
    2.3.2 设置基本的规则匹配
    下面举例说明iptables的基本规则匹配(忽略目标动作):
    (1)指定协议匹配
    1)匹配指定的协议
    #iptables -A INPUT -p tcp
    2)匹配指定协议之外的所有协议
    #iptables -A INPUT -p !tcp
    (2)指定地址匹配
    1)指定匹配的主机
    #iptables -A INPUT -s 192.168.1.1
    2)指定匹配的网络
    #iptables -A INPUT -s 192.168.1.0/24
    3)匹配指定主机之外的地址。
    #iptables -A FORWARD -s ! 192.168.0.1
    4)匹配指定网络之外的网络
    #iptables -A FORWARD -s ! 192.168.0.0/24
    (3)指定网络接口匹配。
    1)指定单一的网络接口匹配。
    #iptables -A INPUT -i eth0
    #iptables -A FORWARD -o eth0
    2)指定同类型的网络接口匹配
    #iptables -A FORWARD -o ppp+
    (4)指定端口匹配
    1)指定单一的端口匹配。
    #iptables -A INPUT -p tcp-sport www
    #iptables -A INPUT -p tcp-sport 80
    #iptables -A INPUT -p tcp-sport 53
    #iptables -A INPUT -p udp-dport 53
    2)匹配指定端口之外的端口。
    #iptables -A INPUT -p tcp-dport ! 22
    3)匹配指定端口的范围。
    #iptables -A INPUT -p tcp-soprt 22:80
    4)匹配ICMP端口和ICMP类型。
    #iptables -A INPUT -p icmp --icmp-type 8
    5)指定ip碎片
    在TCP/IP通信过程中,每一个网络接口都有一个最大的传输单元(MTU),这个参数定义了可以通过的数据包的最大尺寸。如果一个数据包大于这个参数值时,系统会将其划分成更小的数个数据包(称之为ip碎片)来传输,而接收方则对这些ip碎片再进行重组以还原整个包。
    但是在进行包过滤的时候,ip碎片会导致这样一个问题:当系统将大数据包划分成ip碎片传送时,第一个碎片含有完整的包头信息(IP+TCP、UDP和ICMP),但是后续的碎片只有包头的部分信息(如源地址、目的地址)。因此,检查后面的ip碎片的头部(就像有TCP、UDP和ICMP一样)是不可能的。假如有这样一条规则:
    #iptables -A FORWARD -p tcp -s 192.168.1.0/24 -d 192.168.2.100 --dport 80 -j ACCEPT
    并且这时的FORWARD的策略(policy)为DROP时,系统只会让第一个ip碎片通过,而丢掉其余的ip碎片,因为第一个碎片含有完整的包头信息,可以满足该规则的条件,而余下的碎片因为包头信息不完整而无法满足规则定义的条件,因而无法通过。
    可以通过-fragment/-f选项来指定第二个及其以后的ip碎片,以上面的例子为例,我们可以再加上这样一条规则来解决这个问题:
    #iptables -A FORWARD -f -s 192.168.1.0/24 -d 192.168.2.100 -j ACCEPT
    但是需要注意的是,现在已经有许多进行ip碎片攻击的实例(例如向Win98 NT4SP5,6 Win2K发送大量的ip碎片进行DoS攻击),因此允许ip碎片通过是有安全隐患的,对于这一点可以采用iptables的匹配扩展来进行限制。
    2.3.3 设置扩展的规则匹配
    要获得匹配的简要说明,可以使用如下的命令:
    #iptables -m name_of_match -help
    下面举例说明iptables的扩展规则匹配(忽略目标动作):
    (1)多端口匹配扩展。
    1)匹配多个源端口。
    #iptables -A INPUT -p tcp -m multiport-source-port 22,53,80,110
    2)匹配多个目的端口
    #iptables -A INPUT -p tcp -m multiport-destionation-port 22,53,80,110
    3)匹配多个端口(无论源源端口还是目的端口)。
    #iptables -A INPUT -p tcp -m multiport -port 22,53,80,110
    (2)指定TCP匹配扩展
    通过使用-tcp-flags选项可以根据tcp包的标志位进行过滤,该选项后接两个参数:第一个参数为要检查的标志位,可以是SYN、ACK、FIN、URG、PSH的组合,可以用ALL指定所有标志位:第二个参数是标志位值为1的标志。
    #iptables -A INPUT -p tcp-tcp-flags SYN,FIN,ACK SYN
    表示SYN、ACK、FIN的标志都要被检查,但是只有设置了SYN的才匹配。
    #iptables -A INPUT -p tcp-tcp-flags ALL SYN,ACK
    表示ALL(SYN,ACK,FIN,RST,URG,PSH)的标志都要被检查,但是只有设置了SYN和ACK的才匹配。
    选项-syn是以上的一种特殊情况,相当于“--tcp-flags SYN,RST,ACK SYN“的简写。
    #iptables -p tc-syn
    (3)limit速率匹配扩展。
    1)指定单位时间内允许通过的数据包的个数。
    单位时间可以是/second、/minute、/hour、/day或使用第一个字母。例如:
    #iptables -A INPUT -m limit-limit 300/hour
    表示限制每小时允许通过300个数据包。
    2)指定触发事件的阀值。
    使用-limit-burst指定触发事件的阀值(默认是5),用来比对瞬间大量数据包的数量。
    #iptables -A INPUT -m limit-limit-burst 10
    上面的例子是用来比对一次同时涌入的封包是否超过10个,超过此上限的包将被直接丢弃。
    3)同时指定速率限制和触发阀值。
    #iptables -A INPUT -p icmp -m limit-limit 3/m-limit-burst 3
    假设均匀通过,平均每分钟3个,那么触发阀值burst保持为3个,如果每分钟通过的包的数目小于3,那么触发阀值burst将在每个周期(若每分钟允许通过3个,则周期数为20秒)后加1,但最大值为3。每分钟要通过的包的数量如果超过3,那么触发阀值burst将减掉超出的数值,例如第二分钟有4个包,那么触发阀值burst变成2,同时4个包都可以通过,第三分钟有6个包,则只能通过5个,触发阀值burst将变成0。之后,每分钟如果包数小于等于3,则触发阀值burst将加1,如果每分钟包数大于3,触发阀值burst将逐渐减小最终维持为0。
    即每分钟所允许的最大包数量为限制速率(本例为3)加上当前的触发阀值burst数。在任何情况下,都可以保证3个包通过,触发阀值burst相当于是允许额外的包数量。
    (4)基于状态的匹配扩展(连接跟踪)。  
    每个网络连接包括以下信息:源地址、目的地址、源端口、目的湍口,称为套接字对(socket pairs);协议类型、连接状态(TCP协议)和超时时间等。防火墙把这些信息称为状态(stateful),能够检测每个连接状态的防火墙叫作状态包过滤防火墙。它除了能够完成简单包过滤防火墙的包过滤工作外,还在自己的内存中维护一个跟踪连接状态的表,比简单包过滤防火墙具有更大的安全性。iptables与ipchains的不同之处在于iptables可以使用连接状态信息,创建基于包的状态的规则匹配。
    基于状态匹配创建规则的命令格式如下:
    iptables -m state-state [!]state [,state,state,state]
    其中,state表是一个用逗号分割的列表,用来指定的连接状态可以是如下的4种:
    →NEW:该包想要开始一个连接(重新连接或将连接重定向)。
    →RELATED:该包是属于某个已经建立连接所建立的新连接。例如:FTP的数据传输连接和控制连接之间就是RELATED关系。
    →ESTABLISHED:该包属于某个已经建立的连接。
    →INVALID:该包不匹配于任何连接,通常这些包会被DROP。
    例如:
    1)在INPUT链添加一条规则,匹配已经建立的连接或由已经建立的连接所建立的新连接。即匹配所有的TCP回应包。
    #iptables -A INPUT -m state-state RELATED,ESTABLISHED
    2)在INPUTP链添加一条规则,匹配所有从非eth0接口来的连接请求包。
    #iptables -A INPUT -m state-state NEW -i ! eth0
    又如,对于ftp连接可以使用下面的连接跟踪:1)被动ftp连接模式。
    #iptables -A INPUT -p tcp-sport 1024: --dport 1024: -m state-state ESTABLES -j ACCEPT
    #iptables -A OUTPUT -p tcp-sport 1024: --dport 1024: -m state-state ESTABLISHED,RELATED -j ACCEPT
    2)主动ftp连接模式。
    #iptables -A INPUT -p tcp-sport 20 -m state-state ESTABLISHED,RELATED -j ACCEPT -m state-state ESTABLISHED -j ACCEPT
    (5)TOS匹配扩展。
    所有数据包的首部都有一个称为服务类型的专用字段。该字段用于当数据包经过路由器时区分优先顺序。
    使用ToS字段,可以使用某种类型的数据包优先于其它的数据包。有标记的数据包在路由器中进行不同的处理。设置ToS字段的工作是在网络层进行的。有关ToS的具体工作过程请参专考RFC1349。
    在数据包中设置ToS字段的主要原因是:对不同类型的数据包加以区分,从而在流量较高的网络上减少网络拥塞。
    数据包的ToS字段用一个字节表示。此字节的高3位舍弃不用,最低位使用固定值0,因此,有效位共有4个。有效位分别用来控制数据包的最小延时,最大吞吐量,最大可靠度和最小成本。其中,
    →最小延时:用于减少数据包从路由到达主机的时间。
    →最大吞吐量:用于提高数据传输量。适用于FTP数据端口,HTTP大文件传输和大量的POP3传输。
    →最大可靠度:用来试图减少数据重传。
    →最小成本:通常只在商业产品中使用。
    要创建与ToS字段匹配的规则,可以使用下面的语法:
    iptables [-t table]CMD[chain]-m tos tos_value [-j target]
    其中tos_value可以是0x02、0x04、0x06、0x08、0x10。
    例如:
    #iptables -A INPUT -p tcp -m tos 0x08
    表示匹配在ToS字段中设置了最大吞吐量的包。
    2.3.4 设置目标扩展
    要获得目标的简要说明,可以使用如下的命令:
    #iptables -j name_of_TARGET-help
    目标扩展由内核模块组成,而且iptables的一个可选扩展提供了新的命令行选项。在几个扩展是包含在默认netfilter发布中的。
    (1)设置包的ToS值。为了设置数据包的ToS值,需要使用ToS目标扩展。设置ToS的值,只能对FORWARD、OUTPUT和PREROUTING链进行。语法如下:
    iptables [-t table]CMD[chain][rule-matcher]-j TOS-set-tos tos_value
    其中tos_value可以是0x02、0x04、0x06、0x08、0x10。
    下面是使用ToS目标扩展设置ToS值的一些例子:
    #iptables -A OUTPUT -p tcp -m tcp-dport 21 -j TOS-set-tos 0x10
    #iptables -A OUTPUT -p tcp -m tcp-dport 22 -j TOS-set-tos 0x10
    #iptables -A OUTPUT -p tcp -m tcp-dport 110 -j TOS-set-tos 0x08
    (2)日志记录。iptables使用新的目标扩展LOG来实现日志记录。LOG目标用syslogd记录此包并继续传播。LOG目标扩展还可以使用如下的一些参数:
    → --log-level
    跟踪一个级别名称或数字。合适的名字是'debug'、'info'、'notice'、'warning'、'err'、'crit'、'alert'和'emerg',相当于数字7到0。参考syslog.conf的手册可获取这些级别的说明。默认是'warning'。
    → --log-prefix
    跟踪一个最多29个字符的字符串,它被写入到log信息的开始处,这样可以方便地使用grep对日志进行过滤。
    另外,在使用LOG目标扩展的同时,还可以使用limit match,这样可以使记录有用日志的同时确保日志记录不会变得冗长。
    下面是使用LOG目标扩展的一些例子:
    #iptables -A FORWARD -m tcp -p tcp -j LOG
    #iptables -A FORWARD -m icmp -p icmp-sport echo-reply -j LOG
    #iptables -A INPUT -m limit-limit 3/m-limit-burst 3 -j LOG-log-prefix "INPUT packet died:"
    第3章、包过滤防火墙配置举例
    3.1 建立包过滤防火墙
    3.1.1网络结构
    本节为一个的网络结构建立一个包过滤防火墙。
    这个网络结构假设内部网有有效的Internet地址。为了将内部网段198.168.80.0/24与Internet隔离,在内部网络和Internet之间使用了包过滤防火墙。防火墙的网接口是eth1(198.168.80.254),防火墙的Internet接口是eth0(198.199.37.254)。加外,内网中有3台服务器对外提供服务。分别为:
    → WWW服务器:IP地址为198.168.80.251
    → FTP服务器:IP地址为198.168.80.252
    → E-mail服务器:IP地址为198.168.80.253
    3.1.2 防火墙的建立过程
    本例主要是对内部的各种服务器提供保护。下面采用编辑并执行可执行脚本的方法建立此防火墙。具本过程如下:
    #!/sbin/bash
    #在屏幕上显示信息
    echo "Starting iptables rules..."
    #开启内核转发功能
    echo "1">;/proc/sys/net/ipv4/ip_forward
    #定义变量
    IPT=/sbin/iptables
    WWW-SERVER=198.168.80.251
    FTP-SERVER=198.168.80.252
    EMAIL-SERVER=198.168.80.253
    IP_RANGE="198.168.80.0/24"
    #刷新所有的链的规则
    $IPT -F
    #首先禁止转发任何包,然后再一步步设置允许通过的包
    #所以首先设置防火墙FORWARD链的策略为DROP
    $IPT -P FORWARD DROP
    #下面设置关于服务器的包过滤规则
    #由于服务器/客户机交互是双向的,所以不仅仅要设置数据包
    #出去的规则,还要设置数据包返回的规则
    #
    #(1)WWW服务
    #服务端口为80,采用tcp或udp协议
    #规则为eth0=>;允许目的为内部网WWW服务器的包
    $IPT -A FORWARD -p tcp -d $WWW-SERVER-dport www -i eth0 -j ACCEPT
    #
    #(2)FTP服务
    #服务端口为21,数据端口20
    #FTP的传输模式有主动和被动之分,FTP服务采用tcp协议
    #规则为:eth0=>;仅允许目的为内部网ftp服务器的包
    $IPT -A FORWARD -p tcp -d $FTP-SERVER -dport ftp -i eth0 -j ACCEPT
    #
    # (3)EMAIL服务
    #包含两个协议,一个是smtp,另一个是pop3
    #出于安全性考虑,通常只提供对内的pop3服务
    #所以在这里我们只考虑对smtp的安全性问题
    #smtp端口为25,采用tcp协议
    #规则为etho=>;仅允许目的为E-mail服务器的smtp请求
    $IPT -A FORWARD -p tcp -d $EMAIL-SERVER-dport smtp -i eth0 -j ACCEPT
    #
    # 2.下面设置针对Internet客户的过滤规则
    #本例中防火墙位于网关的位置,所以主要是防止来自Internet的攻击
    #不能防止来自Intranet的攻击
    #假如网络中的服务器都是基于Linux的,也可以在每一部服务器上设置
    #相关的过滤规则来防止来自Internet的攻击
    #对于Internet对Intranet客户的返回包,定义如下规则
    #
    #(1)允许Intranet客户采用被动模式访问Internet的FTP服务器
    $IPT -A FORWARD -p tcp -s 0/0 --sport ftp-data -d $IP_RANGE -i eth0 -j ACCEPT
    #
    #(2)接收来自Internet的非连接请求tcp包
    $IPT -A FORWARD -p tcp -d 198.168.80.0/24 ! --syn -i eth0 -j ACCEPT
    #
    #(3)接收所有udp包,主要是针对oicq等使用udp的服务
    $IPT -A FORWARD -p udp -d 198.168.80.0/24 -i eth0 -j ACCEPT
    #
    #3.然后接受来自整个Intranet的数据包过滤,我们定义如下规则
    $IPT -A FORWARD -s 198.168.80.0/24 -i eth1 -j ACCEPT
    #
    #处理ip碎片
    #接受所有的ip碎片,但采用limit匹配扩展对其单位时间可以通过的
    #ip碎片数量进行限制,以防止ip碎片攻击
    $IPT -A FORWARD -f -m limit-limit 100/s-limit-burst 100 -j ACCEPT
    #说明:对不管来自哪里的ip碎片都进行限制,允许每秒通过100个ip碎片
    #该限制触发的条件是100个ip碎片
    #
    #设置icmp包过滤
    #ipmp包通常用于网络测试等,故允许所有的icmp包通过
    #但是黑客常常采用icmp进行攻击,如ping of death等
    #所以我们采用limit匹配扩展加以限制
    $IPT -A FORWARD -p icmp -m limit-limit 1/s-limit-burst 10 -j ACCEPT
    #说明:对不管来自哪里的icmp包都进行限制,允许每秒通过一个包
    #该限制触发的条件是10个包

  • QC 9.0的License破解文件

    2008-01-10 17:40:01

    把下面的xml文件复制到记事本中,格式为txt,在安装时选择文件,或在安装后在sabin后台粘贴。

    <?xml version="1.0" encoding="UTF-8"?>
    <license>
        <terms>
            <issued_to>rapidhorse.com.cn</issued_to>
            <license_identifier>SN732563653</license_identifier>
            <edition>enterprise</edition>
            <evaluation>N</evaluation>
            <start_date>12/13/2007</start_date>
            <expiration>5/29/2099</expiration>
            <full_test_director>500</full_test_director>
            <additional_defects>500</additional_defects>
            <tolerance>0%</tolerance>
            <requirements>Y</requirements>
            <advanced_reports>Y</advanced_reports>
            <business_process_testing>500</business_process_testing>
            <version_control>Y</version_control>
            <dashboard>Y</dashboard>
        </terms>
        <Signature>lA0FAVrF+UTDW2qVIDjVPCSpPKRUpKcoTO8/GI95D1RLIzQAq/8mv+HnIGQ0Grv9am8QKHfncRsARR153QxqKw==</Signature>
    </license>
  • 2006-2007年100款最佳安全工具(自己找的不全还望大家见谅)

    2008-01-03 12:25:55

    2006-2007年100款最佳安全工具(自己找的不全还望大家见谅)

    1、

    Nessus

    http://www.nessus.org/

    :最好的UNIX漏洞扫描工具

    2、

    Wireshark

    http://www.wireshark.org/

    :嗅探网络粘合胶水(网络协议)

    3、

    Snort

    http://www.snort.org/

    :一款广受欢迎的开源IDS(Intrusion Detection System)(入侵检测系统)工具

    4、

    Netcat

    http://www.vulnwatch.org/netcat/

    :网络瑞士军刀

    5、

    Metasploit Framework

    http://www.metasploit.com/

    : 黑掉整个星球

    6、

    Hping2

    http://www.hping.org/

    :一种网络探测工具,是ping的超级变种
    7、

    Kismet

    http://www.kismetwireless.net/

    :一款超强的无线嗅探器
    8、
    Tcpdump


    http://www.tcpdump.org/


    :最经典的网络监控和数据捕获嗅探器



    9、
    Cain and Abel

    http://www.oxid.it/cain.html

    : Windows平台上最好的密码恢复工具
    10、

    John the Ripper

    http://www.openwall.com/john/

    :一款强大的、简单的以及支持多平台的密码哈希破解器

    11、

    Ettercap

    http://ettercap.sourceforge.net/

    :为交换式局域网提供更多保护

    12、
    Nikto
    http://www.cirt.net/code/nikto.shtml

    :非常全面的网页扫描器

    13、Ping/telnet/dig/traceroute/whois/netstat :基本命令


    14、

    OpenSSH

    http://www.openssh.com/

    PuTTY

    http://www.chiark.greenend.org.uk/~sgtatham/putty/

    SSH

    http://www.ssh.com/commerce/index.html

    :访问远程计算机的安全途径

    15、

    THC Hydra

    http://thc.segfault.net/thc-hydra/

    :支持多种服务的最快的网络认证破解器

    16、

    Paros proxy

    http://www.parosproxy.org/

    : 网页程序漏洞评估代理

    17、

    Dsniff

    http://www.monkey.org/~dugsong/dsniff/

    :一款超强的网络评估和渗透检测工具套装

    18、

    NetStumbler

    http://www.stumbler.net/

    : 免费的Windows 802.11嗅探器

    19、
    THC Amap

    :一款应用程序指纹扫描器
    20、

    GFI LANguard

    http://www.stumbler.net/

    :一款Windows平台上的商业网络安全扫描器

    21、
    Aircrack

    : 最快的WEP/WPA破解工具

    22、
    Superscan

    http://www.aircrack-ng.org/


    :只运行于Windows平台之上的端口扫描器、ping工具和解析器

    23、
    [/url]

    http://www.netfilter.org/

    Netfilter

    http://www.netfilter.org/

    : 最新的Linux核心数据包过滤器/防火墙

    24、
    Sysinternals

    http://www.sysinternals.com/

    :一款强大的非常全面的Windows工具合集

    25、

    Retina

    http://www.eeye.com/html/Products/Retina/index.html

    : eEye出品的商业漏洞评估扫描器

    26、
    Perl

    http://www.perl.org/

    Python

    http://www.python.org/

    Ruby

    http://www.ruby-lang.org/

    :简单的、多用途的脚本语言

    27、L0phtcrack

    : Windows密码猜测和恢复程序

    28、

    Scapy

    http://www.secdev.org/projects/scapy/

    :交互式数据包处理工具

    29、
    Sam Spade

    http://www.samspade.org/ssw/

    : Windows网络查询免费工具
    30、

    GnuPG
    http://www.gnupg.org/

    PGP
    http://www.pgp.com/

    :对您的文件和通讯进行高级加密

    31、

    Airsnort

    http://airsnort.shmoo.com/

    : 802.11 WEP加密破解工具
    32、

    BackTrack

    http://www.remote-exploit.org/index.php/BackTrack

    :一款极具创新突破的Live(刻在光盘上的,光盘直接启动)光盘自启动Linux系统平台

    33、

    P0f

    http://lcamtuf.coredump.cx/p0f.shtml

    :万能的被动操作系统指纹工具
    34、

    Google

    www.google.cn

    :人人喜爱的搜索引擎

    35、

    WebScarab

    http://www.owasp.org/index.php/Category:OWASP_WebScarab_Project

    :一个用来分析使用HTTP和HTTPS协议的应用程序框架

    36、
    Ntop

    http://www.ntop.org/

    :网络通讯监控器

    37、
    Tripwire

    http://www.tripwire.com/

    :祖爷爷级的文件完整性检查器

    38、
    Ngrep

    http://www.packetfactory.net/projects/ngrep/

    :方便的数据包匹配和显示工具


    39、
    Nbtscan

    http://www.inetcat.org/software/nbtscan.html

    : 在Windows网络上收集NetBIOS信息

    40、

    WebInspect

    http://www.spidynamics.com/products/webinspect/

    :强大的网页程序扫描器

    41、

    OpenSSL


    http://www.openssl.org/

    : 最好的SSL/TLS加密库
    42、

    Xprobe2

    http://www.sys-security.com/index.php?page=xprobe

    :主动操作系统指纹工具
    43、

    EtherApe

    http://etherape.sourceforge.net/

    : EtherApe是Unix平台上的模仿etherman的图形界面网络监控器

    44、
    Core Impact

    http://www.coresecurity.com/products/coreimpact/


    : 全自动的全面入侵检测工具

    45、

    IDA Pro

    http://www.datarescue.com/idabase/

    : Windows或Linux反编译器和调试器

    46、

    SolarWinds
    http://www.solarwinds.net/

    : 网络发现/监控/攻击系列工具

    47、
    Pwdump

    http://www.foofus.net/fizzgig/pwdump/

    :一款Windows密码恢复工具

    48、LSoF

    打开文件列表
    49、
    RainbowCrack

    http://www.antsight.com/zsl/rainbowcrack/

    :极具创新性的密码哈希破解器


    50、

    Firewalk

    http://www.packetfactory.net/projects/firewalk/

    :高级路由跟踪工具

    51、

    Angry IP Scanner
    http://www.angryziber.com/ipscan/

    : 一款非常快的Windows IP 扫描器和端口扫描器

    52、

    RKHunter
    http://www.rootkit.nl/projects/rootkit_hunter.html

    : 一款Unix平台上的Rootkit检测器

    53、

    Ike-scan
    http://www.rootkit.nl/projects/rootkit_hunter.html

    : VPN检测器和扫描器

    54、
    Arpwatch
    http://www-nrg.ee.lbl.gov/

    : 持续跟踪以太网/IP地址配对,可以检查出中间人攻击

    55、

    KisMAC
    http://kismac.de/

    : 一款Mac OS X上的图形化被动无线网络搜寻器

    56、
    OSSEC HIDS

    http://www.ossec.net/

    :一款开源的基于主机的入侵检测系统

    57、
    Openbsd PF

    http://www.benzedrine.cx/pf.html

    : OpenBSD数据包过滤器

    58、
    Nemesis

    http://www.packetfactory.net/projects/nemesis/

    :简单的数据包注入

    59、

    Tor
    http://tor.eff.org/


    :匿名网络通讯系统

    60、

    Knoppix
    http://www.knoppix.org/

    :一款多用途的CD或DVD光盘自启动系统

    61、

    ISS Internet Scanner
    http://www.iss.net/products_serv ... canner_internet.php

    :应用程序漏洞扫描器

    62、
    Fport
    http://www.foundstone.com/knowledge/proddesc/fport.html

    : Foundstone出品的加强版netstat

    63、

    chkrootkit
    http://www.chkrootkit.org/

    : 本地rootkit检测器

    64、

    SPIKE Proxy
    http://www.immunitysec.com/resources-freesoftware.shtml

    : HTTP攻击

    65、

    OpenBSD
    http://www.openbsd.org/


    :被认为是最安全的操作系统

    66、

    Yersinia
    http://www.yersinia.net/

    :一款支持多协议的底层攻击工具

    67、

    Nagios
    http://www.nagios.org/

    :一款开源的主机、服务和网络监控程序

    68、

    Fragroute
    http://www.monkey.org/~dugsong/fragroute/

    Fragrouter
    http://www.packetstormsecurity.n ... nch/fragrouter.html


    :一款网络入侵检测逃避工具集

    69、
    X-scan
    http://www.xfocus.org/programs/200209/10.html

    :一款网络漏洞扫描器

    70、
    Whisker/libwhisker
    http://www.wiretrip.net/rfp/

    : Rain.Forest.Puppy出品的CGI漏洞扫描器和漏洞库

    71、
    Socat
    http://www.dest-unreach.org/socat/

    :双向数据传输中继

    72、

    Sara
    http://www-arc.com/sara/


    :安全评审研究助手

    73、
    QualysGuard
    http://www.qualys.com/

    :基于网页的漏洞扫描器

    74、
    ClamAV
    http://www.clamav.net/

    :一款UNIX平台上的基于GPL(

    通用公开许可证:General Public License)的反病毒工具集

    75、
    cheops
    http://www.marko.net/cheops/

    cheops-ng
    http://cheops-ng.sourceforge.net/

    :提供许多简单的网络工具,例如本地或远程网络映射和识别计算机操作系统

    76、
    Burpsuite
    http://portswigger.net/suite/

    :一款网页程序攻击集成平台

    77、
    Brutus
    http://www.hoobie.net/brutus/

    :一款网络验证暴力破解器

    78、
    Unicornscan
    http://www.unicornscan.org/


    :另类端口扫描器

    79、
    Stunnel
    http://www.stunnel.org/

    :用途广泛的SSL加密封装器

    80、
    Honeyd
    http://www.citi.umich.edu/u/provos/honeyd/

    : 您私人的
    honeynet

    http://www.honeynet.org/


    81、
    Fping
    http://www.fping.com/


    :一个多主机同时ping扫描程序

    82、
    BASE
    http://www.qosient.com/argus/

    :基础分析和安全引擎(Basic Analysis and Security Engine)

    83、
    Argus
    http://www.qosient.com/argus/

    : IP网络事务评审工具

    84、
    Wikto
    http://www.sensepost.com/research/wikto/

    :网页服务器评估工具

    85、
    Sguil
    http://sguil.sourceforge.net/

    :网络安全监控器命令行分析器

    86、
    Scanrand

    http://www.doxpara.com/paketto
    :一个异常快速的无状态网络服务和拓朴结构发现系统

    87、
    IP Filter
    http://coombs.anu.edu.au/~avalon/

    : 小巧的UNIX数据包过滤器

    88、
    Canvas

    http://www.immunitysec.com/products-canvas.shtml

    :一款全面的漏洞检测框架

    89、
    VMware

    http://www.vmware.com/

    :多平台虚拟软件

    90、
    Tcptraceroute

    http://michael.toren.net/code/tcptraceroute/

    : 一款基于TCP数据包的路由跟踪工具

    91、
    SAINT

    http://www.saintcorporation.com/saint/

    :安全管理综合网络工具

    92、
    OpenVPN

    http://openvpn.net/

    :全功能SSL VPN解决方案

    93、
    OllyDbg

    http://www.ollydbg.de/

    :汇编级Windows调试器

    94、
    Helix
    http://www.e-fense.com/helix/

    : 一款注重安全防护的Linux版本

    95、
    Bastille
    http://www.bastille-linux.org/

    : Linux、Mac OS X和HP-UX的安全加强脚本

    96、
    Acunetix Web Vulnerability Scanner
    http://www.acunetix.com/

    :商业漏洞扫描器

    97、
    TrueCrypt
    http://www.truecrypt.org/

    :开源的Windows和Linux磁盘加密软件

    98、
    Watchfire AppScan
    http://www.watchfire.com/products/appscan/default.aspx

    :商业网页漏洞扫描器

    99、
    N-Stealth
    http://www.nstalker.com/nstealth/

    :网页服务器扫描器

    100、
    MBSA
    http://www.microsoft.com/technet/security/tools/mbsahome.mspx

    :微软基准安全分析器(Microsoft Baseline Security Analyzer)

  • IBM Rational AppScan 有没有感觉现在web安全很重要

    2008-01-02 15:59:26

     

    互联网的发展历史也可以说是攻击与防护不断交织发展的过程。当前,Web 安全性已经提高一个空前的高度,然而针对网站的攻击却频频得手。如何最大化的保护 Web 应用呢,IBM Rational 提出了全面的解决方案。本文将针对 Web 安全的现状、根源、以及 Rational AppScan 产品的技术细节做全面的介绍,最后阐述IBM解决方案给企业带来的深层次价值。

      1 当前 Web 安全现状

      互联网的发展历史也可以说是攻击与防护不断交织发展的过程。目前,全球因特网用户已达 13.5 亿,用户利用网络进行购物、银行转账支付和各种软件下载,企业用户更是依赖于互联网构建他们的核心业务,对此,Web 安全性已经提高一个空前的高度。

      然而,现实世界中,针对网站的攻击愈演愈烈,频频得手。CardSystems 是美国一家专门处理信用卡交易资料的厂商。该公司为万事达 (Master)、维萨 (Visa) 和美国运通卡等主要信用卡组织提供数据外包服务,负责审核商家传来的消费者信用卡号码、有效期等信息,审核后再传送给银行完成付款手续。这家公司为超过 10 万家企业处理信用卡信息,每年业务金额超过 150 亿美元。这家已有 15 年历史的公司怎么也没想到,居然有黑客恶意侵入了它的电脑系统,窃取了 4000 万张信用卡的资料。这些资料包括持卡人的姓名、账户号码等。这是美国有史以来最严重的信用卡资料泄密事件。此次攻击事件不仅仅对消费者,对公司造成了巨大的损失,甚至对美国的信用卡产业产生了严重的影响!

      1.1 Web 安全的认识误区

      然而什么才是 Web 安全呢,或者说什么样的网站才是安全的呢?用户往往有一些常见的误区。

      “Web 网站使用了防火墙,所以很安全”

      无论是应用级还是端口级的防火墙针对的都是网络层面的攻击,通过设置可访问的端口或者应用,把恶意访问排除在外,然而如何鉴别善意访问和恶意访问是一个问题。访问一旦被允许,后续的安全问题就不是防火墙能应对了。

      “Web 网站使用了 IDS,所以很安全”

      通过模式识别对网络层面的攻击做出防护措施。然而类似于防火墙,通过利用程序漏洞,通过正常连接进行攻击的访问无法被识别和处理。

      “Web 网站使用了 SSL 加密,所以很安全”

      SSL 对网站发送和接收的信息都进行加密处理,然而 SSL 无法保障存储在网站里的信息的安全和网站访问者的隐私信息。采用 64 位甚至 128 位 SSL 加密的网站被黑客攻陷的例子举不胜举。

      “漏洞扫描工具没发现任何问题,所以很安全”

      当前漏洞扫描工具已经被广泛使用去查找一些明显的网络安全漏洞。同理,扫描工具无法对网站应用程序进行检测,无法查找应用本身的漏洞。

      “我们每季度都会聘用安全人员(Pen Tester)进行审计,所以很安全”

      人为的检测考察不仅仅效率低,不可控因素也较多,同时对于代码变更频繁的今天,Pen Tester 也无法满足全面的安全需求

      然而这些方法远远不能保障 Web 应用的安全,针对应用层面的攻击可以轻松的突破防火墙保护的网站。例如:最为常见的 sql 注入攻击表现层面完全是正常的数据交互查询。对于防火墙或者入侵检测系统而言,这是最为正常的访问连接,没有任何特征能够说明此种访问连接存在恶意攻击。所以,一些简单的 sql 注入语句就可以使得装备昂贵网络安全设备的网站被轻松攻破。

      1.2 Web 安全现状

      令人惊诧的是,几乎所有关注 Web 安全领域的人都会存在着上面我们阐述的误区,而当前 Web 的安全现状也同时证明了这些误区的普遍性。“防火墙、IDS 是主要安全手段,SSL 保证了安全性,…”与之相对的是:互联网发展到今天,75%的安全问题竟然是出现在应用程序本身。正如上面介绍的 sql 注入攻击一样,这是防火墙、SSL、入侵检测系统无法预防、解决、和应对的!

      如下图所示,目前安全投资中,只有 10%花在了如何防护应用安全漏洞,而这却是 75%的攻击来源――10% Vs 75%,这是多么大的差距!这也是造成当前 Web 站点频频被攻陷的一个重要因素。

      图 1. 当前安全现状统计分析图

      当前安全现状统计分析图

      那么,什么样的防护才是一个完整的解决方案呢?通过附图 2 我们可以看到,一个完整的 Web 防护不仅仅包含了常见的 IDS、Firewall 等防护手段,更需要针对应用本身做好安全防护,这也是解决 75%安全漏洞的手段。那么什么样的攻击是防火墙、IDS、或者 SSL 无法应对的呢,他们又是如何利用应用本身的漏洞进行攻击的呢?下面我们将做详细的阐述。

      图 2. Web 应用的网络防护

      Web 应用的网络防护

      常见针对 Web 应用攻击的十大手段

      

    目前常用的针对应用漏洞的攻击已经多达几百种,最为常见的攻击为下表列出的十种。

    十大攻击手段
    应用威胁 负面影响 后果
    跨网站脚本攻击 标识盗窃,敏感数据丢失… 黑客可以模拟合法用户,控制其帐户。
    注入攻击 通过构造查询对数据库、LDAP 和其他系统进行非法查询。 黑客可以访问后端数据库信息,修改、盗窃。
    恶意文件执行 在服务器上执行 Shell 命令 Execute,获取控制权。 被修改的站点将所有交易传送给黑客
    不安全对象引用 黑客访问敏感文件和资源 Web 应用返回敏感文件内容
    伪造跨站点请求 黑客调用 Blind 动作,模拟合法用户 黑客发起 Blind 请求,要求进行转帐
    信息泻露和不正确的错误处理 黑客得到详细系统信息 恶意的系统检测可能有助于更深入的攻击
    被破坏的认证和 Session 管理 Session token 没有被很好的保护 在用户推出系统后,黑客能够盗窃 session。
    不安全的木马存储 过于简单的加密技术导致黑客破解编密码 隐秘信息被黑客解密盗窃
    不安全的通讯 敏感信息在不安全通道中以非加密方式传送 黑客可以通过嗅探器嗅探敏感信息,模拟合法用户。
    URL 访问限制失效 黑客可以访问非授权的资源连接 黑客可以强行访问一些登陆网页、历史网页。

      我们通过注入缺陷(Injection Flaws,排名第二的攻击)对攻击原理进行一下说明。

      在网站的应用中需要应用到大量的数据库查询检索等功能,例如最简单的例子是网站登陆,用户需要输入登陆名称和密码进行登陆认证。在早期的开发中通常使用最为简单的 select 语句实现此功能,即 select * from users where username = “XXXX” and password = “XXXX”( 假设数据库 user 表名称为 users,用户名和密码字段名称为 username 和 password)。通过截取用户在文本框中录入的字符串,再进行拼接,形成 select 语句,最终如果表 users 中有符合此条件的记录(即该用户名和密码),系统将会返回有效记录,从而允许登陆系统中。

      然而,此开发方法隐藏了一个巨大的漏洞,黑客可以通过 sql 注入攻击攻入网站。如下图所示,黑客在登陆界面录入的不是用户名,而是一串字符串 (’or 1=1 --)。黑客的目的是在原本应该录入用户的地方录入了一串字符串,导致整个 select 语句发生了变化:select * from users where username=’’or 1=1。熟知 Select 语句的人知道,在条件语句中,无论用户名称是否正确,由于 1=1 永远是正确的,所以 select 将会将所有 users 表中的数据返回。最终的结果是,黑客登陆到这个系统中。通过 sql 注入攻击,黑客可以轻松的敲入一些 sql 语句登陆进网站、对隐秘数据进行查询等等。

      图 3. 攻击举例

      攻击举例

      通过上述原理描述我们可以看到,对于 sql 注入攻击无论是防火墙还是入侵检测系统都无法预防和阻止,唯一的办法是将应用本身的漏洞关闭。例如通过参数的传递配合存贮过程来实现数据库查询,这比动态的构建 sql 语句安全很多。比如在 ASP.net 中通过下面的程序将会避免攻击:

      ' Visual Basic example

      Dim DS As DataSet

      Dim MyConnection As SqlConnection

      Dim MyCommand As SqlDataAdapter

      Dim SelectCommand As String = "select * from users where username = @username"

      ...

      MyCommand.SelectCommand.Parameters.Add(New SqlParameter("@username",

      SqlDbType.NVarChar, 20))

      MyCommand.SelectCommand.Parameters("@username").Value = UserNameField.Value

      // C# example

      String selectCmd = "select * from Authors where state = @username";

      SqlConnection myConnection = new SqlConnection("server=...");

      SqlDataAdapter myCommand = new SqlDataAdapter(selectCmd, myConnection);

      myCommand.SelectCommand.Parameters.Add(new SqlParameter("@username",

      SqlDbType.NVarChar, 20));

      myCommand.SelectCommand.Parameters["@username"].Value = UserNameField.Value;

      除了注入缺陷攻击,常见的应用攻击还有跨网站脚本攻击、恶意文件执行攻击、不安全直接对象应用攻击、跨站点请求伪造攻击、信息泄漏以及利用错误处理机制展开攻击、等等。每种攻击都类似与 sql 注入攻击,根据应用程序本身的漏洞,对系统进行破坏工作,例如:获取系统权限、获取机密信息、模拟合法用户等等。

      综上所述,这些利用 Web 应用漏洞的攻击是 Web 安全最主要的威胁来源,75%的攻击来源于此,只有对应用程序本身进行改造才能避免攻击。然而,如何发现这些应用漏洞是保证安全的第一前提,我们如何以最快最有效的方式发现 Web 应用本身的漏洞呢?没有高效检测手段,安全的 Web 应用将成为水中花镜中月。

     3 通过 Rational AppScan 如何应对网站攻击

     

      ibm Rational AppScan 正是应对这一挑战的利器。

      如下图所示,Rational AppScan 工作方式比较简单,就像一个黑盒测试工具一样,测试人员不需要了解 Web 应用本身的结构。AppScan 拥有庞大完整的攻击特征库,通过在 http request 中插入测试用例的方法实现几百中应用攻击,再通过分析 http response 判断该应用是否存在相应的漏洞。整个过程简单易懂高效,测试人员可以快速的定位漏洞所在的位置,同时 AppScan 可以详细指出该漏洞的原理以及解决该漏洞的方法,帮助开发人员迅速修复程序安全隐患。对于攻击的特征以及测试用例用户不需要花费大量的精力,WatchFire 团队定期的对特征库进行更新,随着保证与业界的同步,最大化的提高用户的工作效率。

      图 4. Rational AppScan 工作示意图

      Rational AppScan 工作示意图

      下面我们通过简单的实例介绍一下 Rational AppScan 的使用:

      定义扫描

      首先确定扫描站点的 URL,根据默认的模板配置向导,确定扫描的整个站点模型以及你想扫描的漏洞种类。例如,我想扫描企业应用 www.xxx.com,想根据默认值扫描是否有安全隐患,启动 AppScan,创建一个扫描,敲入 www.xxx.com; 根据配置向导直至完成。

      图 5. 默认的模板配置向导

      默认的模板配置向导

      图 6. 创建一个扫描

      创建一个扫描

      扫描启动,进行测试

      只需要点击执行。

      扫描结果查看

      如图所示,AppScan 以各种维度展现了扫描后的结果,不仅仅定位了问题发生的位置,也提出了问题的解决方案。

      图 7. 扫描后的结果

      扫描后的结果

      4 Rational AppScan 深入介绍

      Rational AppScan 同时提供了很多高级功能,帮助客户对复杂应用进行检测。支持的扫描配置有:

      Starting URL:起始 URL,制定被测应用的起始地址

      Custom Error Pages:制定错误网页提高测试效率

      Session IDs:管理测试过程中的 session

      Automatic server Detection:自动检测应用所在的应用服务器、web server、操作系统

      Exclusion and Inclusion:制定哪些 Web 被扫描或者被排除,哪些文件类型不被扫描

      Scan Limits:其他高级扫描限制,例如扫描次数限制等

      Advanced:扫描的方式,是宽度扫描还是深度扫描

      Communication Settings:对扫描中的延时、线程数量进行配置

      Proxy Settings:代理设置vLogin/logout:对被测应用的登陆进行设置,可以采用录制回放的方式、也可以使用自动登陆的方式

      configure a Test Policy: 配置测试测量,即想测试哪些漏洞。

      ……

      如上所述,用户可以通过 AppScan 进行一系列高级配置,制定所要检测的 Web 模型,即哪些需要扫描、哪些不需要、扫描的方式等等;也可以定义需要扫描漏洞的列表,从而保证了用户关心的网站模型有无用户所关心的安全漏洞。在检测出安全漏洞之后,AppScan 又提供了全面的解决方案帮助客户快速解决这些问题,最大化的保证 Web 应用的安全。另外,对于 Web 服务 AppScan 同样可以支持。

      AppScan 提供了完善的报表功能,可以支持用户对扫描的结果进行各种分析,包括对行业或者法规的支持程度;同时,AppScan 也提供了一系列的小工具,例如:Authentication Tester 通过暴力检测方法扫描被测网站的用户名称和密码;HTTP Request Editor 提供了编辑 Http request 的功能,等等。

     5 Rational AppScan 的使用场景

     

      在整个软件开发生命周期中的各个阶段,Rational AppScan 都可以被使用,全面的保障了软件的安全性。如下图所示,软件开发过程中,软件开发人员、软件测试人员、QA、审核人员等诸多角色都可以通过 AppScan 检测应用,将漏洞尽早挖掘出来。下面我们通过一些使用场景介绍一下 AppScan 给软件开发带来的利益。

      图 8. AppScan 使用场景

      AppScan 使用场景

      5.1 开发人员使用 AppScan

      开发人员在开发过程中可以使用 AppScan 或者专用插件,随时开发随时测试,最大化的保证个人开发程序的安全性。越早发现问题,解决问题的成本就越低,这为 Web 应用的安全提供了最为坚实的基础保障。

      测试人员使用 AppScan

      系统测试人员使用 AppScan 对应用做全面的测试,一旦发现问题,可以快速的生成 defect,通过与 ClearQuest 的集成可以实现 defect 电子化跟踪,再传递到开发人员手中,指导开发人员迅速解决问题。极大的提高了开发团队的开发效率,也提供了完整了沟通平台解决方案。

      5.3 审核人员上线前使用 AppScan

      这是系统上线前的安全质量关卡。任何系统上线都应该经过严格的上线测试,这也最大化的减少了上线后问题的出现,避免生产系统上线后给企业带来的巨额损失。

      5.4 上线后审计、监控人员使用 AppScan

      上线的系统应该定期检测,一旦出现问题更应该及时检测,越快速的定位发现问题,损失就会越小。

      上面我们介绍的是比较通用的使用场景。当然,不同的企业可能不同的特点,AppScan 使用场景的原则是最大化的提高使用效率、尽早的把问题暴露出来,为应用安全打下坚实的基础。每个企业都可以根据自身的开发现状定义适合自己的使用模式。

      6. 为企业带来的收益

      通过上面的介绍,我们对 Web 安全现状、应用安全重要性、以及应用安全产品 Rational AppScan 的使用有了一定的认识。但是,工具带给客户的不仅仅是一些功能,更为重要的是给企业带来的深层次的收益,给企业在开发过程、安全策略等层面带来了深刻的变化 . 下面我们从几方面阐述 AppScan 给企业带来的价值:

      AppScan 是 Web 应用安全的坚实保障

      正如上面所论述的一样,当前 Web 安全 75%的漏洞出自于应用本身,快速全面的定位问题并提供完善的解决方案将会帮助开发团队构建一个健壮的应用。

      AppScan 使得开发成本降低、开发效率提高

      开发测试人员通过 Rational AppScan 可以迅速的定位安全隐患,早期发现问题不仅有助于解决问题,更降低了开发成本,避免问题过晚出现所造成的巨大损失。

      AppScan 给企业提供了统计分析能力

      Rational AppScan 提供了灵活报表功能,可以支持对扫描结果进行统计分析;支持对规范法规遵循的分析;更提供了 Delta 比较报告,可以比较两次检测的结果从而作为质量检验的基础数据 AppScan 帮助建立企业级的测试策略库

      Rational AppScan

      帮助企业根据不同的应用类型建立不同的测试策略,同时用户可以定义针对不同威胁的解决方法,持续的知识积累保证了企业拥有更完善的安全解决方案。

      总结

      综上所述,随着 Internet 的蓬勃发展,Web 的安全性已经被空前重视,薄弱的安全性也成为了很多企业发展的瓶颈。然而,即便安全性如此受重视的今天,很多人对如何保障 Web 的安去性都存在着巨大的误区。现实表明,只有加强 Web 应用的防护,才能有效的防范 75%的攻击,Web 应用的防护已经成为安全话题中最为不可获缺的部分。IBM Rational 提供了 Rational AppScan 解决方案,在 Web 开发、测试、维护、运营的整个生命周期中,帮助企业高效的发现、解决安全漏洞,最大限度的保证了应用的安全性,为企业发展提供了坚实的技术保障。

  • TD常见问题及处理方法(原创)

    2007-12-27 13:26:01

    很早就想把TD在使用过程中遇到问题的解决方法做一个列表,然后把它贴出来,方便初学者查阅,最近发现论坛上问的问题多了,而且这些问题可能后来者也会遇到,所以我把问题的解决方法罗列于此并不断更新,大家遇到问题的时候可以先看看,不过有时候可能会稍微忙一些,所以希望有更多时间丰富这些问题列表:simile
    [list=1][*]TD用户密码忘记[/list]TD有三种用户下面分别是这三类用户密码忘记的解决方法:1。站点管理员,打开系统盘:\Program Files\Common Files\Mercury Interactive\DomsInfo\doms.mdb中admin表(打开表的密码是tdtdtd)将密码这一列清空,然后机器重起。则密码为空。2。项目的admin用户,打开TD_DIR\项目\TestDir.mdb中的users表将admin的US_PASSWORD清空,则密码为空。3。普通项目用户,登陆site administrator在user tab重置该用户密码。

        1.TD工作流脚本

    TD工作流脚本是使用Visual Basic scrīpts来控制TD项目的工作流,比如可以控制某些字段是否显示,字段值变化的依赖性等,脚本是通过事件触发的方式达到的,也可以自定义事件。这里有个例子:

    TD默认修改缺陷者是assigned to用户的。如果开发这样要求的话,你可以这样实现,在缺陷实体中自定义一个FIXED BY字段(字段取值为用户列表).然后再工作流脚本的中粘贴这个脚本
    Sub Defects_Bug_FieldChange(FieldName)
      If FieldName = "BG_STATUS" Then
         if Bug_Fields("BG_STATUS").Value = "Fixed" then
            Bug_Fields("BG_USER_01").Value = User.UserName 'BG_USER_01为自定义字段FIXED BY的数据表列名
         end if
      end if
    End Sub

        2.关于rpc出错

    TD通过RPC服务调用远程分布式组件DCOM
    The RPC server is unavailable 是TD比较常见的出错情况,有时只要重起一下机器,就没有问题了。但是如果还是不行的话,可以试着下面的解决方法:
    1.是否修改过windows administrator的密码:解决方法:系统托盘TD图标---run as---输入正确的密码运行
    2.通过IP地址访问TD后报RPC的解决方法
    如果通过服务器名称访问TD正常,而用IP地址访问服务器出现RPC错误。此方法是解决局域网通过网内代理服务器访问局域网内TD服务器出现的问题.在IE->工具->Internet选项->连接->局域网设置->高级->例外:在以下开头的地址不使用代理服务器,输入TD服务器的IP保存. 从新打开浏览器就可以通过IP地址访问
    3. RPC服务未启动。解决:控制面板-管理工具-服务-“Remote Procedure Call(RPC)”/“Remote Procedure Call(RPC)Locator”,启动一下,服务状态“启动”;
    4.用Windows光盘重新安装IIS服务,在控制面板中;
    5. 新安装TD,成功后,进入“计算机管理”->“Internet信息服务”->“默认Web站点”->“TDBIN”->"属性"->”虚拟目录”,修改应用程序保护,将起改成“低(IIS进程)”,重新启动TD,或者重新启动机器。不过该方法在用CheckTD是可能会出现TD Virtual Directory的警告。
    6. 解决由IIS WebSite Statue的错误时,进入“计算机管理”->“Internet信息服务”->“默认Web站点”->“TDBIN”->"属性"->”虚拟目录”,将脚本访问资源钩上,否则错误提示不能访问脚本资源。
    7.解决由OTAServer配置类型不正确,要求检查用户名和密码的问题时,可以进行以下操作:
    在TD应用服务器中打开[开始]-[运行],输入Dcomcnfg.exe命令来打开分布式COM配置属性,然后选择[应用程序]-[Mercury OTAServer Server]-[属性]-[安全性]-[编辑]-[显示用户],将以IUSR_为开头的用户和TD_IUSER_LOCAL添加进入用户列表(我是在所有的编辑中都添加了这2个用户)。
    重启IIS或机器。(如果以上2步还不行的话,可以继续第三步)
    选择[应用程序]-[Mercury OTAServer Server]-[属性]-[身份标志],选择制定用户,将用户名和密码改为本机管理员帐号和密码。
    8.如果TD服务器管理员帐号/密码或者数据库的被修改过,一定要将它们修改回安装TD时的帐号/密码,否则也会出现RPC错误。

           3.创建新项目时从已有的项目中拷用户群/成员,项目自定义设置

    创建一个项目的时候,可以是create的,也可以是copy另一个项目的.copy的方式有两种一种是拷贝项目内容,一种是拷贝项目设置,看一下创建项目界面的功能按纽

           4.开发工具引用QC开放测试框架API的方法

    开发工具vb6.0引用方法: “工程”-“引用”中添加 “OTA COM 9.0 Type Library”
    开发工具vc6.0引用方法:#import "C:\Program Files\Common Files\Mercury Interactive\Quality Center\OTAClient.dll"
    开发工具.NET引用方法:添加引用-浏览到C:\Program Files\Common Files\Mercury Interactive\Quality Center\OTAClient.dll或者
                                    添加引用-COM-OTA COM 9.0 Type Library
    如果目录下没有OTAClient.dll,到 QC 的 add-in 界面,下载 Mercury Quality Center Client Side Setup 插件。
  • LINUX和UNIX nagios搭建服务器监控系统

    2007-12-27 09:49:15

    首先安装需要的rpm包
    yum -y install gcc gcc-c++ autoconf libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel zlib zlib-devel glibc glibc-devel glib2 glib2-devel bzip2 bzip2-devel ncurses ncurses-devel curl curl-devel e2fsprogs e2fsprogs-devel krb5 krb5-devel libidn libidn-devel openssl openssl-devel openldap openldap-devel nss_ldap openldap-clients openldap-servers perl gd gd-devel jpeg jpeg-devel libpng libpng-devel Net-snmp zlib freetype libart_lgpl cairo-devel pango-devel lrzsz*
    useradd -m  nagios  创建用户
    mkdir -p /usr/local/nagios  创建安装目录
    mkdir /usr/local/rrdtool  同上
    grep ^User /etc/httpd/conf/httpd.conf 查看apache启动用户
    我的是apache,下面将这个用户加入nagios组
    usermod -G nagios apache    apache加入nagios组
    chown -R nagios.nagios /usr/local/nagios  修改目录属主组
    4.所用软件
    nagios-2.9.tar.gz
    nagios-plugins-1.4.9.tar.gz
    nrpe-2.8.1.tar.gz
    NSClient++-0.2.7.zip
     
    ###############################
    rpm -qa|grep php  查询php安装包
    ##############################
    Net-snmp (check_snmp使用,没有安装的话,nagios不会编译出check_snmp脚本)
    ./configure --prefix=/usr
    make && make install
    CGI.pm模块 (nagiosgraph使用,没有安装的话,rrdtools画不出曲线图)
    perl Makefile.pl
    make && make install
    Rrdtools (rrd数据库,rrdtools工具)
    ./configure --prefix=/usr/local/rrdtool
    make && make install

    1.安装nagios主程序
    解压缩
    tar -zxvf nagios-2.9.tar.gz
    cd nagios-2.9
    ./configure --prefix=/usr/local/nagios
    make all
    make install
    make install-init
    make install-commandmode && make install-config
    2.安装插件
    解压缩
    tar -zxvf nagios-plugins-1.4.9.tar.gz
    cd nagios-plugins-1.4.9
    ./configure --prefix=/usr/local/nagios
    make && make install
    3.修改apache配置
    修改apache的配置文件,增加nagios的目录,并且访问此目录需要进行身份验证
    vi /usr/local/apache2/conf/httpd.conf,在最后增加如下内容
    #setting for nagios 20090707
    ScriptAlias /nagios/cgi-bin /usr/local/nagios/sbin
    <Directory "/usr/local/nagios/sbin">
        Options ExecCGI
        AllowOverride None
        Order allow,deny
        Allow from all
        AuthName "Nagios Access"
        AuthType Basic
    AuthUserFile /usr/local/nagios/etc/htpasswd
        Require valid-user
    </Directory>
     
    Alias /nagios /usr/local/nagios/share
    <Directory "/usr/local/nagios/share">
        Options None
        AllowOverride None
        Order allow,deny
        Allow from all
        AuthName "Nagios Access"
        AuthType Basic
    AuthUserFile /usr/local/nagios/etc/htpasswd
        Require valid-user
    </Directory>
    apache配置php
    修改Apache的配置文件httpd.conf:
    # vi /usr/local/apache/conf/httpd.conf
    在AddType application/x-gzip .gz .tgz下,添加下面的配置项:
    AddType application/x-httpd-php .php
    AddType application/x-httpd-php-source .phps
    添加index.php
    ###########################################
    tar -zxvf imagepak-base.tar.gz
    cp -r base /usr/local/nagios/share/images/logos/ 图片支持
    ###########################################
     

    /usr/bin/htpasswd -c /usr/local/nagios/etc/htpasswd yelj 创建web用户
    查看认证文件的内容
    less /usr/local/nagios/etc/htpasswd
    yelj:OmWGEsBnoGpIc 前半部分是用户名test,后面是加密后的密码
    到这里nagios的安装也就基本完成了,你可以通过web来访问了.
    http://192.168.0.111/nagios 会弹出对话框要求输入用户名密码

    3)修改配置文件
    修改nagios的主配置文件nagios.cfg
    vi nagios.cfg
    注释行 #cfg_file=/usr/local/nagios/etc/localhost.cfg[2],然后把下面几行的注释去掉:
    cfg_file=/usr/local/nagios/etc/objects/contacts.cfg
    cfg_file=/usr/local/nagios/etc/objects/contactgroups.cfg      
    cfg_file=/usr/local/nagios/etc/objects/hostgroups.cfg    
    cfg_file=/usr/local/nagios/etc/objects/hosts.cfg         
    cfg_file=/usr/local/nagios/etc/objects/services.cfg      
    cfg_file=/usr/local/nagios/etc/objects/timeperiods.cfg   
    //监视时段配置文件路径
    注释掉就说明不使用这个文件,去掉了注释就是需要使用这个文件.
    改check_external_commands=0为check_external_commands=1 .这行的作用是允许在web界面下执行重启nagios、停止主机/服务检查等操作。
    把command_check_interval的值从默认的1改成command_check_interval=10s(根据自己的情况定这个命令检查时间间隔,不要太长也不要太短)。
    主配置文件要改的基本上就是这些,通过上面的修改,发现/usr/local/nagios/etc并没有文件hosts.cfg等一干文件,怎么办?稍后手动创建它们。
     :
    修改CGI脚本控制文件cgi.cfg
    vi cgi.cfg
    第二个要修改的配置文件是cgi.cfg,它的作用是控制相关cgi脚本。先确保use_authentication=1。曾看过不少的文章,都是建议把use_authentication的值设置成”0”来取消验证,这是一个十分糟糕的想法。
    接下来修改default_user_name=test ,再后面的修改在下表列出:
    authorized_for_system_information=nagiosadmin,test
    authorized_for_configuration_information=nagiosadmin,test
    authorized_for_system_commands=test //多个用户之间用逗号隔开
    authorized_for_all_services=nagiosadmin,test
    authorized_for_all_hosts=nagiosadmin,test
    authorized_for_all_service_commands=nagiosadmin,test
    authorized_for_all_host_commands=nagiosadmin,test
    那么上述用户名打那里来的呢?是执行命令
    增加验证用户
    /usr/bin/htpasswd -c /usr/local/nagios/etc/htpasswd yelj所生成的,这个要注意,不能随便加没有存在的验证用户,为了安全起见,不要添加过多的验证用户。
     
    定义监控时间段,创建配置文件timeperiods.cfg
    [root@localhost etc]# vi timeperiods.cfg
    define timeperiod{
            timeperiod_name         24x7   //时间段的名称,这个地方不要有空格
            alias                   24 Hours A Day,7Days A Week
            sunday                  00:00-24:00
            monday                  00:00-24:00
            tuesday                 00:00-24:00
            wednesday               00:00-24:00
            thursday                00:00-24:00
            friday                  00:00-24:00
            saturday                00:00-24:00
            }
    定义了一个监控时间段,它的名称是24x7,监控的时间是每天全天24小时
     
    定义联系人,创建配置文件contacts.cfg
    [root@localhost etc]# vi contacts.cfg
    define contact{
            contact_name                    test   //联系人的名称,这个地方不要有空格
            alias                           sys admin
            service_notification_period     24x7
            host_notification_period        24x7
            service_notification_options    w,u,c,r
            host_notification_options       d,u,r
            service_notification_commands   notify-by-email
            host_notification_commands      host-notify-by-email
            email                           yeli4017@163.com
            }
    下面就可以将多个联系人组成一个联系人组,创建文件contactgroups.cfg
    [root@localhost etc]# vi contactgroups.cfg
    define contactgroup{
            contactgroup_name               sagroup  
            alias                   System Administrators      
            members                 test
     }
    定义被监控主机,创建文件hosts.cfg
    [root@localhost etc]# vi hosts.cfg
    define host{
            host_name                       nagios-server
    //被监控主机的名称,最好别带空格
            alias                           nagios server
            //别名
            address                         192.168.0.111
            //被监控主机的IP地址,我现在暂时先填本机的IP
            check_command                   check-host-alive
            //监控的命令check-host-alive,这个命令来自commands.cfg,用来监控主机是否存活
            max_check_attempts              5
            //检查失败后重试的次数
            check_period                    24x7
            //检查的时间段24x7,同样来自于我们之前在timeperiods.cfg中定义的
     contact_groups                  sagroup
            //联系人组,上面在contactgroups.cfg中定义的sagroup
     notification_interval           10
            //提醒的间隔,每隔10秒提醒一次
     notification_period             24x7
            //提醒的周期, 24x7,同样来自于我们之前在timeperiods.cfg中定义的
     notification_options            d,u,r
    //指定什么情况下提醒,具体含义见之前contacts.cfg部分的介绍
            }

    [root@localhost etc]# vi hostgroups.cfg
    define hostgroup{
            hostgroup_name          sa-servers
            alias                   sa Servers
            members                 nagios-server
            }
    在运行nagios之前首先做测试
    /usr/local/nagios/bin/nagios -v /usr/local/nagios/etc/nagios.cfg
    看到下面这些信息就说明没问题了
    Total Warnings: 0
    Total Errors:   0
    Things look okay - No serious problems were detected during the pre-flight check
    如果有问题的话就可以按照输出信息来排查
     
    作为守护进程后台启动nagios
    /usr/local/nagios/bin/nagios -d /usr/local/nagios/etc/nagios.cfg
     
    1).监控nagios-server的ftp
    编辑services.cfg 增加下面的内容,基本上就是copy上节我们定义监控主机存活的代码.略做修改.
    define service{
            host_name               nagios-server
            service_description     check ftp
            check_command           check_ftp
            max_check_attempts      5
            normal_check_interval   3
            retry_check_interval    2
            check_period            24x7
            notification_interval   10
            notification_period     24x7
            notification_options    w,u,c,r
            contact_groups          sagroup
            }
     
    2).监控dbpi的ssh
    define service{
            host_name               dbpi
     service_description     check-ssh
     check_command           check_tcp!22
            max_check_attempts      5
            normal_check_interval   3
            retry_check_interval    2
            check_period            24x7
            notification_interval   10
            notification_period     24x7
            notification_options    w,u,c,r
            contact_groups          sagroup
            }
     
    3).监控yahoon的IIS
    define service{
            host_name               yahoon
            service_description     check-http
            check_command           check_http
            max_check_attempts      5
            normal_check_interval   3
            retry_check_interval    2
            check_period            24x7
            notification_interval   10
            notification_period     24x7
            notification_options    w,u,c,r
            contact_groups          sagroup
            }
     
    4).监控nagios-sever的根分区的使用情况.
    define service{
            host_name               nagios-server
            service_description     check disk
            check_command           check_local_disk!10%!5%!/
            max_check_attempts      5
            normal_check_interval   3
            retry_check_interval    2
            check_period            24x7
            notification_interval   10
            notification_period     24x7
            notification_options    w,u,c,r
            contact_groups          sagroup
            }
    修改了配置文件,当然就要重新启动了,简单的方法杀掉nagios进程,然后重新启动
    /usr/local/nagios/bin/nagios -d /usr/local/nagios/etc/nagios.cfg
    3安装nrpe
    解压缩
    tar -zxvf nrpe-2.8.1.tar.gz
    cd nrpe-2.8.1
    编译
    ./configure
    安装check_nrpe这个插件
    make install-plugin
    之前说过监控机需要安装check_nrpe这个插件,被监控机并不需要,我们在这里安装它是为了测试的目的
    安装deamon

    在被监控主机上
    1增加用户
    useradd -m -s /sbin/nologin nagios
     
    2安装nagios插件
    解压缩
    tar -zxvf nagios-plugins-1.4.9.tar.gz
    cd nagios-plugins-1.4.9
    编译安装
    ./configure
    make
    make install
    这一步完成后会在/usr/local/nagios/下生成两个目录libexec和share
    [root@dbpi local]# ls /usr/local/nagios/
    libexec share
    修改目录权限
    chown nagios.nagios /usr/local/nagios
    chown -R nagios.nagios /usr/local/nagios/libexec
     
    3安装nrpe
    解压缩
    tar -zxvf nrpe-2.8.1.tar.gz
    cd nrpe-2.8.1
    编译
    ./configure
    make all
    make install-daemon
    make install-daemon-config
     
    现在再查看nagios目录就会发现有4个目录了
    [root@dbpi nrpe-2.8.1]# ls /usr/local/nagios/
    bin      etc      libexec share
    按照安装文档的说明,是将NRPE deamon作为xinetd下的一个服务运行的.在这样的情况下xinetd就必须要先安装好,不过一般系统已经默认装了
    4.安装xinetd脚本
    [root@dbpi nrpe-2.8.1]# make install-xinetd
    输出如下
    /usr/bin/install -c -m 644 sample-config/nrpe.xinetd /etc/xinetd.d/nrpe
    可以看到创建了这个文件/etc/xinetd.d/nrpe
    编辑这个脚本
    vi /etc/xinetd.d/nrpe
    # default: on
    # description: NRPE (Nagios Remote Plugin Executor)
    service nrpe
    {
            flags           = REUSE
            socket_type     = stream
            port            = 5666
            wait            = no
            user            = nagios
            group           = nagios
            server          = /usr/local/nagios/bin/nrpe
            server_args     = -c /usr/local/nagios/etc/nrpe.cfg --inetd
            log_on_failure += USERID
            disable         = no
            only_from       = 127.0.0.1在后面增加监控主机的地址0.111,以空格间隔
    }
    改后
         only_from       = 127.0.0.1 192.168.0.111
     
    编辑/etc/services文件,增加NRPE服务
    vi /etc/services
    增加如下
    # Local services
    nrpe            5666/tcp                        # nrpe
    重启xinetd服务
    [root@dbpi nrpe-2.8.1]# service xinetd restart
    Stopping xinetd: [ OK ]
    Starting xinetd: [ OK ]
     
    查看NRPE是否已经启动
    [root@dbpi nrpe-2.8.1]# netstat -at|grep nrpe
    tcp        0      0 *:nrpe                  *:*                     LISTEN   
    [root@dbpi nrpe-2.8.1]# netstat -an|grep 5666
    tcp        0      0 0.0.0.0:5666            0.0.0.0:*               LISTEN  
    可以看到5666端口已经在监听了
     
    5.测试NRPE是否则正常工作
    之前我们在安装了check_nrpe这个插件用于测试,现在就是用的时候.执行
    /usr/local/nagios/libexec/check_nrpe -H localhost
    会返回当前NRPE的版本
    [root@dbpi nrpe-2.8.1]# /usr/local/nagios/libexec/check_nrpe -H localhost
    NRPE v2.8.1
    也就是在本地用check_nrpe连接nrpe daemon是正常的
    注:为了后面工作的顺利进行,注意本地防火墙要打开5666能让外部的监控机访问
     
    /usr/local/nagios/libexec/check_nrpe –h查看这个命令的用法
    可以看到用法是check_nrpe –H 被监控的主机 -c要执行的监控命令
    注意:-c后面接的监控命令必须是nrpe.cfg文件中定义的.也就是NRPE daemon只运行nrpe.cfg中所定义的命令
     
    查看NRPE的监控命令
    cd /usr/local/nagios/etc
    vi nrpe.cfg
    找到下面这段话
    # The following examples use hardcoded command arguments...
    command[check_users]=/usr/local/nagios/libexec/check_users -w 5 -c 10
    command[check_load]=/usr/local/nagios/libexec/check_load -w 15,10,5 -c 30,25,20
    command[check_hda1]=/usr/local/nagios/libexec/check_disk -w 20 -c 10 -p /dev/hda1
    command[check_zombie_procs]=/usr/local/nagios/libexec/check_procs -w 5 -c 10 -s Z
    command[check_total_procs]=/usr/local/nagios/libexec/check_procs -w 150 -c 200
    红 色部分是命令名,也就是check_nrpe 的-c参数可以接的内容,等号=后面是实际执行的插件程序(这与commands.cfg中定义命令的形式十分相似,只不过是写在了一行).也就是说 check_users就是等号后面/usr/local/nagios/libexec/check_users -w 5 -c 10的简称.
    我们可以很容易知道上面这5行定义的命令分别是检测登陆用户数,cpu负载,hda1的容量,僵尸进程,总进程数.各条命令具体的含义见插件用法(执行”插件程序名 –h”)
    由于-c后面只能接nrpe.cfg中定义的命令,也就是说现在我们只能用上面定义的这五条命令.我们可以在本机实验一下.执行
    /usr/local/nagios/libexec/check_nrpe -H localhost -c check_users
    /usr/local/nagios/libexec/check_nrpe -H localhost -c check_load
    /usr/local/nagios/libexec/check_nrpe -H localhost -c check_hda1
    /usr/local/nagios/libexec/check_nrpe -H localhost -c check_zombie_procs
    /usr/local/nagios/libexec/check_nrpe -H localhost -c check_total_procs
     
    在运行nagios的监控主机上
    之前已经将nagios运行起来了,现在要做的事情是:
    – 安装check_nrpe插件
    – 在commands.cfg中创建check_nrpe的命令定义,因为只有在commands.cfg中定义过的命令才能在services.cfg中使用
    –      创建对被监控主机的监控项目
    安装check_nrpe插件
    [root@server1 yahoon]# tar -zxvf nrpe-2.8.1.tar.gz
    [root@server1 yahoon]# cd nrpe-2.8.1
    [root@server1 nrpe-2.8.1]# ./configure
    [root@server1 nrpe-2.8.1]# make all
    [root@server1 nrpe-2.8.1]# make install-plugin
    只运行这一步就行了,因为只需要check_nrpe插件
     
    在dbpi上我们刚装好了nrpe,现在我们测试一下监控机使用check_nrpe与被监控机运行的nrpedaemon之间的通信.
    [root@server1 nrpe-2.8.1]# /usr/local/nagios/libexec/check_nrpe -H 192.168.0.100
    NRPE v2.8.1
    看到已经正确返回了NRPE的版本信息,说明一切正常.
     
    在commands.cfg中增加对check_nrpe的定义
    vi /usr/local/nagios/etc/commands.cfg
    在最后面增加如下内容
    ########################################################################
    #
    # 2007.9.5 add by yahoon
    # NRPE COMMAND
    #
    ########################################################################
    # 'check_nrpe ' command definition
    define command{
            command_name check_nrpe
            command_line $USER1$/check_nrpe -H $HOSTADDRESS$ -c $ARG1$
            }
    意义如下
    command_name check_nrpe
    定义命令名称为check_nrpe,在services.cfg中要使用这个名称.
    command_line $USER1$/check_nrpe -H $HOSTADDRESS$ -c $ARG1$
    这是定义实际运行的插件程序.这个命令行的书写要完全按照check_nrpe这个命令的用法.不知道用法的就用check_nrpe –h查看
    -c后面带的$ARG1$参数是传给nrpe daemon执行的检测命令,之前说过了它必须是nrpe.cfg中所定义的那5条命令中的其中一条.在services.cfg中使用check_nrpe的时候要用!带上这个参数
    下面就可以在services.cfg中定义对dbpi主机cpu负载的监控
    define service{
            host_name               dbpi
    被监控的主机名,这里注意必须是linux且运行着nrpe,而且必须是hosts.cfg中定义的
            service_description     check-load
            监控项目的名称
            check_command           check_nrpe!check_load
            监控命令是check_nrpe,是在commands.cfg中定义的,带的参数是check_load,是在nrpe.cfg中定义的
            max_check_attempts      5
            normal_check_interval   3
            retry_check_interval    2
            check_period            24x7
            notification_interval   10
            notification_period     24x7
            notification_options    w,u,c,r
            contact_groups          sagroup
            }
    像这样将其余四个监控项目加进来.
     
    之前我们说过了,今天还有一个任务是要监控dbpi的swap使用情况.但是很遗憾,在nrpe.cfg中默认没有定义这个监控功能的命令.怎么办 手动在nrpe.cfg中添加,也就是自定义NRPE命令.
    现在我们要监控swap分区,如果空闲空间小于20%则为警告状态—warning;如果小于10%则为严重状态—critical.我们可以查得需要使用check_swap插件,完整的命令行应该是下面这样.
    /usr/local/nagios/libexec/check_swap -w 20% -c 10%
     
    在被监控机上增加check_swap命令的定义
    vi /usr/local/nagios/etc/nrpe.cfg
    增加下面这一行
    command[check_swap]=/usr/local/nagios/libexec/check_swap -w 20% -c 10%
    我们知道check_swap现在就可以作为check_nrpe的-c的参数使用了
    修改了配置文件,当然要重启.但是
    如果你是以独立的daemon运行的nrpe,那么需要手动重启.
    如果你是在xinetd或者inetd下面运行的,则不需要.
    由于我们是xinetd下运行的,所以不需要重启服务
     
    在监控机上增加这个监控项目
    define service{
            host_name               dbpi
            service_description     check-swap
            check_command           check_nrpe!check_swap
            max_check_attempts      5
            normal_check_interval   3
            retry_check_interval    2
            check_period            24x7
            notification_interval   10
            notification_period     24x7
            notification_options    w,u,c,r
            contact_groups          sagroup
            }
    1.重启nagios的方法
    之前我说重启nagios的时候都是用的杀进程的方式,其实也可以不这么做.如果在安装nagios的时候安装了启动脚本就可以使用/etc/init.d/nagios restart 还可以带的参数有stop, start,status
    如果报错了,有可能是脚本里面的路径设置错误,解决办法
    vi /etc/init.d/nagios
    将prefix=/usr/local/nagiosaa改为安装的目录/etc/init.d/nagios
    注:在nagios安装的时候说是将脚本安装到了/etc/rc.d/init.d,其实这和/etc/init.d是一个目录
     
    2.不以xinetd的方式运行nrpe
    因为我们按照nrpe的安装文档安装下来,nrpe是在xinetd下面运行的,个人比较喜欢像nagios那样以单独的daemon来运行.这样比较好控制.
    方法:
    编辑 /etc/services将nrpe注释掉
    # Local services
    #nrpe           5666/tcp                        # nrpe
    编辑 nrpe.cfg,增加监控主机的地址
    # NOTE: This option is ignored if NRPE is running under either inetd or xinetd
    allowed_hosts=127.0.0.1,192.168.0.111
    注意两个地址以逗号隔开
    以单独的daemon启动nrpe
    [root@dbpi etc]# /usr/local/nagios/bin/nrpe -c /usr/local/nagios/etc/nrpe.cfg -d
    查看
    [root@dbpi etc]# ps -ef|grep nrpe
    nagios   22125     1 0 14:04          00:00:00 [nrpe]
    [root@dbpi nagios]# netstat -an|grep 5666
    tcp        0      0 0.0.0.0:5666            0.0.0.0:*               LISTEN  
    说明已经正常启动了
    在/etc/rc.d/rc.local里面加入下面一行就实现开机启动nrpe了
    /usr/local/nagios/bin/nrpe -c /usr/local/nagios/etc/nrpe.cfg –d
    同理要开机运行nagios就在/etc/rc.d/rc.local里面增加下面这行
    /usr/local/nagios/bin/nagios -d /usr/local/nagios/etc/nagios.cfg
     
    3.有关于check_load的用法及意义
    这个插件是用来检测系统当前的cpu负载,使用的方法为
    check_load [-r] -w WLOAD1,WLOAD5,WLOAD15 -c CLOAD1,CLOAD5,CLOAD15
    在unix里面负载的均值通常表示是1分钟,5分钟,15分钟内平均有多少进程处于等待状态.
    例如check_load -w 15,10,5 -c 30,25,20这个命令的意义如下
    当1分钟多于15个进程等待,5分钟多于10个,15分钟多于5个则为warning状态
    当1分钟多于30个进程等待,5分钟多于25个,15分钟多于20个则为critical状态
     

    wget http://oss.oetiker.ch/rrdtool/pub/rrdtool-1.3.7.tar.gz
    安装php
    yum install php-gd php
     
    apache配置php
    修改Apache的配置文件httpd.conf:
    # vi /usr/local/apache/conf/httpd.conf
    在AddType application/x-gzip .gz .tgz下,添加下面的配置项:
    AddType application/x-httpd-php .php
    AddType application/x-httpd-php-source .phps
    /etc/init.d/httpd restart    重启apache服务
     

    PNP是一个小巧的开源软件包,它是基于PHP和PERL,利用rrdtool将Nagios采集的数据绘制成图表
     
    安装rrdtools软件包
    安装rrdtool之前确保安装了这些库 zlib libpng freetype libart_lgpl cairo-devel pango-devel
    tar zxvf rrdtools
    ./configure --prefix=/usr/local/rrdtool
    make && make install
     
    安装pnp软件包
    tar zxvf pnp
    ./configure --with-rrdtool=/usr/local/rrdtool/bin/rrdtool --with-perfdata-dir=/usr/local/nagios/share/perfdata  
    make all   
    make install
    2、配置nagios配置文件
    修改主配置文件nagios.cfg
    在定义host或service中都有一个定义项,名为process_perf_data,其值可以定义为0或1,其作用是是否启用Nagios的数据输出功能。如果你将此项赋值为1,那么Nagios就会将收集的数据写入到某个文件中,以备提取
    vi /usr/local/nagios/etc/nagios.cfg
    process_performance_data=1
    service_perfdata_command=process-service-perfdata    #将些句前面的注释去掉
    对某个监控对象做数据图表,则需在所对应的host或者service定义中
    process_perf_data 1
    define host{
                    use                            generic-host                    
                    host_name                  web-1.72
                    alias                           web-server
                    address                       192.168.1.72
                    check_command            check-host-alive
                    max_check_attempts     10
                    check_period                24x7
                    notification_interval       20
                    notification_period         24x7
                    notification_options        d,r
                    contact_groups             admins
                    process_perf_data         1
                    }
    Nagios就会调用相应的命令来输出数据了。Nagios的command定义中默认有一项“process-service- perfdata”,该命令声明了Nagios输出哪些值到输出的文件中。不过其定义相对简单,PNP提供了一个perl脚本,更详尽的定义了一个输出数 据的方法。如果要使用PNP的话,我们需要在command的定义中,将“process-service-perfdata”命令对应的执行命令行的内 容替换成该脚本:
    define command{   
            command_name process-service-perfdata
            command_line /usr/local/nagios/libexec/p`ss_perfdata.pl   
    }
    process_perfdata.pl文件是安装了pnp软件包,自动在/usr/local/nagios/libexec目录下生成的。
    3、检查nagios配置是否正确
    /usr/local/nagios/bin/nagios -v /usr/local/nagios/etc/nagios.cfg
    重新载加nagios配置,并重启服务!
    /etc/init.d/nagios reload
    /etc/init.d/nagios restart
    4、测试
    在IE里输入http://locallost/nagios/pnp

    mssql的插件:
    http://labs.consol.de/wp-content/uploads/2009/09/check_mssql_health-1.5.2.tar.gz
  • apache ab.exe性能测试简单运用

    2007-12-07 09:47:34

    ab的全称是ApacheBench,是 Apache 附带的一个小工具,专门用于 HTTP Server 的benchmark testing,能够同时模拟多个并发请求。前段时间看到公司的研发人员也在用他作一些测试,看起来也不错,很简单,也很容易使用,所以今天花一点时间看了一下。
    通过下面的一个简单的例子和注释,相信大家能够更容易理解这个工具的使用。
    一个简单的例子
    /*在这个例子的一开始,我执行了这样一个命令 ab -n 10 -c 10 http://www.google.com/。这个命令的意思是启动 ab ,向 www.google.com 发送10个请求(-n 10) ,并每次发送10个请求(-c 10)——也就是说一次都发过去了。跟着下面的是 ab 输出的测试报告,红色部分是我添加的注释。*/
    C:\Apache2.2\bin>ab -n 10 -c 10 http://www.google.com/
    This is ApacheBench, Version 2.0.40-dev  apache-2.0
    Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
    Copyright 1997-2005 The Apache Software Foundation, http://www.apache.org/
    Benchmarking www.google.com (be patient).....done
    Server Software:       GWS/2.1
    Server Hostname:       www.google.com
    Server Port:              80
    Document Path:          /
    Document Length:       230 bytes
    Concurrency Level:        10
    /*整个测试持续的时间*/
    Time taken for tests:     3.234651 seconds
    /*完成的请求数量*/
    Complete requests:        10
    /*失败的请求数量*/
    Failed requests:       0
    Write errors:          0
    Non-2xx responses:        10
    Keep-Alive requests:    10
    /*整个场景中的网络传输量*/
    Total transferred:        6020 bytes
    /*整个场景中的HTML内容传输量*/
    HTML transferred:       2300 bytes
    /*大家最关心的指标之一,相当于 LR 中的每秒事务数,后面括号中的 mean 表示这是个平均值*/
    Requests per second:    3.09 [#/sec] (mean)
    /*大家最关心的指标之二,相当于 LR 中的平均事务响应时间,后面括号中的 mean 表示这是个平均值*/
    Time per request:       3234.651 [ms] (mean)
    /*这个还不知道是什么意思,有知道的朋友请留言,谢谢 ^_^ */
    Time per request:       323.465 [ms] (mean, across all concurrent requests)
    /*平均每秒网络上的流量,能够帮助排除是否存在网络流量过大导致响应时间延长的问题*/
    Transfer rate:          1.55 [Kbytes/sec] received
    /*网络上消耗的时间的分解,各项数据的具体算法还不是很清楚*/
    Connection Times (ms)
    min mean[+/-sd] median     max
    Connect:       20 318 926.1    30    2954
    Processing:    40 2160 1462.0     3034    3154
    Waiting:       40 2160 1462.0     3034    3154
    Total:           60 2479 1276.4     3064    3184
    /*下面的内容为整个场景中任何请求的响应情况。在场景中每个请求都有一个响应时间,其中 50%的用户响应时间小于 3064 毫秒,60 %的用户响应时间小于 3094 毫秒,最大的响应时间小于 3184 毫秒*/
    Percentage of the requests served within a certain time (ms)
    50%     3064
    66%     3094
    75%     3124
    80%     3154
    90%     3184
    95%     3184
    98%     3184
    99%     3184
    100%     3184 (longest request)
    更多信息
    ab 不像 LR 那么强大,但是他足够轻便,假如只是在研发过程中想检查一下某个模块的响应情况,或做一些场景比较简单的测试,ab 还是个不错的选择——至少不用花费很多时间去学习 LR 那些复杂的功能,就更别说那 License 的价格了。
    下面是 ab 的周详参数解释,大家有兴趣的能够研究一下。

    ab [ -Aauth-username:password ] [ -cconcurrency ] [ -Ccookie-name=value ] [ -d ] [ -ecsv-file ] [ -ggnuplot-file ] [ -h ] [ -Hcustom-header ] [ -i ] [ -k ] [ -nrequests ] [ -pPOST-file ] [ -Pproxy-auth-username:password ] [ -q ] [ -s ] [ -S ] [ -ttimelimit ] [ -Tcontent-type ] [ -vverbosity] [ -V ] [ -w ] [ -x-attributes ] [ -Xproxy[:port] ] [ -y-attributes ] [ -z-attributes ] [http://]hostname[:port]/path
    -A auth-username:password
    Supply BASIC Authentication credentials to the server. The username and password are separated by a single : and sent on the wire base64 encoded. The string is sent regardless of whether the server needs it (i.e., has sent an 401 authentication needed).
    -c concurrency
    Number of multiple requests to perform. at a time. Default is one request at a time.
    -C cookie-name=value
    Add a Cookie: line to the request. The argument is typically in the form. of a name=value pair. This field is repeatable.
    -d
    Do not display the "percentage served within XX [ms] table". (legacy support).
    -e csv-file
    Write a Comma separated value (CSV) file which contains for each percentage (from 1% to 100%) the time (in milliseconds) it took to serve that percentage of the requests. This is usually more useful than the 'gnuplot' file; as the results are already 'binned'.
    -g gnuplot-file
    Write all measured values out as a 'gnuplot' or TSV (Tab separate values) file. This file can easily be imported into packages like Gnuplot, IDL, Mathematica, Igor or even Excel. The labels are on the first line of the file.
    -h
    Display usage information.
    -H custom-header
    Append extra headers to the request. The argument is typically in the form. of a valid header line, containing a colon-separated field-value pair (i.e., "Accept-Encoding: zip/zop;8bit").
    -i
    Do HEAD requests instead of GET.
    -k
    Enable the HTTP KeepAlive feature, i.e., perform. multiple requests within one HTTP session. Default is no KeepAlive.
    -n requests
    Number of requests to perform. for the benchmarking session. The default is to just perform. a single request which usually leads to non-representative benchmarking results.
    -p POST-file
    File containing data to POST.
    -P proxy-auth-username:password
    Supply BASIC Authentication credentials to a proxy en-route. The username and password are separated by a single : and sent on the wire base64 encoded. The string is sent regardless of whether the proxy needs it (i.e., has sent an 407 proxy authentication needed).
    -q
    When processing more than 150 requests, ab outputs a progress count on stderr every 10% or 100 requests or so. The -q flag will suppress these messages.
    -s
    When compiled in (ab -h will show you) use the SSL protected https rather than the http protocol. This feature is experimental and very rudimentary. You probably do not want to use it.
    -S
    Do not display the median and standard deviation values, nor display the warning/error messages when the average and median are more than one or two times the standard deviation apart. And default to the min/avg/max values. (legacy support).
    -t timelimit
  • 单元测试PHPUnit2使用介绍

    2007-11-22 21:03:45

    PHP 单元测试

    对于 PHP 来说,单元测试框架是 PHPUnit2。可以使用 PEAR 命令行作为一个 PEAR 模块来安装这个系统:% pear install PHPUnit2

    在安装这个框架之后,可以通过创建派生于 PHPUnit2_Framework_TestCase 的测试类来编写单元测试。






    模块单元测试

    我发现开始单元测试最好的地方是在应用程序的业务逻辑模块中。我使用了一个简单的例子:这是一个对两个数字进行求和的函数。为了开始测试,我们首先编写测试用例,如下所示。


    清单 1. TestAdd.php

    <?php
    require_once 'Add.php';
    require_once 'PHPUnit2/Framework/TestCase.php';

    class TestAdd extends PHPUnit2_Framework_TestCase
    {
    function test1() { $this->assertTrue( add( 1, 2 ) == 3 ); }
    function test2() { $this->assertTrue( add( 1, 1 ) == 2 ); }
    }
    ?>

    这个 TestAdd 类有两个方法,都使用了 test 前缀。每个方法都定义了一个测试,这个测试可以与清单 1 一样简单,也可以十分复杂。在本例中,我们在第一个测试中只是简单地断定 1 加 2 等于 3,在第二个测试中是 1 加 1 等于 2。

    PHPUnit2 系统定义了 assertTrue() 方法,它用来测试参数中包含的条件值是否为真。然后,我们又编写了 Add.php 模块,最初让它产生错误的结果。


    清单 2. Add.php

    <?php
    function add( $a, $b ) { return 0; }
    ?>

    现在运行单元测试时,这两个测试都会失败。


    清单 3. 测试失败

    % phpunit TestAdd.php
    PHPUnit 2.2.1 by Sebastian Bergmann.

    FF

    Time: 0.0031270980834961
    There were 2 failures:
    1) test1(TestAdd)

    2) test2(TestAdd)

    FAILURES!!!
    Tests run: 2, Failures: 2, Errors: 0, Incomplete Tests: 0.

    现在我知道这两个测试都可以正常工作了。因此,可以修改 add() 函数来真正地做实际的事情了。

    <?php
    function add( $a, $b ) { return $a+$b; }
    ?>

    现在这两个测试都可以通过了。


    清单 4. 测试通过

    尽管这个TDD的例子非常简单,但是我们可以从中体会到它的思想。我们首先创建了测试用例,并且有足够多的代码让这个测试运行起来,不过结果是错误的。然后我们验证测试的确是失败的,接着实现了实际的代码使这个测试能够通过。

    我发现在实现代码时我会一直不断地添加代码,直到拥有一个覆盖所有代码路径的完整测试为止。在本文的最后,您会看到有关编写什么测试和如何编写这些测试的一些建议。






    数据库测试

    在进行模块测试之后,就可以进行数据库访问测试了。数据库访问测试 带来了两个有趣的问题。首先,我们必须在每次测试之前将数据库恢复到某个已知点。其次,要注意这种恢复可能会对现有数据库造成破坏,因此我们必须对非生产数据库进行测试,或者在编写测试用例时注意不能影响现有数据库的内容。

    数据库的单元测试是从数据库开始的。为了阐述这个问题,我们需要使用下面的简单模式。


    清单 5. Schema.sql

    DROP TABLE IF EXISTS authors;
    CREATE TABLE authors (
    id MEDIUMINT NOT NULL AUTO_INCREMENT,
    name TEXT NOT NULL,
    PRIMARY KEY ( id )
    );

    清单 5 是一个 authors 表,每条记录都有一个相关的 ID。

    接下来,就可以编写测试用例了。


    清单 6. TestAuthors.php

    <?php
    require_once 'dblib.php';
    require_once 'PHPUnit2/Framework/TestCase.php';

    class TestAuthors extends PHPUnit2_Framework_TestCase
    {
    function test_delete_all() {
    $this->assertTrue( Authors::delete_all() );
    }
    function test_insert() {
    $this->assertTrue( Authors::delete_all() );
    $this->assertTrue( Authors::insert( 'Jack' ) );
    }
    function test_insert_and_get() {
    $this->assertTrue( Authors::delete_all() );
    $this->assertTrue( Authors::insert( 'Jack' ) );
    $this->assertTrue( Authors::insert( 'Joe' ) );
    $found = Authors::get_all();
    $this->assertTrue( $found != null );
    $this->assertTrue( count( $found ) == 2 );
    }
    }
    ?>

    这组测试覆盖了从表中删除作者、向表中插入作者以及在验证作者是否存在的同时插入作者等功能。这是一个累加的测试,我发现对于寻找错误来说这非常有用。观察一下哪些测试可以正常工作,而哪些测试不能正常工作,就可以快速地找出哪些地方出错了,然后就可以进一步理解它们之间的区别。

    最初产生失败的 dblib.php PHP 数据库访问代码版本如下所示。


    清单 7. dblib.php

    对清单 8 中的代码执行单元测试会显示这 3 个测试全部失败了:


    清单 8. dblib.php

    % phpunit TestAuthors.php
    PHPUnit 2.2.1 by Sebastian Bergmann.

    FFF

    Time: 0.007500171661377
    There were 3 failures:
    1) test_delete_all(TestAuthors)

    2) test_insert(TestAuthors)

    3) test_insert_and_get(TestAuthors)

    FAILURES!!!
    Tests run: 3, Failures: 3, Errors: 0, Incomplete Tests: 0.
    %

    现在我们可以开始添加正确访问数据库的代码 —— 一个方法一个方法地添加 —— 直到所有这 3 个测试都可以通过。最终版本的 dblib.php 代码如下所示。


    清单 9. 完整的 dblib.php

    <?php
    require_once('DB.php');

    class Authors
    {
    public static function get_db()
    {
    $dsn = 'mysql://root:password@localhost/unitdb';
    $db =& DB::Connect( $dsn, array() );
    if (PEAR::isError($db)) { die($db->getMessage()); }
    return $db;
    }
    public static function delete_all()
    {
    $db = Authors::get_db();
    $sth = $db->prepare( 'DELETE FROM authors' );
    $db->execute( $sth );
    return true;
    }
    public static function insert( $name )
    {
    $db = Authors::get_db();
    $sth = $db->prepare( 'INSERT INTO authors VALUES (null,?)' );
    $db->execute( $sth, array( $name ) );
    return true;
    }
    public static function get_all()
    {
    $db = Authors::get_db();
    $res = $db->query( "SELECT * FROM authors" );
    $rows = array();
    while( $res->fetchInto( $row ) ) { $rows []= $row; }
    return $rows;
    }
    }
    ?>

    在对这段代码运行测试时,所有的测试都可以没有问题地运行,这样我们就可以知道自己的代码可以正确工作了。






    HTML 测试

    对整个 PHP 应用程序进行测试的下一个步骤是对前端的超文本标记语言(HTML)界面进行测试。要进行这种测试,我们需要一个如下所示的 Web 页面。


    图 1. 测试 Web 页面
    测试 Web 页面

    这个页面对两个数字进行求和。为了对这个页面进行测试,我们首先从单元测试代码开始入手。


    清单 10. TestPage.php

    <?php
    require_once 'HTTP/Client.php';
    require_once 'PHPUnit2/Framework/TestCase.php';

    class TestPage extends PHPUnit2_Framework_TestCase
    {
    function get_page( $url )
    {
    $client = new HTTP_Client();
    $client->get( $url );
    $resp = $client->currentResponse();
    return $resp['body'];
    }
    function test_get()
    {
    $page = TestPage::get_page( 'http://localhost/unit/add.php' );
    $this->assertTrue( strlen( $page ) > 0 );
    $this->assertTrue( preg_match( '/<html>/', $page ) == 1 );
    }
    function test_add()
    {
    $page = TestPage::get_page( 'http://localhost/unit/add.php?a=10&b=20' );
    $this->assertTrue( strlen( $page ) > 0 );
    $this->assertTrue( preg_match( '/<html>/', $page ) == 1 );
    preg_match( '/<span id="result">(.*?)<\/span>/', $page, $out );
    $this->assertTrue( $out[1]=='30' );
    }
    }
    ?>

    这个测试使用了 PEAR 提供的 HTTP Client 模块。我发现它比内嵌的 PHP Client URL Library(CURL)更简单一点儿,不过也可以使用后者。

    有一个测试会检查所返回的页面,并判断这个页面是否包含 HTML。第二个测试会通过将值放到请求的 URL 中来请求计算 10 和 20 的和,然后检查返回的页面中的结果。

    这个页面的代码如下所示。


    清单 11. TestPage.php

    这个页面相当简单。两个输入域显示了请求中提供的当前值。结果 span 显示了这两个值的和。<span> 标记标出了所有区别:它对于用户来说是不可见的,但是对于单元测试来说却是可见的。因此单元测试并不需要复杂的逻辑来找到这个值。相反,它会检索一个特定 <span> 标记的值。这样当界面发生变化时,只要 span 存在,测试就可以通过。

    与前面一样,首先编写测试用例,然后创建一个失败版本的页面。我们对失败情况进行测试,然后修改页面的内容使其可以工作。结果如下:


    清单 12. 测试失败情况,然后修改页面

    这两个测试都可以通过,这就意味着测试代码可以正常工作。

    不过对 HTML 前端的测试有一个缺陷:JavaScript。超文本传输协议(HTTP)客户机代码对页面进行检索,但是却没有执行 JavaScript。因此如果我们在 JavaScript. 中有很多代码,就必须创建用户代理级的单元测试。我发现实现这种功能的最佳方法是使用 Microsoft® Internet Explorer® 内嵌的自动化层功能。通过使用 PHP 编写的 Microsoft Windows® 脚本,可以使用组件对象模型(COM)接口来控制 Internet Explorer,让它在页面之间进行导航,然后使用文档对象模型(DOM)方法在执行特定用户操作之后查找页面中的元素。

    这是我了解的对前端 JavaScript. 代码进行单元测试的惟一一种方法。我承认它并不容易编写和维护,这些测试即使在对页面稍微进行改动时也很容易遭到破坏。






    编写哪些测试以及如何编写这些测试

    在编写测试时,我喜欢覆盖以下情况:

    所有正面测试
    这组测试可以确保所有的东西都如我们期望的一样工作。
    所有负面测试
    逐一使用这些测试,从而确保每个失效或异常情况都被测试到了。
    正面序列测试
    这组测试可以确保按照正确顺序的调用可以像我们期望的一样工作。
    负面序列测试
    这组测试可以确保当不按正确顺序进行调用时就会失败。
    负载测试
    在适当情况下,可以执行一小组测试来确定这些测试的性能在我们期望的范围之内。例如,2,000 次调用应该在 2 秒之内完成。
    资源测试
    这些测试确保应用编程接口(API)可以正确地分配并释放资源 —— 例如,连续几次调用打开、写入以及关闭基于文件的 API,从而确保没有文件依然是被打开的。
    回调测试
    对于具有回调方法的 API 来说,这些测试可以确保如果没有定义回调函数,代码可以正常运行。另外,这些测试还可以确保在定义了回调函数但是这些回调函数操作有误或产生异常时,代码依然可以正常运行。

    这是有关单元测试的几点想法。有关如何编写单元测试,我也有几点建议:

    不要使用随机数据
    尽管在一个界面中产生随机数据看起来貌似一个好主意,但是我们要避免这样做,因为这些数据会变得非常难以调试。如果数据是在每次调用时随机生成的,那么就可能产生一次测试时出现了错误而另外一次测试却没有出现错误的情况。如果测试需要随机数据,可以在一个文件中生成这些数据,然后每次运行时都使用这个文件。采用这种方法,我们就获得了一些 “噪音” 数据,但是仍然可以对错误进行调试。
    分组测试
    我们很容易累积起数千个测试,需要几个小时才能执行完。这没什么问题,但是对这些测试进行分组使我们可以快速运行某组测试并对主要关注的问题进行检查,然后晚上运行完整的测试。
    编写稳健的 API 和稳健的测试
    编写 API 和测试时要注意它们不能在增加新功能或修改现有功能时很容易就会崩溃,这一点非常重要。这里没有通用的绝招,但是有一条准则是那些 “振荡的” 测试(一会儿失败,一会儿成功,反复不停的测试)应该很快地丢弃。






    结束语

    单元测试对于工程师来说意义重大。它们是现在热门话题敏捷开发过程(这个过程非常强调编码的作用,因为文档需要一些证据证明代码是按照规范进行工作的)的一个基础。单元测试就提供了这种证据。这个过程从单元测试开始入手,这定义了代码应该实现但目前尚未实现的功能。因此,所有的测试最初都会失败。然后当代码接近完成时,测试就通过了。当所有测试全部通过时,代码也就变得非常完善了。

    我从来没有在不使用单元测试的情况下编写大型代码或修改大型或复杂的代码块。我通常都是在修改代码之前就为现有代码编写了单元测试,这样可以确保自己清楚在修改代码时破坏了什么(或者没有破坏什么)。这是为了开发交付的代码提供了很大的信心,相信它们正在正确运行。

  • 测试需要考虑什么呢。。。。。ing

    2007-10-18 18:15:25

    黑盒测试:不基于内部设计和代码的任何知识,而是基于需求和功能性。
      

    白盒测试:基于一个应用代码的内部逻辑知识,测试是基于覆盖全部代码、分支、路径、条件。

      单元测试:最微小规模的测试;以测试某个功能或代码块。典型地由程序员而非测试员来做,因为它需要知道内部程序设计和编码的细节知识。这个工作不容易作好,除非应用系统有一个设计很好的体系结构; 还可能需要开发测试驱动器模块或测试套具。

      累积综合测试:当一个新功能增加后,对应用系统所做的连续测试。它要求应用系统的不同形态的功能能够足够独立以可以在全部系统完成前能分别工作,或当需要时那些测试驱动器已被开发出来; 这种测试可由程序员或测试员来做。

      集成测试:一个应用系统的各个部件的联合测试,以决定他们能否在一起共同工作。部件可以是代码块、独立的应用、网络上的客户端或服务器端程序。这种类型的测试尤其与客户服务器和分布式系统有关。

      功能测试:用于测试应用系统的功能需求的黑盒测试方法。这类测试应由测试员做,这并不意味着程序员在发布前不必检查他们的代码能否工作(自然他能用于测试的各个阶段)

      系统测试:基于系统整体需求说明书的黑盒类测试;应覆盖系统所有联合的部件。

      端到端测试:类似于系统测试;测试级的宏大的端点;涉及整个应用系统环境在一个现实世界使用时的模拟情形的所有测试。例如与数据库对话,用网络通讯,或与外部硬件、应用系统或适当的系统对话。

      健全测试:典型地是指一个初始化的测试工作,以决定一个新的软件版本测试是否足以执行下一步大的测试努力。例如,如果一个新版软件每5分钟与系统冲突,使系统陷于泥潭,说明该软件不够健全,目前不具备进一步测试的条件。

      衰竭测试:软件或环境的修复或更正后的再测试。可能很难确定需要多少遍再次测试。尤其在接近开发周期结束时。自动测试工具对这类测试尤其有用。

      接受测试:基于客户或最终用户的规格书的最终测试,或基于用户一段时间的使用后,看软件是否满足客户要求。

      负载测试:测试一个应用在重负荷下的表现,例如测试一个 Web 站点在大量的负荷下,何时系统的响应会退化或失败。

      强迫测试:在交替进行负荷和性能测试时常用的术语。也用于描述象在异乎寻常的重载下的系统功能测试之类的测试,如某个动作或输入大量的重复,大量数据的输入,对一个数据库系统大量的复杂查询等。

      性能测试:在交替进行负荷和强迫测试时常用的术语。理想的性能测试”(和其他类型的测试)应在需求文档或质量保证、测试计划中定义。

      可用性测试:对用户友好性的测试。显然这是主观的,且将取决于目标最终用户或客户。用户面谈、调查、用户对话的录象和其他一些技术都可使用。程序员和测试员通常都不宜作可用性测试员。

      安装/卸载测试:对软件的全部、部分或升级安装/卸载处理过程的测试。

      恢复测试:测试一个系统从如下灾难中能否很好地恢复,如遇到系统崩溃、硬件损坏或其他灾难性问题。

      安全测试:测试系统在防止非授权的内部或外部用户的访问或故意破坏等情况时怎么样。这可能需要复杂的测试技术。

      兼容测试:测试软件在一个特定的硬件/软件/操作系统/网络等环境下的性能如何。

      比较测试:与竞争伙伴的产品的比较测试,如软件的弱点、优点或实力。

      Alpha 测试:在系统开发接近完成时对应用系统的测试;测试后,仍然会有少量的设计变更。这种测试一般由最终用户或其他人员员完成,不能由程序员或测试员完成。

      Beta 测试:当开发和测试根本完成时所做的测试,而最终的错误和问题需要在最终发行前找到。这种测试一般由最终用户或其他人员员完成,不能由程序员或测试员完成。

  • 测试流程理念

    2007-08-16 15:30:27

    测试工程师的工作流程,与公司的整体工作流程,项目的测试要求等因素相关。本文主要讨论测试工程师的一般工作流程。

    做好测试准备

    1)明确测试任务的范围

    测试文档通常包括测试目的、测试环境、测试方法、测试用例、测试工具等。测试工程师首先要通读文档,对整个测试要求形成整体认识,明确测试目的,以及测试要求和测试重点,明确软件测试方法和使用的测试工具。

    2)明确测试时间

    明确测试周期和测试时间进度。如果是多人合作完成一个软件,则要首先明确属于自己的测试内容、根据测试内容和测试周期,估算自己每日应该完成的工作量。此外由于软件测试是群体协作的测试活动,需要明确哪些测试内容要与其他测试工程师协作才能完成。

    3)设置测试环境

    根据测试文档要求,设置测试需要的软件和硬件环境,包括操作系统,要测试的软件和其他必要的测试工具软件等。所有这些完成后,分别运行,查看是否能正确运行,保证符合测试文档要求的测试环境。

    4)学习被测试软件

    对于不太熟悉的软件,可以通过阅读软件自身的教程和帮助文件,学习本软件的一般操作方法,也可以参照相关的书籍资料等。另外,向熟悉测试软件的其他同事请教软件使用方法,也是学习软件的一条捷径。对软件使用越熟练,测试过程越顺利,测试效果越理想。

    5)确认完全理解测试任务

    软件测试最重要的要求就是确实明确了测试任务和要求,这包括正确理解了测试文档,确认可以按照测试进度要求,完成测试。对于测试工具要正确安装,熟练使用。如果有任何不明白之处,向软件测试负责人询问。切忌凭自己的理解和主观推测,自行其事。当然,真正测试中,往往会遇到各种新的小疑难问题,也需要及时向测试负责人请教,以保证测试顺利进行。

    执行软件测试任务

    1)按照测试文档要求,逐项认真测试

    根据测试文档测试要求,按照测试步骤,逐项进行。通过运行软件,观察测试结果,与软件需求说明书的内容进行比较,找出软件错误。对于需要调用测试用例的测试,保证正确地调用了测试用例,注意观察和分析测试结果。某些不容易重复的错误,需要反复测试,总结重复该错误所需要的测试步骤,直到确认可以重复出现为止。

    2)记录发现的错误,填写软件问题报告

    为了纠正软件中的错误,测试工程师要正确记录发现的错误,将错误再现的步骤写入测试报告中,测试报告是程序测试的重要组成部分,正确书写测试报告是对测试工程师的基本要求。采用软件缺陷数据库管理测试中发现的软件缺陷,每一条错误作为数据库的一条记录,方便记录、修改、查询。

    3)填写测试进度表和必要的测试内容记录表

    每天将测试内容写入测试进度表文档,可以使测试负责人了解测试进度,控制测试周期内测试的连续性,增强测试过程控制性,保证测试的正常进行。测试记录要准确完整,实事求是,必要时插入测试注释,解释测试中的特殊问题。测试进度表是评价测试质量和工作内容的重要凭证,对于测试后发现的测试错误和失误,可以通过检查测试记录,寻找产生错误的原因。

    4) 测试中发现疑难及时请教

    测试是一个动态的过程,可能由于自己的错误操作或者测试文档内容的错误,使得测试过程中出现自己不能解释的现象或结果,出现与测试要求不符合的情形,这时可能需要与其他测试者协商或求助,如果问题仍然不能解决,应该及时请教,听取意见和建议,必要时反复讨论直到问题全面解决。

    全面检查测试结果

    1)对照测试文档要求,检查测试内容是否完整

    测试完成后,要对照测试文档检查测试是否全部完成,保证没有丢失测试内容。如果某些内容,由于测试环境的要求不满足,或者由于测试时间短没有进行,则要写入测试进度表文档。

    2)检验书写的软件问题报告的记录,使之确切、规范

    正确书写测试记录是保证迅速定位软件错误,加快改正错误的必要前提。专业规范的软件记录报告是体现公司测试水平和专业实力的外在体现。认真检查书写的每条记录是否符合规范,格式、步骤、内容一一检查,必要时补充或删减。

    上述三个阶段,相互联系紧密,其中准备是基础,测试是重点,检查是保证,应该根据测试的软件特点合理安排。

    jeRRy.Lee

     

  • xml 编程 -DOM技术

    2007-08-07 18:15:16

    DOM 对象

    <?xml version="1.0" encoding="gb2312" ?>
    <书籍>
    <书名>Red Hat Linux系统管理大全</书名>
    <作者 email="Thomas@newyork.net">Thomas Schenk</作者>
    <出版社>机械工业出版社</出版社>
    </书籍>

    ------------------------------------------------------------------------------------

    <HTML>
    <HEAD>
         <TITLE>访问XML文档根节点</TITLE>
         <scrīpt LANGUAGE="Javascrīpt" FOR="window" EVENT="ONLOAD"> //设置当浏览器第一次在窗口中打开该页时执行脚本元素scrīpt中的代码
             var xmlDoc =xmldso.XMLDocument; //表示XML文档的根节点
             xmlDoc.load("test5-2.xml"); //加载XML文件
             url.innerText=xmlDoc.url; //使用HTML元素中的id元素的innerText来显示XML文件到HTML中
             root.innerText=xmlDoc.nodeName;
             rootElement.innerText=xmlDoc.documentElement.nodeName;
             content.innerText=xmlDoc.documentElement.xml; 
         </scrīpt>
    </HEAD>
    <BODY>
        <OBJECT width=0 height=0
           classid="clsid:550dda30-0541-11d2-9ca9-0060b0ec3d39"
           id="xmldso">
        </OBJECT> //通过OBJECT元素在文档中插入一个DSO对象
        <h2>XML文档信息</h2>
        <span><b>XML文档URL:</b></span>
        <span id="url"></span>
        <br>    
        <span><b>根节点名称:</b></span>
        <span id="root"></span>    
        <br>
        <span><b>根元素名称:</b></span>
        <span id="rootElement"></span>    
        <br>
        <span><b>根元素内容:</b></span>
        <br>
        <span id="content"></span>    
        <br>
    <html>
    </BODY>
    </HTML>

    访问XML文档中元素的内容

    1。使用childNodes()方法访问元素

    <HTML>
    <HEAD>
         <TITLE>访问XML文档元素</TITLE>
         <scrīpt LANGUAGE="Javascrīpt" FOR="window" EVENT="ONLOAD">
             var xmlDoc =xmldso.XMLDocument;
             xmlDoc.load("test5-2.xml");
             var rootElement=xmlDoc.documentElement;
             title.innerText=rootElement.childNodes(0).text;
             writer.innerText=rootElement.childNodes(1).text;
             publish.innerText=rootElement.childNodes(2).text;         
         </scrīpt>
    </HEAD>
    <BODY>
        <OBJECT width=0 height=0
           classid="clsid:550dda30-0541-11d2-9ca9-0060b0ec3d39"
           id="xmldso">
        </OBJECT>
        <h3>书籍元素内容</h3>
        <span><b>书名:</b></span>
        <span id="title"></span>    
        <br>
        <span><b>作者:</b></span>
        <span id="writer"></span>    
        <br>
        <span><b>出版社:</b></span>
        <span id="publish"></span>
    </BODY>
    </HTML>


    2。使用getElementsByTagName()方法访问元素

    <HTML>
    <HEAD>
         <TITLE>访问XML文档元素</TITLE>
         <scrīpt LANGUAGE="Javascrīpt" FOR="window" EVENT="ONLOAD">
             var xmlDoc =xmldso.XMLDocument;
             xmlDoc.load("test5-2.xml");
             var rootElement=xmlDoc.documentElement;
             var el1=rootElement.getElementsByTagName("书名");
             var el2=rootElement.getElementsByTagName("作者");
             var el3=rootElement.getElementsByTagName("出版社");
             title.innerText=el1(0).text;
             writer.innerText=el2(0).text;
             publish.innerText=el3(0).text;
         </scrīpt>
    </HEAD>
    <BODY>
        <OBJECT width=0 height=0
           classid="clsid:550dda30-0541-11d2-9ca9-0060b0ec3d39"
           id="xmldso">
        </OBJECT>
        <h3>书籍元素内容</h3>
        <span><b>书名:</b></span>
        <span id="title"></span>    
        <br>
        <span><b>作者:</b></span>
        <span id="writer"></span>    
        <br>
        <span><b>出版社:</b></span>
        <span id="publish"></span>
    </BODY>
    </HTML>


    3。使用document.write方法输出HTML文档内容

    <HTML>
    <HEAD>
         <TITLE>访问XML文档元素</TITLE>
    </HEAD>
    <BODY>
        <OBJECT width=0 height=0
           classid="clsid:550dda30-0541-11d2-9ca9-0060b0ec3d39"
           id="xmldso">
        </OBJECT>
        <scrīpt LANGUAGE="Javascrīpt" FOR="window" EVENT="ONLOAD">
             var xmlDoc =xmldso.XMLDocument;
             xmlDoc.load("test5-2.xml");
             var rootElement=xmlDoc.documentElement;
             document.write("<h3>书籍元素内容</h3>");
             var str="";
             str=rootElement.childNodes(0).text;
             document.write("<b>书名:</b>"+str+"<br>");
             str=rootElement.childNodes(1).text;
             document.write("<b>作者:</b>"+str+"<br>");
             str=rootElement.childNodes(2).text;
             document.write("<b>出版社:</b>"+str+"<br>");
         </scrīpt>
    </BODY>
    </HTML>


    4。使用HTML元素的innerHTML属性显示XML文档数据

    <HTML>
    <HEAD>
         <TITLE>访问XML文档元素</TITLE>
        <scrīpt LANGUAGE="Javascrīpt" FOR="window" EVENT="ONLOAD">
             var xmlDoc =xmldso.XMLDocument;
             xmlDoc.load("test5-2.xml");
             var rootElement=xmlDoc.documentElement;
             outhtml.innerHTML=
                   "<b>书名:</b>"+
                   rootElement.childNodes(0).text+
                   "<br><b>作者:</b>"+
                   rootElement.childNodes(1).text+
                   "<br><b>出版社:</b>"+
                   rootElement.childNodes(2).text;
         </scrīpt>
    </HEAD>
    <BODY>
        <OBJECT width=0 height=0
           classid="clsid:550dda30-0541-11d2-9ca9-0060b0ec3d39"
           id="xmldso">
        </OBJECT>
        <h3>书籍元素内容</h3>
        <span id="outhtml"></span>
    </BODY>
    </HTML>


    访问元素属性

    元素的attributes属性用于获得元素的属性节点集合

    <HTML>
    <HEAD>
         <TITLE>访问XML文档元素属性</TITLE>
        <scrīpt LANGUAGE="Javascrīpt" FOR="window" EVENT="ONLOAD">
             var xmlDoc =xmldso.XMLDocument;
             xmlDoc.load("test5-2.xml");
             var rootElement=xmlDoc.documentElement;
        var element=rootElement.getElementsByTagName("作者");
        var attribute=element(0).attributes;
        outhtml.innerHTML=
                                   "<b>属性名称:</b>"+
                                   attribute(0).nodeName+ //获得属性名
                                   "<br><b>属性值:</b>"+
                                   attribute(0).nodeValue; //获得属性值
         </scrīpt>
    </HEAD>
    <BODY>
        <OBJECT width=0 height=0
           classid="clsid:550dda30-0541-11d2-9ca9-0060b0ec3d39"
           id="xmldso">
        </OBJECT>
        <h3>“作者”元素属性</h3>
        <span id="outhtml"></span>
    </BODY>
    </HTML>

  • PHP 学习手记

    2007-08-07 18:14:19

    1. 防止页面刷新,重复提交POST变量的方法:
       使用 Header("Location: test.php");

    2. 修改PHP支持的内存大小
       /etc/php.ini  找到
    ;;;;;;;;;;;;;;;;;;;
    ; Resource Limits ;
    ;;;;;;;;;;;;;;;;;;;
     
    max_execution_time = 30     ; Maximum execution time of each scrīpt, in seconds
    max_input_time = 60 ; Maximum amount of time each scrīpt may spend parsing request data
    memory_limit = 8M      ; Maximum amount of memory a scrīpt may consume (8MB)

        修改成需要的大小就可以了
  • 网络广告的计价方式

    2007-08-07 18:11:49

    一个网络媒体(网站)会包含有数十个甚至成千上万个页面,网络广告所投放的位置和价格 就牵涉到特定的页面以及浏览人数的多寡。这好比平面媒体(如报纸)的“版位”、“发行 量”,或者电波媒体(如电视)的“时段”、“收视率”的概念。

    1.CPM(Cost Per Mille,或者Cost Per Thousand;Cost Per Impressions) 每千人成本

    网上广告收费最科学的办法是按照有多少人看到你的广告来收费。按访问人次收费已经成为网络广告的惯例。CPM(千人成本)指的是广告投放过程中,听到或者看到某广告的每一人平均分担到多少广告成本。传统媒介多采用这种计价方式。在网上广告,CPM取决于“印象” 尺度,通常理解为一个人的眼睛在一段固定的时间内注视一个广告的次数。比如说一个广告横幅的单价是1元/CPM的话,意味着每一千个人次看到这个Ban-ner的话就收1元,如此类推 ,10,000人次访问的主页就是10元。

    至于每CPM的收费究竟是多少,要根据以主页的热门程度(即浏览人数)划分价格等级,采 取固定费率。国际惯例是每CPM收费从5美元至200美元不等。

    2.CPC(Cost Per Click;Cost Per Thousand Click-Through) 每点击成本

    以每点击一次计费。这样的方法加上点击率限制可以〖WX)〗加强作弊的难度,而且是宣传网站站点的最优方式。但是,此类方法就有不少经营广告的网站觉得不公平,比如,虽然浏览者没有点击,但是他已经看到了广告,对于这些看到广告却没有点击的流量来说,网站成了白忙活。有很多网站不愿意做这样的广告,据说,是因为传统媒体从来都没有这样干过。

    3.CPA(Cost Per Action) 每行动成本

    CPA计价方式是指按广告投放实际效果,即按回应的有效问卷或定单来计费,而不限广告投 放量。CPA的计价方式对于网站而言有一定的风险,但若广告投放成功,其收益也比CPM的计 价方式要大得多。

     广告主为规避广告费用风险,只有当网络用户点击旗帜广告,链接广告主网页后,才按点击 次数付给广告站点费用。

    4.CPR(Cost Per Response) 每回应成本

    以浏览者的每一个回应计费。这种广告计费充分体现了网络广告“及时反应、直接互动、准确记录”的特点,但是,这个显然是属于辅助销售的广告模式,对于那些实际只要亮出名字就已经有一半满足的品牌广告要求,大概所有的网站都会给予拒绝,因为得到广告费的机会 比CPC还要渺茫。

    5.CPP(Cost Per Purchase) 每购买成本

    广告主为规避广告费用风险,只有在网络用户点击旗帜广告并进行在线交易后,才按销售笔 数付给广告站点费用。

    无论是CPA还是CPP,广告主都要求发生目标消费者的“点击”,甚至进一步形成购买,才予 付费:CPM则只要求发生“目击”(或称“展露”、“印象”),就产生广告付费。

    6.包月方式

     很多国内的网站是按照“一个月多少钱”这种固定收费模式来收费的,这对客户和网站都不公平,无法保障广告客户的利益。虽然国际上一般通用的网络广告收费模式是CPM(千人印象成本)和CPC(千人点击成本),但在我国,一个时期以来的网络广告收费模式始终含糊不清,网络广告商们各自为政,有的使用CPM和CPC计费,有的干脆采用包月的形式,不管效果好坏,不管访问量有多少,一律一个价。尽管现在很多大的站点多已采用CPM和CPC计费,但很多 中小站点依然使用包月制。

    7.PFP(Pay-For-Performance) 按业绩付费

    著名市场研究机构福莱斯特(Forrerster)研究公司最近公布的一项研究报告称,在今后4年之内,万维网将从目前的广告收费模式——即根据每千次闪现(impression)收费——CPM(这亦是大多数非在线媒体均所采用的模式)变为按业绩收费(pay-for-performance)的模式。

    虽然根据该公司研究人员的预测,未来5年网上广告将呈爆炸性增长,从1999年的28亿美元 猛增至2004年的220亿美元,但是经营模式的转变意味着盈利将成为网络广告发布商关心的 首要问题。

    福莱斯特公司高级分析师尼尔说:“互联网广告的一大特点是,它是以业绩为基础的。对发布商来说,如果浏览者不采取任何实质性的购买行动,就不可能获利。”丘比特公司分析师格拉克说,基于业绩的定价计费基准有点击次数、销售业绩、导航情况等等,不管是哪种, 可以肯定的是这种计价模式将得到广泛的采用。

    虽然基于业绩的广告模式受到广泛欢迎,但并不意味着CPM模式已经过时。相反,如果厂家坚持这样做,那么受到损失的只会是它自已。一位资深分析家就指出,假如商家在谈判中不能灵活处理,而坚持采取业绩模式,它将失去很多合作的机会,因为目前许多网站并不接受 这种模式。

    8.其他计价方式

    某些广告主在进行特殊营销专案时,会提出以下方法个别议价:

    (1)CPL(Cost Per Leads):以搜集潜在客户名单多少来收费;

    (2)CPS(Cost Per Sales):以实际销售产品数量来换算广告刊登金额。

    总之,网络广告本身固然有自己的特点,但是玩弄一些花哨名词解决不了实际问题,一个网站要具备有广告价值,都是有着一定的发展历史,那么,在目标市场决策以后挑选不同的内容网站,进而考察其历史流量进行估算,这样,就可以概算广告在一定期限内的价格,在这个基础上,或者根据不同性质广告,可以把CPC、CPR、CPA这些东西当作为加权,如此而已 。

    相比而言,CPM和包月方式对网站有利,而CPC、CPA、CPR、CPP或PFP则对广告主有利。目前 比较流行的计价方式是CPM和CPC,最为流行的则为CPM。

  • MySQL5 新特点 跨存储类式数据库表

    2007-08-07 18:10:19

    目前一个特定的事实是,企业数据继续散布在企业的各个地方,这些数据可能以不同存储类型的数据库表的形式存在,数据库管理人员为了管理远程服务器上的数据库对象时,经常需要登录不同的物理服务器才能实现。而"跨类联合存储式数据库表"这一MySQL5的新技术使得几个分布在不同的物理位置的数据库,可以成为单一的逻辑数据库形式,呈现在最终用户的面前,从而 简化了对全部数据库的访问。

    MySQL5推出的跨类联合存储式数据库表(federated tables)可以将存放在不同数据库服务器上的数据库对象作联结,然后生成一个或多个逻辑数据库,任何类型的存储引擎都作为federated table定义的目标,而且这些定义完全支持SELECT,INSERT,UPDATE,和DELETE等已存在的功能。下图是MySQL5支持的不同类型的存储引擎示意:

    举例来说,假定下面格式的表存储在一台Linux服务器上: 

    如果数据库管理人员希望在运行着不同数据库的 windows服务器上来参考上面的存放在linux服务器上的数据库,就可以通过定义下面的federated table来实现:
    mysql> CREATE TABLE client (
    -> client_id int(11) NOT NULL,
    -> client_first_name varchar(20) NOT NULL,
    -> client_last_name varchar(40) NOT NULL,
    -> client_gender char(1) NOT NULL,
    -> client_year_of_birth int(4) NOT NULL,
    -> client_marital_status varchar(20) default NULL,
    -> client_street_address varchar(40) NOT NULL,
    -> client_postal_code varchar(10) NOT NULL,
    -> client_city varchar(30) NOT NULL,
    -> client_state_province varchar(40) NOT NULL
    -> client_phone_number varchar(25) NOT NULL, t NULL,
    -> client_household_income bigint(30) default NULL,
    -> client_country varchar(40) default NULL,
    -> broker_id int(11) NOT NULL) ENGINE=FEDERATED
    -> COMMENT =
    -> 'mysql://myuser:passueryword@192.164.3.2:3306/gim/client';
    Query OK, 0 rows affected (0.20 sec)

    mysql> select count(*) from client;
    +----------+
    | count(*) |
    +----------+
    | 5600 |
    +----------+
    1 row in set (0.50 sec)
    以上显示了federated table表的用处
  • MySQL 调度和锁定

    2007-08-07 18:09:41

    在很多客户一起查询数据表时,如果使客户能最快地查询到数据就是调度锁定做的工作了。在MySQL中,我们把select操作叫做,把对数据表修改增加的操作(INSERT,UPDATE,REPLACE...)叫做。MySQL的基本调度策略可以归纳为以下两条:

    写入请求将按它们到达服务器的顺序进行处理;

    写操作的优先级要高于读操作

    MyISAM和ISAM数据表的调度策略是在数据表锁的帮助下实现的,在客户程序要访问数据表之前,需获得相应的锁,在完成对数据表的操作后,再释放该锁。锁的管理通常由服务器管理,也可人为地用LOCK TABLES和UNLOCK TABLES命令来申请和释放锁。写操作时,需要申请一个独占性的锁,也就是说在写操作其间,该表只能由写操作的客户使用。读操作时,客户必须申请一个允许其他客户对数据表进行写操作的锁,以确保客户在读的过程中数据表不会发生改变。但读操作锁不是独占的,可有多个读操作同时作用于同一个数据表。

    通过一些修饰符可影响调度策略,如LOW_PRIORITY(用于DELETE,INSERT,LOAD DATA,REPLACE,UPDATE语句)、HIGH_PRIORITY(用于SELECT语句)、DELAYED(用于INSERT和 REPLACE语句)。它们的作用是这样的:

    LOW_PRIORITY会使写操作的优先级降低到读操作以下,也就是说读操作会阻塞该级别的写操作,SELECT的HIGH_PRIORITY有类似的作用。

    INSERT语句中的DELAYED修饰会使插入操作被放入一个“延迟插入”队列。并返回状态信息给客户,使客户程序可在新数据行还没插入到数据表之前继续执行后面的操作。如果一直有客户读该数据表,新数据行会一直待在队列中,直到数据表没有读操作时,服务器才会把队列中的数据行真正插入到数据表中。该语句可用在以下场合,在一个有冗长查询的数据表中插入数据,而你又不想被阻塞,你就可发出INSERT DELAYED语句,把插入操作放入服务器“延迟插入”队列,你无需等待就马上可进行接下来的操作。

    当一个数据表里从未进行过删除操作或刚刚对它进行过碎片整理的情况下,用INSERT语句插入的数据行只会被添加到数据表的末尾,而不会插入到数据表的中间位置。这样,对于MyISAM表,MySQL允许在有其它客户正在读操作的时间进行写操作。我们称之这并发插入。要使用该技巧,需注意以下两个问题:

    不要在INSERT语句中使用LOW_PRIORITY修饰符。

    读操作应用LOCK TABLES ... READ LOCAL而不是用LOCK TABLES ... READ语句来进行数据表读锁定。LOCAL关键字只对数据表中已存在行进行锁定,不会阻塞把新行添加到数据表末尾。

    BDB数据表使用页面级操作锁,InnoDB数据表使用数据行级操作锁。所以这两种表的并发性比MyISAM和ISAM数据表这种表级锁的并发性会好很多。其中InnoDB的并发性最好。综上所述,我们可得出以下结论:

    MyISAM和ISAM数据表的检索速度最快,但如果在检索和修改操作较多的场合,会出锁竞争的问题,造成等待时间延长。

    BDB和InnoDB数据表能在有大量修改操作的环境下提供很好的并发性,从而提供更好的性能。

    MyISAM和ISAM数据表由于进行表级锁定,所以不会出现死锁现象,BDB和InnoDB数据表则存在死锁的可能性。
  • MySQL数据库索引经验之浅见

    2007-08-07 18:09:00

    在数据库表中,使用索引可以大大提高查询速度。

    假如我们创建了一个testIndex表:
    CREATE TABLE testIndex(i_testID INT NOT NULL,vc_Name VARCHAR(16) NOT NULL);

    我们随机向里面插入了1000条记录,其中有一条
    i_testIDvc_Name
    555erquan

    在查找vc_Name="erquan"的记录
    SELECT * FROM testIndex WHERE vc_Name='erquan';
    时,如果在vc_Name上已经建立了索引,MySql无须任何扫描,即准确可找到该记录!相反,MySql会扫描所有记录,即要查询1000次啊~~可以索引将查询速度提高100倍。

    一、索引分单列索引和组合索引
    单列索引:即一个索引只包含单个列,一个表可以有多个单列索引,但这不是组合索引。
    组合索引:即一个索包含多个列。

    二、介绍一下索引的类型

    1.普通索引。
    这是最基本的索引,它没有任何限制。它有以下几种创建方式:
    (1)创建索引:CREATE INDEX indexName ON tableName(tableColumns(length));如果是CHAR,VARCHAR类型,length可以小于字段实际长度;如果是BLOB 和 TEXT 类型,必须指定length,下同。
    (2)修改表结构:ALTER tableName ADD INDEX [indexName] ON (tableColumns(length))
    (3)创建表的时候直接指定:CREATE TABLE tableName ( [...], INDEX [indexName] (tableColumns(length)) ;

    2.唯一索引。
    它与前面的"普通索引"类似,不同的就是:索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。它有以下几种创建方式:
    (1)创建索引:CREATE UNIQUE INDEX indexName ON tableName(tableColumns(length))
    (2)修改表结构:ALTER tableName ADD UNIQUE [indexName] ON (tableColumns(length))
    (3)创建表的时候直接指定:CREATE TABLE tableName ( [...], UNIQUE [indexName] (tableColumns(length));

    3.主键索引
    它是一种特殊的唯一索引,不允许有空值。一般是在建表的时候同时创建主键索引:CREATE TABLE testIndex(i_testID INT NOT NULL AUTO_INCREMENT,vc_Name VARCHAR(16) NOT NULL,PRIMARY KEY(i_testID)); 当然也可以用ALTER命令。
    记住:一个表只能有一个主键。

    4.全文索引
    MySQL从3.23.23版开始支持全文索引和全文检索。这里不作讨论,呵呵~~

    删除索引的语法:DROP INDEX index_name ON tableName

    三、单列索引和组合索引

    为了形象地对比两者,再建一个表:
    CREATE TABLE myIndex ( i_testID INT NOT NULL AUTO_INCREMENT, vc_Name VARCHAR(50) NOT NULL, vc_City VARCHAR(50) NOT NULL, i_Age INT NOT NULL, i_SchoolID INT NOT NULL, PRIMARY KEY (i_testID) );

    在这10000条记录里面7上8下地分布了5条vc_Name="erquan"的记录,只不过city,age,school的组合各不相同。
    来看这条T-SQL:
    SELECT i_testID FROM myIndex WHERE vc_Name='erquan' AND vc_City='郑州' AND i_Age=25;

    首先考虑建单列索引:
    在vc_Name列上建立了索引。执行T-SQL时,MYSQL很快将目标锁定在了vc_Name=erquan的5条记录上,取出来放到一中间结果集。在这个结果集里,先排除掉vc_City不等于"郑州"的记录,再排除i_Age不等于25的记录,最后筛选出唯一的符合条件的记录。

    虽然在vc_Name上建立了索引,查询时MYSQL不用扫描整张表,效率有所提高,但离我们的要求还有一定的距离。同样的,在vc_City和i_Age分别建立的单列索引的效率相似。

    为了进一步榨取MySQL的效率,就要考虑建立组合索引。就是将vc_Name,vc_City,i_Age建到一个索引里:
    ALTER TABLE myIndex ADD INDEX name_city_age (vc_Name(10),vc_City,i_Age);--注意了,建表时,vc_Name长度为50,这里为什么用10呢?因为一般情况下名字的长度不会超过10,这样会加速索引查询速度,还会减少索引文件的大小,提高INSERT的更新速度。

    执行T-SQL时,MySQL无须扫描任何记录就到找到唯一的记录!!

    肯定有人要问了,如果分别在vc_Name,vc_City,i_Age上建立单列索引,让该表有3个单列索引,查询时和上述的组合索引效率一样吧?嘿嘿,大不一样,远远低于我们的组合索引~~虽然此时有了三个索引,但MySQL只能用到其中的那个它认为似乎是最有效率的单列索引。

    建立这样的组合索引,其实是相当于分别建立了
    vc_Name,vc_City,i_Age
    vc_Name,vc_City
    vc_Name
    这样的三个组合索引!为什么没有vc_City,i_Age等这样的组合索引呢?这是因为mysql组合索引"最左前缀"的结果。简单的理解就是只从最左面的开始组合。并不是只要包含这三列的查询都会用到该组合索引,下面的几个T-SQL会用到:
    SELECT * FROM myIndex WHREE vc_Name="erquan" AND vc_City="郑州"
    SELECT * FROM myIndex WHREE vc_Name="erquan"
    而下面几个则不会用到:
    SELECT * FROM myIndex WHREE i_Age=20 AND vc_City="郑州"
    SELECT * FROM myIndex WHREE vc_City="郑州"

    四、使用索引
    到此你应该会建立、使用索引了吧?但什么情况下需要建立索引呢?一般来说,在WHERE和JOIN中出现的列需要建立索引,但也不完全如此,因为MySQL只对 <,<=,=,>,>=,BETWEEN,IN,以及某些时候的LIKE(后面有说明)才会使用索引。
    SELECT t.vc_Name FROM testIndex t LEFT JOIN myIndex m ON t.vc_Name=m.vc_Name WHERE m.i_Age=20 AND m.vc_City='郑州' 时,有对myIndex表的vc_City和i_Age建立索引的需要,由于testIndex表的vc_Name开出现在了JOIN子句中,也有对它建立索引的必要。

    刚才提到了,只有某些时候的LIKE才需建立索引?是的。因为在以通配符 % 和 _ 开头作查询时,MySQL不会使用索引,如
    SELECT * FROM myIndex WHERE vc_Name like'erquan%'
    会使用索引,而
    SELECT * FROM myIndex WHEREt vc_Name like'%erquan'
    就不会使用索引了。


    五、索引的不足之处

    上面说了那么多索引的好话,它真的有像传说中那么优秀么?当然会有缺点了。

    1.虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行INSERT、UPDATE和DELETE。因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件

    2.建立索引会占用磁盘空间的索引文件。一般情况这个问题不太严重,但如果你在一个大表上创建了多种组合索引,索引文件的会膨胀很快。


    篇尾:
    讲了这么多,无非是想利用索引提高数据库的执行效率。不过索引只是提高效率的一个因素。如果你的MySQL有大数据的表,就需要花时间研究建立最优秀的索引或优化查询语句。

1044/6<123456>
Open Toolbar