用户 密码 注册
首页FreeInoutMy邮箱HomeBlog论坛365keyWiki下载新闻通
IT装备社区产品笔记本台式机DIYDC•DV外设RSS i门户 滚动QA采访
MyInout: 乐度网店系统   游戏玩家   PCWORLD中国网   站长赚钱站长网址大全   开心小说屋   奇闻网   卫星电视网   川铎电脑网   KF25.CN   幼儿园软件专业网   彩 搜   一起来音乐社区   冰古blog   去乐美女视频   Nicky's blog   DavidZou'sBlog   eNet硅谷动力下载频道   TNT8美女图片   ShopEx网上商城系统   老大123网址之家  
    关键字 (可以是站点名称或网址)   按地区查询   INOUT综合排名
[flyinweb's blog] 技术交流 联系该网站
所属分类: Blog >> IT
所在地区: 福建 省 厦门 市
网站说明  
为您带去的流量
昨日: 1 总流量: 188
您为donews带来的流量
昨日: 0 总流量: 0
asp,php,jsp,.net,js,html,dhtml.css,xml等WEB开发技术资源,数据库管理,windows,linux,unix等系统管理资源,网络管理,安全管理等资源,涉及网站推广、google推广、搜索、优化及其它常用应用程序操作等的相关资源
Tomcat配置技巧Top 10
Tomcat配置技巧Top 10
2004-01-09 17:19:25

作者:Jason Brittain & Ian F. Darwin
出处:http://www.orielly.com
译者:陈光
2003-12-31

编者按:现在开发Java Web应用,建立和部署Web内容是一件很简单的工作。使用Jakarta Tomcat作为Servlet和JSP容器的人已经遍及全世界。Tomcat具有免费、跨平台等诸多特性,并且更新得很快,现在非常的流行。

你所需要做的就是:按照你的需求配置Tomcat,只要你正确配置,Tomcat一般都能适合你的要求。下面是一系列关于Tomcat的配置技巧,这些技巧源自于我的书:《Tomcat权威指南》,希望对你有所帮助。—— Jason Brittain

1. 配置系统管理(Admin Web Application)
大多数商业化的J2EE服务器都提供一个功能强大的管理界面,且大都采用易于理解的Web应用界面。Tomcat按照自己的方式,同样提供一个成熟的管理工具,并且丝毫不逊于那些商业化的竞争对手。Tomcat的Admin Web Application最初在4.1版本时出现,当时的功能包括管理context、data source、user和group等。当然也可以管理像初始化参数,user、group、role的多种数据库管理等。在后续的版本中,这些功能将得到很大的扩展,但现有的功能已经非常实用了。

Admin Web Application被定义在自动部署文件:CATALINA_BASE/webapps/admin.xml 。
(译者注:CATALINA_BASE即tomcat安装目录下的server目录)

你必须编辑这个文件,以确定Context中的docBase参数是绝对路径。也就是说,CATALINA_BASE/webapps/admin.xml 的路径是绝对路径。作为另外一种选择,你也可以删除这个自动部署文件,而在server.xml文件中建立一个Admin Web Application的context,效果是一样的。你不能管理Admin Web Application这个应用,换而言之,除了删除CATALINA_BASE/webapps/admin.xml ,你可能什么都做不了。

如果你使用UserDatabaseRealm(默认),你将需要添加一个user以及一个role到CATALINA_BASE/conf/tomcat-users.xml 文件中。你编辑这个文件,添加一个名叫“admin”的role 到该文件中,如下:



你同样需要有一个用户,并且这个用户的角色是“admin”。象存在的用户那样,添加一个用户(改变密码使其更加安全):



当你完成这些步骤后,请重新启动Tomcat,访问http://localhost:8080/admin,你将看到一个登录界面。Admin Web Application采用基于容器管理的安全机制,并采用了Jakarta Struts框架。一旦你作为“admin”角色的用户登录管理界面,你将能够使用这个管理界面配置Tomcat。

2.配置应用管理(Manager Web Application)
Manager Web Application让你通过一个比Admin Web Application更为简单的用户界面,执行一些简单的Web应用任务。

Manager Web Application被被定义在一个自动部署文件中:

CATALINA_BASE/webapps/manager.xml 。

你必须编辑这个文件,以确保context的docBase参数是绝对路径,也就是说CATALINA_HOME/server/webapps/manager的绝对路径。
(译者注:CATALINA_HOME即tomcat安装目录)

如果你使用的是UserDatabaseRealm,那么你需要添加一个角色和一个用户到CATALINA_BASE/conf/tomcat-users.xml文件中。接下来,编辑这个文件,添加一个名为“manager”的角色到该文件中:



你同样需要有一个角色为“manager”的用户。像已经存在的用户那样,添加一个新用户(改变密码使其更加安全):



然后重新启动Tomcat,访问http://localhost/manager/list,将看到一个很朴素的文本型管理界面,或者访问http://localhost/manager/html/list,将看到一个HMTL的管理界面。不管是哪种方式都说明你的Manager Web Application现在已经启动了。

Manager application让你可以在没有系统管理特权的基础上,安装新的Web应用,以用于测试。如果我们有一个新的web应用位于/home/user/hello下在,并且想把它安装到 /hello下,为了测试这个应用,我们可以这么做,在第一个文件框中输入“/hello”(作为访问时的path),在第二个文本框中输入“file:/home/user/hello”(作为Config URL)。

Manager application还允许你停止、重新启动、移除以及重新部署一个web应用。停止一个应用使其无法被访问,当有用户尝试访问这个被停止的应用时,将看到一个503的错误——“503 - This application is not currently available”。

移除一个web应用,只是指从Tomcat的运行拷贝中删除了该应用,如果你重新启动Tomcat,被删除的应用将再次出现(也就是说,移除并不是指从硬盘上删除)。

3.部署一个web应用
有两个办法可以在系统中部署web服务。
1> 拷贝你的WAR文件或者你的web应用文件夹(包括该web的所有内容)到$CATALINA_BASE/webapps目录下。
2> 为你的web服务建立一个只包括context内容的XML片断文件,并把该文件放到$CATALINA_BASE/webapps目录下。这个web应用本身可以存储在硬盘上的任何地方。

如果你有一个WAR文件,你若想部署它,则只需要把该文件简单的拷贝到CATALINA_BASE/webapps目录下即可,文件必须以“.war”作为扩展名。一旦Tomcat监听到这个文件,它将(缺省的)解开该文件包作为一个子目录,并以WAR文件的文件名作为子目录的名字。接下来,Tomcat将在内存中建立一个context,就好象你在server.xml文件里建立一样。当然,其他必需的内容,将从server.xml中的DefaultContext获得。

部署web应用的另一种方式是写一个Context XML片断文件,然后把该文件拷贝到CATALINA_BASE/webapps目录下。一个Context片断并非一个完整的XML文件,而只是一个context元素,以及对该应用的相应描述。这种片断文件就像是从server.xml中切取出来的context元素一样,所以这种片断被命名为“context片断”。

举个例子,如果我们想部署一个名叫MyWebApp.war的应用,该应用使用realm作为访问控制方式,我们可以使用下面这个片断:


        debug="0" privileged="true">
         resourceName="UserDatabase"/> 


把该片断命名为“MyWebApp.xml”,然后拷贝到CATALINA_BASE/webapps目录下。

这种context片断提供了一种便利的方法来部署web应用,你不需要编辑server.xml,除非你想改变缺省的部署特性,安装一个新的web应用时不需要重启动Tomcat。

4.配置虚拟主机(Virtual Hosts)
关于server.xml中“Host”这个元素,只有在你设置虚拟主机的才需要修改。虚拟主机是一种在一个web服务器上服务多个域名的机制,对每个域名而言,都好象独享了整个主机。实际上,大多数的小型商务网站都是采用虚拟主机实现的,这主要是因为虚拟主机能直接连接到Internet并提供相应的带宽,以保障合理的访问响应速度,另外虚拟主机还能提供一个稳定的固定IP。

基于名字的虚拟主机可以被建立在任何web服务器上,建立的方法就是通过在域名服务器(DNS)上建立IP地址的别名,并且告诉web服务器把去往不同域名的请求分发到相应的网页目录。因为这篇文章主要是讲Tomcat,我们不准备介绍在各种操作系统上设置DNS的方法,如果你在这方面需要帮助,请参考《DNS and Bind》一书,作者是Paul Albitz and Cricket Liu (O'Reilly)。为了示范方便,我将使用一个静态的主机文件,因为这是测试别名最简单的方法。
在Tomcat中使用虚拟主机,你需要设置DNS或主机数据。为了测试,为本地IP设置一个IP别名就足够了,接下来,你需要在server.xml中添加几行内容,如下:


 
   port="8080" minProcessors="5" maxProcessors="75"
enableLookups="true" redirectPort="8443"/>
   port="8443" minProcessors="5" maxProcessors="75"
acceptCount="10" debug="0" scheme="https" secure="true"/>
     clientAuth="false" protocol="TLS" />
   
   
     
          unpackWARs="true" autoDeploy="true">
       
                             reloadable="true" crossContext="true">
       
     

     
     
       
     

   
 

Tomcat的server.xml文件,在初始状态下,只包括一个虚拟主机,但是它容易被扩充到支持多个虚拟主机。在前面的例子中展示的是一个简单的server.xml版本,其中粗体部分就是用于添加一个虚拟主机。每一个Host元素必须包括一个或多个context元素,所包含的context元素中必须有一个是默认的context,这个默认的context的显示路径应该为空(例如,path=””)。

5.配置基础验证(Basic Authentication)
容器管理验证方法控制着当用户访问受保护的web应用资源时,如何进行用户的身份鉴别。当一个web应用使用了Basic Authentication(BASIC参数在web.xml文件中auto-method元素中设置),而有用户访问受保护的web应用时,Tomcat将通过HTTP Basic Authentication方式,弹出一个对话框,要求用户输入用户名和密码。在这种验证方法中,所有密码将被以64位的编码方式在网络上传输。

注意:使用Basic Authentication通过被认为是不安全的,因为它没有强健的加密方法,除非在客户端和服务器端都使用HTTPS或者其他密码加密码方式(比如,在一个虚拟私人网络中)。若没有额外的加密方法,网络管理员将能够截获(或滥用)用户的密码。但是,如果你是刚开始使用Tomcat,或者你想在你的web应用中测试一下基于容器的安全管理,Basic Authentication还是非常易于设置和使用的。只需要添加两个元素到你的web应用的web.xml文件中,并且在CATALINA_BASE/conf/tomcat-users.xml 文件中添加适当的即可,然后重新启动Tomcat。

下面例子中的web.xml摘自一个俱乐部会员网站系统,该系统中只有member目录被保护起来,并使用Basic Authentication进行身份验证。请注意,这种方式将有效的代替Apache web服务器中的.htaccess文件。



 
   
     Entire Application
   

   /members/*
 

 
     member
 




 BASIC
 My Club Members-only Area


6.配置单点登录(Single Sign-On)
一旦你设置了realm和验证的方法,你就需要进行实际的用户登录处理。一般说来,对用户而言登录系统是一件很麻烦的事情,你必须尽量减少用户登录验证的次数。作为缺省的情况,当用户第一次请求受保护的资源时,每一个web应用都会要求用户登录。如果你运行了多个web应用,并且每个应用都需要进行单独的用户验证,那这看起来就有点像你在与你的用户搏斗。用户们不知道怎样才能把多个分离的应用整合成一个单独的系统,所有他们也就不知道他们需要访问多少个不同的应用,只是很迷惑,为什么总要不停的登录。

Tomcat 4的“single sign-on”特性允许用户在访问同一虚拟主机下所有web应用时,只需登录一次。为了使用这个功能,你只需要在Host上添加一个SingleSignOn Valve元素即可,如下所示:

      debug="0"/>

在Tomcat初始安装后,server.xml的注释里面包括SingleSignOn Valve配置的例子,你只需要去掉注释,即可使用。那么,任何用户只要登录过一个应用,则对于同一虚拟主机下的所有应用同样有效。

使用single sign-on valve有一些重要的限制:
1> value必须被配置和嵌套在相同的Host元素里,并且所有需要进行单点验证的web应用(必须通过context元素定义)都位于该Host下。
2> 包括共享用户信息的realm必须被设置在同一级Host中或者嵌套之外。
3> 不能被context中的realm覆盖。
4> 使用单点登录的web应用最好使用一个Tomcat的内置的验证方式(被定义在web.xml中的中),这比自定义的验证方式强,Tomcat内置的的验证方式包括basic、digest、form和client-cert。
5> 如果你使用单点登录,还希望集成一个第三方的web应用到你的网站中来,并且这个新的web应用使用它自己的验证方式,而不使用容器管理安全,那你基本上就没招了。你的用户每次登录原来所有应用时需要登录一次,并且在请求新的第三方应用时还得再登录一次。当然,如果你拥有这个第三方web应用的源码,而你又是一个程序员,你可以修改它,但那恐怕也不容易做。
6> 单点登录需要使用cookies。

7.配置用户定制目录(Customized User Directores)
一些站点允许个别用户在服务器上发布网页。例如,一所大学的学院可能想给每一位学生一个公共区域,或者是一个ISP希望给一些web空间给他的客户,但这又不是虚拟主机。在这种情况下,一个典型的方法就是在用户名前面加一个特殊字符(~),作为每位用户的网站,比如:

http://www.cs.myuniversity.edu/~username
http://members.mybigisp.com/~username

Tomcat提供两种方法在主机上映射这些个人网站,主要使用一对特殊的Listener元素。Listener的className属性应该是org.apache.catalina.startup.UserConfig,userClass属性应该是几个映射类之一。如果你的系统是Unix,它将有一个标准的/etc/passwd文件,该文件中的帐号能够被运行中的Tomcat很容易的读取,该文件指定了用户的主目录,使用PasswdUserDatabase 映射类。

directoryName="public_html" 
userClass="org.apache.catalina.startup.PasswdUserDatabase"/>

web文件需要放置在像/home/users/ian/public_html 或者 /users/jbrittain/public_html一样的目录下面。当然你也可以改变public_html 到其他任何子目录下。

实际上,这个用户目录根本不一定需要位于用户主目录下里面。如果你没有一个密码文件,但你又想把一个用户名映射到公共的像/home一样目录的子目录里面,则可以使用HomesUserDatabase类。

directoryName="public_html" homeBase="/home" 
userClass="org.apache.catalina.startup.HomesUserDatabase"/>

这样一来,web文件就可以位于像/home/ian/public_html 或者 /home/jasonb/public_html一样的目录下。这种形式对Windows而言更加有利,你可以使用一个像c:\home这样的目录。

这些Listener元素,如果出现,则必须在Host元素里面,而不能在context元素里面,因为它们都用应用于Host本身。

8.在Tomcat中使用CGI脚本
Tomcat主要是作为Servlet/JSP容器,但它也有许多传统web服务器的性能。支持通用网关接口(Common Gateway Interface,即CGI)就是其中之一,CGI提供一组方法在响应浏览器请求时运行一些扩展程序。CGI之所以被称为通用,是因为它能在大多数程序或脚本中被调用,包括:Perl,Python,awk,Unix shell scripting等,甚至包括Java。当然,你大概不会把一个Java应用程序当作CGI来运行,毕竟这样太过原始。一般而言,开发Servlet总要比CGI具有更好的效率,因为当用户点击一个链接或一个按钮时,你不需要从操作系统层开始进行处理。

Tomcat包括一个可选的CGI Servlet,允许你运行遗留下来的CGI脚本。

为了使Tomcat能够运行CGI,你必须做如下几件事:
1. 把servlets-cgi.renametojar (在CATALINA_HOME/server/lib/目录下)改名为servlets-cgi.jar。处理CGI的servlet应该位于Tomcat的CLASSPATH下。
2. 在Tomcat的CATALINA_BASE/conf/web.xml 文件中,把关于 CGI的那段的注释去掉(默认情况下,该段位于第241行)。
3. 同样,在Tomcat的CATALINA_BASE/conf/web.xml文件中,把关于对CGI进行映射的那段的注释去掉(默认情况下,该段位于第299行)。注意,这段内容指定了HTML链接到CGI脚本的访问方式。
4. 你可以把CGI脚本放置在WEB-INF/cgi 目录下(注意,WEB-INF是一个安全的地方,你可以把一些不想被用户看见或基于安全考虑不想暴露的文件放在此处),或者你也可以把CGI脚本放置在context下的其他目录下,并为CGI Servlet调整cgiPathPrefix初始化参数。这就指定的CGI Servlet的实际位置,且不能与上一步指定的URL重名。
5. 重新启动Tomcat,你的CGI就可以运行了。

在Tomcat中,CGI程序缺省放置在WEB-INF/cgi目录下,正如前面所提示的那样,WEB-INF目录受保护的,通过客户端的浏览器无法窥探到其中内容,所以对于放置含有密码或其他敏感信息的CGI脚本而言,这是一个非常好的地方。为了兼容其他服务器,尽管你也可以把CGI脚本保存在传统的/cgi-bin目录,但要知道,在这些目录中的文件有可能被网上好奇的冲浪者看到。另外,在Unix中,请确定运行Tomcat的用户有执行CGI脚本的权限。

9.改变Tomcat中的JSP编译器(JSP Compiler)
在Tomcat 4.1(或更高版本,大概),JSP的编译由包含在Tomcat里面的Ant程序控制器直接执行。这听起来有一点点奇怪,但这正是Ant有意为之的一部分,有一个API文档指导开发者在没有启动一个新的JVM的情况下,使用Ant。这是使用Ant进行Java开发的一大优势。另外,这也意味着你现在能够在Ant中使用任何javac支持的编译方式,这里有一个关于Apache Ant使用手册的javac page列表。使用起来是容易的,因为你只需要在 元素中定义一个名字叫“compiler”,并且在value中有一个支持编译的编译器名字,示例如下:


   jsp
   
     org.apache.jasper.servlet.JspServlet
   

   
     logVerbosityLevel
     WARNING
   

   
     compiler
     jikes
   

   3


当然,给出的编译器必须已经安装在你的系统中,并且CLASSPATH可能需要设置,那处决于你选择的是何种编译器。

10.限制特定主机访问(Restricting Access to Specific Hosts)
有时,你可能想限制对Tomcat web应用的访问,比如,你希望只有你指定的主机或IP地址可以访问你的应用。这样一来,就只有那些指定的的客户端可以访问服务的内容了。为了实现这种效果,Tomcat提供了两个参数供你配置:RemoteHostValve 和RemoteAddrValve。

通过配置这两个参数,可以让你过滤来自请求的主机或IP地址,并允许或拒绝哪些主机/IP。与之类似的,在Apache的httpd文件里有对每个目录的允许/拒绝指定。
例如你可以把Admin Web application设置成只允许本地访问,设置如下:


         allow="127.0.0.1" deny=""/>


如果没有给出允许主机的指定,那么与拒绝主机匹配的主机就会被拒绝,除此之外的都是允许的。与之类似,如果没有给出拒绝主机的指定,那么与允许主机匹配的主机就会被允许,除此之外的都是拒绝的。

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

作者简介:
Jason Brittain是CollabNet公司的一名资深软件工程师,主要负责软件底层架构的开发。他已经为Apache Jakarta项目做了很多贡献,多年以来,他一直是一名积极的开源软件开发者。

Ian F. Darwin已经在计算机行业工作了30年:从1980年开始使用Unix,从1995年开始使用Java,从1998年开始使用OpenBSD。他是两本Oreilly图书的作者:Checking C Programs with lint 和 Java Cookbook,还与Jason Brittain合著了Tomcat: The Definitive Guide。

译者简介:
陈光(Holen Chen),J2EE项目经理,熟悉知识管理及电子政务,致力于Apache Jakarta项目在国广的推广及深层次应用,可通过 holen@263.net与作者联系。
2009-4-2 17:36:27
Virtual Hosting with Tomcat
Virtual Hosting with Tomcat
This is a guide on setting up Tomcat to do virtual hosting and make it behave like a simple webserver with jsp and servlet support, for many different sites all hosted on the same IP address. The aim is to have a single directory for each virtual host, which can be manipulated individually without hassles from managing multiple .war files and other configuration difficulties. 

To configure Tomcat for a virtual host, you need a  directive in the server.xml file, and a ROOT.xml file in the conf/Catalina/$host directory. Here's the minimal setup required for a copy of Tomcat serving directly on Port 80, using no connectors or other configuration difficulties. 

This was written for Tomcat 5 on linux, with Tomcat installed in /usr/local/tomcat 

We start with the simplest configuration, of one website, called 'localhost' which keeps it's files in /usr/local/tomcat/webapps/localhost . We're not using any .war files here - all the files are placed straight into the directory. 

conf/server.xml


  
  
    
        
                   maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
               enableLookups="false" redirectPort="8443" acceptCount="100"
               debug="0" connectionTimeout="20000" 
               disableUploadTimeout="true" />

                

   
      
             unpackWARs="true" autoDeploy="true"
       xmlValidation="false" xmlNamespaceAware="false">
                         directory="logs"  prefix="localhost_log." suffix=".txt"
            timestamp="true"/>
      

         
          
    

  




conf/Catalina/localhost/ROOT.xml
`$tomcatdir/bin/startup.sh`;
2009-4-2 17:33:33
Linux服务大全
Linux服务大全 

一、各项服务的功能介绍 

amd 运行automount精灵程序,该精灵在必要时自动安装一些本地设备和NFS文件系统。 
apmd apmd用来监视系统用电状态,并将相关信息通过syslogd 写入日志。 也可以用来在电源不足时关机。 
arpwatch 该程序主要用来维护以太网物理地址和IP地址的对应关系。 
atd 运行用户用At命令调度的任务。也在系统负荷比较低时 运行批处理任务。 
autofs 当您需要时自动转载文件系统,而当您不需要时自动卸载。
bootparamd 该服务允许老的Sun工作站从Linux网络启动,它和rarp 现在很少使用,基本上被bootp和dhcp取代了。 
crond cron是Unix下的一个传统程序,该程序周期地运行用户 调度的任务。比起传统的Unix版本,Vixie版本添加了不少属性,而且更安全,配置更简单。 
dhcpd 该精灵提供了对动态主机控制协议(Dynamic Host Control Protocol)的访问支持。
ftpd FTP是文件传输协议的简称,它定义了在网络上从一台计算机向另一台计算机进行文件传输的方式,几乎所有的常用系统平台都提供FTP的服务程序和客户程序
gated gated通过一个数据库提供了网络路由功能支持。它支持 各种路由协议,包括RIP版本1和2、DCN HELLO协议、OSPF版本2以及EGP版本2到4。 
gpm gpm为文本模式下的Linux程序如mc(Midnight Commander)提供了鼠标的支持。它也支持控制台鼠标的拷贝,粘贴操作以及弹出式菜单。 
httpd http是著名的www服务器,可用来提供HTML文件以 及CGI动态内容服务。
Inet 因特网操作服务程序。监控网络对各种它管理的服务的需求,并在要的时候启动相应的服务程序。通常,inet管理的程序有telnet、ftp、rsh和rlogin。关闭inet也就 关闭了这些由它管理的服务。 
innd inn是最流行的用户组新闻服务器。它允许您建立起本地 新闻服务器。配置有一定的难度,可以先阅读/usr/doc/ inn*文档获得帮助。
keytable 该程序的功能是转载您在/etc/sysconfig/keyboards里说明的键盘映射表,该表可以通过kbdconfig工具进行选 择。您应该使该程序处于激活状态。 
ldap LDAP代表Lightweight Directory Access Protocol, 实现了目录访问协议的行业标准。
lpd lpd是系统打印守护程序,负责将lpr等程序提交给打印作业。
mcserv Midnight Commander服务进程允许远程机器上的用户通过Midnight Commander文件管理器操作本机文件。服务进程用PAM来验证用户,需要给出“用户名/口令”以通过验证。
mysql 一个快速高效可靠的轻型SQL数据库引擎。
named 域名服务器,将Internet主机名解析为点分的IP地址。
netfs 负责装载/卸载NFS、Samba、NCP(Netware)文件系统。 
network 激活/关闭启动时的各个网络接口。 
nfs NFS是一个流行的基于TCP/IP网络的文件共享协议。该服务提供了NFS文件共享服务,具体的配置在/etc/ exports文件里。 
nscd 该服务负责密码和组的查询,并且缓冲查询结果。如果您的系统有比较慢的服务(如NIS和NIS+),则应该启动该服务。 
Pcmcia pcmcia主要用于支持笔记本电脑。 
Portmap portmap 用来支持RPC连接,RPC被用于NFS以及NIS 等服务。 
postgresql PostgreSQL关系数据库引擎。 
qmail 它也是一个基于UNIX操作系统的Internet邮件传输机构( Internet Mail Transfer Agent 简称MTA)。它采用标准的简单邮件传输协议(Simple Mail Transfer Protocol 简称SMTP)与Internet上其他
MTA交换信息,具有安全、可靠、高效、简单的特点。 
random 保存和恢复系统的高质量随机数生成器,这些随机数是系统一些随机行为提供的。
routed 该守护程序支持RIP协议的自动IP路由表维护。RIP主要使用在小型网络上,大一点的网络就需要复杂一点的协议。
rstatd Rstat 协议允许网络上的用户获得同一网络上各机器的性能参数。 
rusersd 该服务使网络用户可以定位同一网络上的其他用户。 
rwalld Rwall协议允许远程用户向在同一系统中活跃着的终端发送消息,类似wall的本地行为。 
rwhod 允许远程用户获得运行rwho精灵的机器上所有已登录用户的列表, 与finger类似。 
sendmail 大名鼎鼎的邮件服务器。 
smb 启动和关闭smbd和nmbd精灵程序以提供SMB网络服务。 
snmpd 简单网络管理协议(SNMP)的守护精灵。 
syslog syslog是操作系统提供的一种机制,守护程序通常使用这种机制将各种信息写到各个系统日志文件。通常应该启动该服务。 
Webmin webmin是基于web的集系统管理与网络管理于一身的强大管理工具。 利用webmin的强大功能,用户可以通过web浏览器来方便地设置自己的服务器、dns、samba、nfs、本地/远程文件系统以及许多其他的系统配置。 
  
二、服务的启动和停止 

init是启动时运行内核的程序. 它负责启动所有在启动时需要运行的进程, 包括允许您登录的gettys, NFS管理器, FTP管理器,以及您想在机器启动时运行的任何事. 

SysV init的配置文件存放在/etc的一个子目录. 这个目录叫rc.d. 在那里您将发现 rc.sysinit 和以下目录: 
init.d 
rc0.d 
rc1.d 
rc2.d 
rc3.d 
rc4.d 
rc5.d 
rc6.d 
init.d包含一组script. 基本上, 您在启动时或进入另一个运行级别时, 每个service需要一个script. Services包括网络, NFS, 发送邮件, HTTPD等等. 

默认的运行级别在/etc/inittab中定义.在前面有一行类似: 
id:3:initdefault: 
在这里, 您看到第二栏, 默认运行水平是3, 大多数系统都是这样. 如果想修改它,可以手工编辑/etc/inittab改掉3. 如果在rc3.d输入ls -l :
; ../init.d/network 
lrwxrwxrwx 1 root root 16 3:11 S30syslog ->; ../init.d/syslog 
lrwxrwxrwx 1 root root 14 3:32 S40cron ->; ../init.d/cron 
lrwxrwxrwx 1 root root 14 3:11 S50inet ->; ../init.d/inet 
lrwxrwxrwx 1 root root 13 3:11 S60nfs ->; ../init.d/nfs 
lrwxrwxrwx 1 root root 15 3:11 S70nfsfs ->; ../init.d/nfsfs 
lrwxrwxrwx 1 root root 18 3:11 S90lpd ->; ../init.d/lpd.init 
lrwxrwxrwx 1 root root 11 3:11 S99local ->; ../rc.local 

我们可以看到这个目录中没有真的'文件', 只有对init.d目录中的script的连接. 大多数的Linux发行版本中,启动脚本位于/etc/rc.d/init.d。这些脚本被ln命令来连接到 /etc/rc.d/rcn.d目录。(这里的n 就是运行级0-6) 例如/etc/rc.d/rc3.d下面的S10network就是连接/etc/rc.d/init.d下的network脚本的。 
这个连接在前面还有一个'S'和一个数字。'S'是指启动这个特定的script, 'K'是指结束它,即kill。 数字是顺序, Init将根据顺序启动所有的services. 例如,在同一个目录下,你还可以看到S35dhcpd这个文件,dhcpd服务就是在network服务之后启动。因此我们可以用一个两位数字和一个大写的'S'或'K'来启动或结束所需要的 service.。 

Init如何启动和结束service? 很简单. 每个script都写了一个接收参数用来'启动' 和'结束'. 我们可以用命令行来执行这些script, 如: 
/etc/rc.d/init.d/httpd stop来结束httpd服务器. Init只需读文件名, 如果有'K', 它就用'stop'参数调用script. 如果有'S',则用'start'参数. 

另外:在启动时或者修改运行级别时, 当所有的其他初始化完成后, 将执行文件/etc/rc.d/rc.local. 可以在这增加新的初始程序,我所编写的程序就加在该文件中。在LINUX系统启动部分将详细介绍。 

三、linux运行级别详解 

简单的说,运行级就是操作系统当前正在运行的功能级别。这个级别从1到6 ,具有不同的功能。这些级别在/etc/inittab文件里指定。这个文件是init程序寻找的主要文件,最先运行的服务是那些放在/etc/rc.d 目录下的文件。 

不同的运行级定义如下:(可以参考Linux里面的/etc/inittab) 
  # 缺省的运行级,RHS用到的级别如下: 
  # 0 - 停机 
  # 1 - 单用户模式 
  # 2 - 多用户,但是没有NFS  
  # 3 - 完全多用户模式 
  # 4 - 没有用到 
  # 5 - X11  
  # 6 - 重新启动 

  对各个运行级的详细解释: 

0 为停机,机器关闭。 
1 为单用户模式,就像Win9x下的安全模式类似。 
2  为多用户模式,但是没有NFS支持。  
3  为完整的多用户模式,是标准的运行级。 
4 一般不用,在一些特殊情况下可以用它来做一些事情。例如在笔记本 电脑的电池用尽时,可以切换到这个模式来做一些设置。 
5  就是X11,进到X Window系统了。  
6  为重启,运行init 6机器就会重启。

LINUX守护进程介绍
amd:自动安装NFS(网络文件系统)守侯进程 
apmd:高级电源管理 
Arpwatch:记录日志并构建一个在LAN接口上看到的以太网地址和IP地址对数据库 
Autofs:自动安装管理进程automount,与NFS相关,依赖于NIS 
Bootparamd:引导参数服务器,为LAN上的无盘工作站提供引导所需的相关信息 
crond:Linux下的计划任务 
Dhcpd:启动一个DHCP(动态IP地址分配)服务器 
Gated:网关路由守候进程,使用动态的OSPF路由选择协议 
Httpd:WEB服务器 
Inetd:支持多种网络服务的核心守候程序 
Innd:Usenet新闻服务器 
Linuxconf:允许使用本地WEB服务器作为用户接口来配置机器 
Lpd:打印服务器 
Mars-nwe:mars-nwe文件和用于Novell的打印服务器 
Mcserv:Midnight命令文件服务器 
named:DNS服务器 
netfs:安装NFS、Samba和NetWare网络文件系统 
network:激活已配置网络接口的脚本程序 
nfs:打开NFS服务 
nscd:nscd(Name Switch Cache daemon)服务器,用于NIS的一个支持服务,它高速缓存用户口令和组成成员关系 
portmap:RPC portmap管理器,与inetd类似,它管理基于RPC服务的连接 
postgresql:一种SQL数据库服务器 
routed:路由守候进程,使用动态RIP路由选择协议 
rstatd:一个为LAN上的其它机器收集和提供系统信息的守候程序 
ruserd:远程用户定位服务,这是一个基于RPC的服务,它提供关于当前记录到LAN上一个机器日志中的用户信息 
rwalld:激活rpc.rwall服务进程,这是一项基于RPC的服务,允许用户给每个注册到LAN机器上的其他终端写消息 
rwhod:激活rwhod服务进程,它支持LAN的rwho和ruptime服务 
sendmail:邮件服务器sendmail 
smb:Samba文件共享/打印服务 
snmpd:本地简单网络管理候进程 
squid:激活代理服务器squid 
syslog:一个让系统引导时起动syslog和klogd系统日志守候进程的脚本 
xfs:X Window字型服务器,为本地和远程X服务器提供字型集 
xntpd:网络时间服务器 
ypbind:为NIS(网络信息系统)客户机激活ypbind服务进程 
yppasswdd:NIS口令服务器 
ypserv:NIS主服务器 
gpm:管鼠标的 
identd:AUTH服务,在提供用户信息方面与finger类似 

Linux各项系统开机服务的功能是什么?有哪些可以关掉? 
Linux在启动时要启动很多系统服务,它们向本地和网络用户提供了Linux的系统功能接口,直接面向应用程序和用户。但是,开启不必要或有漏洞的服务则会 给操作系统带来安全和性能上的影响。下面我们以BluePoint Linux 2.0的开机服务为例,列表说明各项服务的功能。 

alsasound 
Alsa声卡驱动程序支持。Alsa声卡驱动程序本来是为了 一种声卡Gravis UltraSound(GUS)而写的,该程序被证 明很优秀,于是作者就开始为一般的声卡写 驱动程序。 Alsa和OSS/Free 及OSS/Linux兼容,但是有自己的接 口,甚至比OSS优秀。 

amd 
运行automount精灵程序,该精灵在必要时自动安装一些 本地设备和NFS文件系统。 

apmd 
apmd用来监视系统用电状态,并将相关信息通过syslogd 写入日志。也可以用来在电源不足时关机。 

arpwatch 
该程序主要用来维护以太网物理地址和IP地址的对应关系。 

atalk 
AppleTalk精灵程序。注意不要在后台运行该程序,该程 序的数据结构必须在运行其他进程前先花一定时间初始化。 

atd 
运行用户用At命令调度的任务。也在系统负荷比较低时 运行批处理任务。 

autofs 
当您需要时自动转载文件系统,而当您不需要时自动卸载。 

bootparamd 
该服务允许老的Sun工作站从Linux网络启动,它和rarp 现在很少使用,基本上被bootp和dhcp取代了。 

crond 
cron是Unix下的一个传统程序,该程序周期地运行用户 调度的任务。比起传统的Unix版本,Vixie版本添加了不 少属性,而且更安全,配置更简单。 
dhcpd 该精灵提供了对动态主机控制协议(Dynamic Host Control Protocol)的访问支持。 

gated 
gated通过一个数据库提供了网络路由功能支持。它支持 各种路由协议,包括RIP版本1和2、DCN HELLO协议、 OSPF版本2以及EGP版本2到4。 

gpm 
gpm为文本模式下的Linux程序如mc(Midnight Commander)提供了鼠标的支持。它也支持控制台下鼠标 的拷贝,粘贴操作以及弹出式菜单。 

httpd 
http是著名的www服务器,可用来提供HTML文件以 及CGI动态内容服务。 

inetd 
因特网操作服务程序。监控网络对各种它管理的服务的需 求,并在必要的时候启动相应的服务程序。通常,inetd 管理的程序有telnet、ftp、rsh和rlogin。 关闭inetd也就 关闭了这些由它管理的服务。 

innd 
inn是最流行的用户组新闻服务器。它允许您建立起本地 新闻服务器。配置有一定的难度,可以先阅读/usr/doc/ inn*文档获得帮助。 


keytable 该程序的功能是转载您在/etc/sysconfig/keyboards里说 明的键盘映射表,该表可以通过kbdconfig工具进行选 择。您应该使该程序处于激活状 态。 

ldap 
LDAP代表Lightweight Directory Access Protocol, 实现了目录访问协议的行业标准。 

linuxconf 
linuxconf是Linux下的一个有效的系统配置工具,该服 务允许远程运行。 

lpd 
lpd是系统打印守护程序,负责将lpr等程序提交给打印 作业。 

mcserv 
Midnight Commander服务进程允许远程机器上的用户 通过Midnight Commander文件管理器操作本机文件。服 务进程用PAM来验证用户,需要给出“用 户名/口令” 以通过验证。 

mysql 一个快速高效可靠的轻型SQL数据库引擎。 

named 域名服务器,将Internet主机名解析为点分的IP地址。 

netfs 负责装载/卸载NFS、Samba、NCP(Netware)文件系统。 

network 激活/关闭启动时的各个网络接口。 

nfs 
NFS是一个流行的基于TCP/IP网络的文件共享协议。该 服务提供了NFS文件共享服务,具体的配置在/etc/ exports文件里。 

nscd 
该服务负责密码和组的查询,并且缓冲查询结果。如果您 的系统有比较慢的服务(如NIS和NIS+),则应该启动该 服务。 

pcmcia pcmcia 主要用于支持笔记本电脑。 

portmap portmap 用来支持RPC连接,RPC被用于NFS以及NIS 等服务。 

postgresql PostgreSQL 关系数据库引擎。 

proftpd proftpd 是Unix下的一个配置灵活的ftp守护程序。 

radvd 路由广播程序。 

random 
保存和恢复系统的高质量随机数生成器,这些随机数是系 统一些随机行为提供的。 

routed 
该守护程序支持RIP协议的自动IP路由表维护。RIP主要 使用在小型网络上,大一点的网络就需要复杂一点的协议。 

rstatd Rstat协议允许网络上的用户获得同一网络上各机器的性能 参数。 

rusersd 该服务使网络用户可以定位同一网络上的其他用户。 

rwalld 
Rwall协议允许远程用户向在同一系统中活跃着的终端发送 消息,类似wall的本地行为。 

rwhod 
允许远程用户获得运行rwho精灵的机器上所有已登录用户 的列表,与finger类似。 

sendmail 大名鼎鼎的邮件服务器。 

smb 启动和关闭smbd和nmbd精灵程序以提供SMB网络服务。 

snmpd 简单网络管理协议(SNMP)的守护精灵。 

syslog 
syslog是操作系统提供的一种机制,守护程序通常使用这 种机制将各种信息写到各个系统日志文件。通常应该启动 该服务。 

xfs X的字体服务器。 
ypbind NIS/YP的客户端守护程序。如果您需要使用NIS/YP机 器,请启动这项服务,否则,关闭这项服务。 

yppasswd 
让NIS用户能够修改密码。运行在NIS域的服务器上。客 户端程序同样也叫yppasswd。 

ypserv 
标准NIS/YP网络协议的一个实现。允许主机名,用户名 和其他信息分布于网络各端。运行在NIS服务器上,客户 端不需要。
2009-4-2 11:09:10
入侵监测系统的构建(chkrootkit)
入侵监测系统的构建( chkrootkit )

前  言 

  所谓 rootkit ,是一类入侵者经常使用的工具。这类工具通常非常的隐秘、令用户不易察觉,通过这类工具,入侵者建立了一条能够常时入侵系统,或者说对系统进行实时控制的途径。所以,我们用自由软件 chkrootkit 来建立入侵监测系统,来保证对系统是否被安装了 rootkit 进行监测。

  chkrootkit 在监测 rootkit 是否被安装的过程中,需要使用到一些操作系统本身的命令。但不排除一种情况,那就是入侵者有针对性的已经将 chkrootkit 使用的系统命令也做修改,使得 chkrootkit 无法监测 rootkit ,从而达到即使系统安装了 chkrootkit 也无法检测出 rootkit 的存在,从而依然对系统有着控制的途径,而达到入侵的目的。那样的话,用 chkrootkit 构建入侵监测系统将失去任何意义。对此,我 们在操作系统刚被安装之后,或者说服务器开放之前,让 chkrootkit 就开始工作。而且,在服务器开放之前,备份 chkrootkit 使用的系统命 令,在一些必要的时候(怀疑系统命令已被修改的情况等等),让 chkrootkit 使用初始备份的系统命令进行工作。

安装 chkrootkit  

  首先来下载和安装 chkrootkit (http://www.chkrootkit.org/)工具。
[root@sample ~]# wget ftp://ftp.pangeia.com.br/pub/seg/pac/chkrootkit.tar.gz ← 下载chkrootkit

--03:05:31-- ftp://ftp.pangeia.com.br/pub/seg/pac/chkrootkit.tar.gz
=> `chkrootkit.tar.gz'
Resolving ftp.pangeia.com.br... 200.239.53.35
Connecting to ftp.pangeia.com.br|200.239.53.35|:21... connected.
Logging in as anonymous ... Logged in!
==> SYST ... done. ==> PWD ... done.
==> TYPE I ... done. ==> CWD /pub/seg/pac ... done.
==> PASV ... done. ==> RETR chkrootkit.tar.gz ... done.
Length: 37,140 (36K) (unauthoritative) 
100%[====================================>] 37,140 5.67K/s ETA 00:00

03:05:46 (5.30 KB/s) - `chkrootkit.tar.gz' saved [37140]
[root@sample ~]# tar zxvf chkrootkit.tar.gz  ← 展开被压缩的源代码
[root@sample ~]# cd chkrootkit*  ← 进入chkrootkit源代码的目录
[root@sample chkrootkit-0.46a]# make sense  ← 编译
[root@sample chkrootkit-0.46a]# cd ..  ← 返回上层目录
[root@sample ~]# cp -r chkrootkit-* /usr/local/chkrootkit  ← 复制编译后文件所在的目录到指定位置
[root@sample ~]# rm -rf chkrootkit*  ← 删除遗留的源代码目录及相关文件
 
测试 chkrootkit 

  然后测试 chkrootkit 是否能够正常运行。

[root@sample ~]# cd /usr/local/chkrootkit  ← 进入chkrootkit的目录
[root@sample chkrootkit]# ./chkrootkit | grep INFECTED  ← 测试运行chkrootkit
稍等片刻…如果没有显示“INFECTED”字样,而直接出现命令行提示符,说明一切OK!
[root@sample chkrootkit]# cd   ← 回到root用户目录 

让 chkrootkit 的监测自动化  

  用Shell Script编写一段脚本,通过这个脚本让chkrootkit的监测自动化。如有rootkit被发现的时候,发送邮件通知root用户,并且将运行结果保存在/var/log/messages文件中。

[root@sample ~]# vi chkrootkit  ← 建立chkrootkit自动运行脚本

#!/bin/bash 
PATH=/usr/bin:/bin

TMPLOG=`mktemp`

# Run the chkrootkit
/usr/local/chkrootkit/chkrootkit > $TMPLOG

# Output the log
cat $TMPLOG | logger -t chkrootkit

# bindshe of SMTPSllHow to do some wrongs
if [ ! -z "$(grep 465 $TMPLOG)" ] && \
[ -z $(/usr/sbin/lsof -i:465|grep bindshell) ]; then
sed -i '/465/d' $TMPLOG
fi

# If the rootkit have been found,mail root
[ ! -z "$(grep INFECTED $TMPLOG)" ] && \
grep INFECTED $TMPLOG | mail -s "chkrootkit report in `hostname`" root
rm -f $TMPLOG
[root@sample ~]# chmod 700 chkrootkit  ← 赋予脚本可被执行的权限
[root@sample ~]# mv chkrootkit /etc/cron.daily/  ← 将脚本移动到每天自动运行的目录中
 

chkrootkit 相关的系统命令的备份  

  如前言所述,当chkrootkit使用的系统命令被入侵者更改后,chkrootkit对 rootkit的监测将失效。所以,我们事前将chkrootkit使用的系统命令进行备份,在需要的时候使用备份的原始命令,让chkrootkit对 rootkit进行检测。

[root@sample ~]# mkdir /root/commands/  ← 建立暂时容纳命令备份的目录
[root@sample ~]# cp `which --skip-alias awk cut echo egrep find head id ls netstat ps strings sed uname` /root/commands/  ← (连续输入无换行)备份系统命令到建立好的目录 
[root@sample ~]# /usr/local/chkrootkit/chkrootkit -p /root/commands|grep INFECTED  ← 用备份的命令运行chkrootkit
[root@sample ~]# tar cvf /root/commands.tar /root/commands/ ← 将命令打包
[root@sample ~]# gzip /root/commands.tar  ← 将打包的文件压缩然后将压缩后的commands.tar.gz用SCP软件下载到安全的地方
[root@sample ~]# rm -rf commands*   ← 为安全起见,删除服务器端备份的系统命令及相关文件 

  如果以后想通过备份的原始系统命令来运行chkrootkit的时候,只需用SCP软件将备份的命令打包压缩文件上传至服务器端已知位置并解压缩,然后运行在chkrootkit的时候指定相应的目录即可。例如,假设已经将备份上传至root用户目录的情况如下:

[root@sample ~]# tar zxvf /root/commands.tar.gz  ← 解开压缩的命令备份
[root@sample ~]# /usr/local/chkrootkit/chkrootkit -p /root/commands|grep INFECTED ← 用备份的命令运行chkrootkit 

  然后在运行后删除相应遗留文件即可。
2009-4-1 17:58:18
打包指定文件夹并上传到指定FTP服务器
#!/bin/bash
#********************************************************
# Name:
# Purpose: Package file and upload to FTP
# Author: flyinweb
# Date: 2009-3-3
#********************************************************
# Variable Assignments
# path to log
LOGFILE=/root/myshell/mysqlbackup.log
TIMESTAMP_TODAY=`date +%Y%m%d`
TIMESTAMP_YESTERDAY=`date -d yesterday +%Y%m%d`
FTPSERVER="ftpserver"
FTPUSER="ftpuser"
FTPPWD="password"
LOCALPATH=/usr/mysqlbackup
ROMOTEPATH="urlsite"
BACKUPNAME=mysqlbackup.tar.gz
# 多个文件夹以空格分隔
URL_FOR_TAR=/usr/local/mysql/data/mysql

echo "####################################################" >>$LOGFILE 2>&1
echo "[`date +%c`] Shell Script Begin" >>$LOGFILE 2>&1
if [ ! -d $LOCALPATH ]; then
    echo "[`date +%c`] Local Path($LOCALPATH) does not exists" >>$LOGFILE 2>&1    
    exit
fi
if [ ! -d $URL_FOR_TAR ]; then
    echo "[`date +%c`] URL_FOR_TAR ($URL_FOR_TAR) does not exists" >>$LOGFILE 2>&1    
    exit
fi

echo "[`date +%c`] Remove Old Tar" >>$LOGFILE 2>&1
# delete yesterday's file
rm -f $LOCALPATH/$BACKUPNAME.${TIMESTAMP_YESTERDAY}
echo "[`date +%c`] Tar Action ..." >>$LOGFILE 2>&1
# tar
tar zcvf $LOCALPATH/$BACKUPNAME $URL_FOR_TAR
echo "[`date +%c`] Rename Action ..." >>$LOGFILE 2>&1
mv -f $LOCALPATH/$BACKUPNAME $LOCALPATH/$BACKUPNAME.${TIMESTAMP_TODAY} >>$LOGFILE 2>&1
echo "[`date +%c`] Check Action ..." >>$LOGFILE 2>&1
gzip -tv $LOCALPATH/$BACKUPNAME.${TIMESTAMP_TODAY} >>$LOGFILE 2>&1
# 0-true,1--false
# echo $?
while [ $? -ge 1 ]
do
    rm -f $LOCALPATH/$BACKUPNAME.${TIMESTAMP_TODAY}
    #echo "[`date +%c`] Tar | Rename | Check Action Begin" >>$LOGFILE 2>&1
    # tar zcvf $LOCALPATH/$BACKUPNAME /usr/local/mysql/var/urlsite
    tar zcvf $LOCALPATH/$BACKUPNAME $URL_FOR_TAR
    mv -f $LOCALPATH/mysqlbackup.tar.gz $LOCALPATH/$BACKUPNAME.${TIMESTAMP_TODAY} >>$LOGFILE 2>&1
    gzip -tv $LOCALPATH/$BACKUPNAME.${TIMESTAMP_TODAY} >>$LOGFILE 2>&1
done
echo "[`date +%c`] Tar | Rename | Check Action End" >>$LOGFILE 2>&1
echo "[`date +%c`] FTP Action Bein" >>$LOGFILE 2>&1
# FTP
ftp -n << !
open $FTPSERVER
user $FTPUSER $FTPPWD
bin
prompt
cd $ROMOTEPATH
lcd $LOCALPATH
put $BACKUPNAME.$TIMESTAMP_TODAY
close
bye
!
echo "[`date +%c`] FTP Action End" >>$LOGFILE 2>&1
echo "[`date +%c`] Shell Script End" >>$LOGFILE 2>&1
echo "####################################################" >>$LOGFILE 2>&1
2009-3-31 18:30:37
Scripts to manage Services
Changing a Service Account Password

Changes the service account password for any services running under the hypothetical service account Netsvc.

strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colServiceList = objWMIService.ExecQuery _
    ("Select * from Win32_Service")
For Each objservice in colServiceList
    If objService.Startname = ".\netsvc" Then
        errReturn = objService.Change( , , , , , , , "password")  
    End If 
Next

Configuring Service Error Control Codes

Configures all auto-start services to issue an alert if the service fails during startup.

Const NORMAL_ERROR_CONTROL = 2
strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colServiceList = objWMIService.ExecQuery _
    ("Select * from Win32_Service where ErrorControl = 'Ignore'")
For Each objService in colServiceList
    errReturn = objService.Change( , , , NORMAL_ERROR_CONTROL)   
Next

Configuring Service Start Options

Disables all services configured as manual start. Among other things, this prevents Power Users from being able to start these services.

strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colServiceList = objWMIService.ExecQuery _
    ("Select * from Win32_Service where StartMode = 'Manual'")
For Each objService in colServiceList
    errReturnCode = objService.Change( , , , , "Disabled")   
Next

Determining Services that can be Paused

Returns a list of services that can be stopped.

strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colServices = objWMIService.ExecQuery _
    ("Select * from Win32_Service Where AcceptPause = True")
For Each objService in colServices
    Wscript.Echo objService.DisplayName 
Next

Determining Services Running in All Processes
Returns a list of processes and all the services currently running in each process.

set objIdDictionary = CreateObject("Scripting.Dictionary")
strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colServices = objWMIService.ExecQuery _
    ("Select * from Win32_Service Where State <> 'Stopped'")
For Each objService in colServices
    If objIdDictionary.Exists(objService.ProcessID) Then
    Else
        objIdDictionary.Add objService.ProcessID, objService.ProcessID
    End If
Next
colProcessIDs = objIdDictionary.Items
For i = 0 to objIdDictionary.Count - 1
    Set colServices = objWMIService.ExecQuery _
        ("Select * from Win32_Service Where ProcessID = '" & _
            colProcessIDs(i) & "'")
    Wscript.Echo "Process ID: " & colProcessIDs(i)
    For Each objService in colServices
        Wscript.Echo VbTab & objService.DisplayName 
    Next
Next

Determining Services Running in a Process
Returns a list of services running in the Services.exe process.

strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colListOfServices = objWMIService.ExecQuery _
    ("Select * from Win32_Service")
For Each objService in colListOfServices
    If objService.PathName = "C:\WINDOWS\system32\services.exe" Then
        Wscript.Echo objService.DisplayName
    End If
Next

Determining Services that can be Stopped
Returns a list of services that can be stopped.

strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colServices = objWMIService.ExecQuery _
    ("Select * from Win32_Service Where AcceptStop = True")
For Each objService in colServices
    Wscript.Echo objService.DisplayName 
Next

Enumerating Antecedent Services for a Single Service
Enumerates all the services that must be running before the SMTP service can be started.

strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colServiceList = objWMIService.ExecQuery("Associators of " _ 
 & "{Win32_service.Name='SMTPSVC'} Where " _
    & "AssocClass=Win32_DependentService " & "Role=Dependent")        
For Each objService in colServiceList
    Wscript.Echo objService.DisplayName 
Next

Enumerating Dependent Services for All Services
Returns a list of all the services installed on a computer that are currently stopped.

Const ForAppending = 8
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objLogFile = _
     objFSO.OpenTextFile("c:\scripts\service_dependencies.csv", _
         ForAppending, True)
objLogFile.Write("Service Dependencies") 
objLogFile.Writeline
strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colListOfServices = objWMIService.ExecQuery _
    ("Select * from Win32_Service")
 
For Each objService in colListofServices
    objServiceRegistryName = objService.Name
    objServiceDisplayName = objService.DisplayName
 
Set colServiceList = objWMIService.ExecQuery("Associators of " _
   & "{Win32_Service.Name='" & objServiceRegistryName & "'} Where " & _
        "AssocClass=Win32_DependentService Role=Antecedent" )
 
 
 If colServiceList.Count = 0 then
        objLogFile.Write(objServiceDisplayName) & ", None"
        objLogFile.Writeline
    Else
        For Each objDependentService in colServiceList         
            objLogFile.Write(objServiceDisplayName) & ","
            objLogFile.Write(objDependentService.DisplayName)  
        Next 
        objLogFile.WriteLine
    End If
Next
objLogFile.Close

Enumerating Dependent Services for a Single Service
Enumerates all the services that cannot start until the Rasman service has started.

strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colServiceList = objWMIService.ExecQuery("Associators of " _
   & "{Win32_Service.Name='rasman'} Where " _
        & "AssocClass=Win32_DependentService " & "Role=Antecedent" )
For Each objService in colServiceList
    Wscript.Echo objService.DisplayName 
Next

Enumerating Inactive Services
Returns a list of all the services installed on a computer that are currently stopped.

strComputer = "."
 
Set objWMIService = GetObject("winmgmts:" & _
    "{impersonationLevel=Impersonate}!\\" & strComputer & "\root\cimv2")
Set colStoppedServices = objWMIService.ExecQuery _
  ("SELECT DisplayName,State FROM Win32_Service WHERE State <> 'Running'")
 
For Each objService in colStoppedServices
    Wscript.Echo objService.DisplayName  & " = " & objService.State
Next

Enumerating Service Load Order Groups
Returns a list of all the service load order groups found on a computer, and well as their load order.

On Error Resume Next
strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colItems = objWMIService.ExecQuery("Select * from Win32_LoadOrderGroup")
For Each objItem in colItems
    Wscript.Echo "Driver Enabled: " & objItem.DriverEnabled
    Wscript.Echo "Group Order: " & objItem.GroupOrder
    Wscript.Echo "Name: " & objItem.Name
    Wscript.Echo
Next

Installing a Service
Installs a hypothetical service Db.exe.

Const OWN_PROCESS = 16
Const NOT_INTERACTIVE = False
Const NORMAL_ERROR_CONTROL = 2
strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set objService = objWMIService.Get("Win32_BaseService")
errReturn = objService.Create("DbService" ,"Personnel Database" , _
    "c:\windows\system32\db.exe", OWN_PROCESS, NORMAL_ERROR_CONTROL, "Manual", _
        NOT_INTERACTIVE, "NT AUTHORITY\LocalService", ""  )
Wscript.Echo errReturn

Monitoring Service Performance
Uses formatted performance counters to retrieve performance data for the DHCP Server service. 

strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
set objRefresher = CreateObject("WbemScripting.SWbemRefresher")
Set colDHCPServer = objRefresher.AddEnum _
    (objWMIService, "win32_PerfFormattedData_DHCPServer_DHCPServer"). _
          ObjectSet
objRefresher.Refresh
For i = 1 to 60
    For Each objDHCPServer in colDHCPServer
        Wscript.Echo "Acknowledgements per second: " & _
            objDHCPServer.AcksPerSec
        Wscript.Echo "Declines per second: " & _
            objDHCPServer.DeclinesPerSec
        Wscript.Echo "Discovers per second: " & _
            objDHCPServer.DiscoversPerSec
        Wscript.Echo "Informs per second: " & objDHCPServer.InformsPerSec
        Wscript.Echo "Offers per second: " & objDHCPServer.OffersPerSec
        Wscript.Echo "Releases per second: " & _
            objDHCPServer.ReleasesPerSec
        Wscript.Echo "Requests per second: " & _
            objDHCPServer.RequestsPerSec
    Next
    Wscript.Sleep 10000
    objRefresher.Refresh
Next

Pausing Services Running Under a Specific Account
Pauses all services running under the hypothetical service account Netsvc.

strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colServices = objWMIService.ExecQuery _
    ("Select * from Win32_Service")
For each objService in colServices 
    If objService.StartName = ".\netsvc" Then
        errReturnCode = objService.PauseService()
    End If
Next

Removing a Service
Removes a hypothetical service named DbService.

strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colListOfServices = objWMIService.ExecQuery _
    ("Select * from Win32_Service Where Name = 'DbService'")
For Each objService in colListOfServices
    objService.StopService()
    objService.Delete()
Next

Resuming AutoStart Services that are Paused
Restarts any auto-start services that have been paused.

strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colListOfServices = objWMIService.ExecQuery _
 ("Select * from Win32_Service Where State = 'Paused' and StartMode = 'Auto'")
For Each objService in colListOfServices
    objService.ResumeService()
Next

Retrieving Service Properties
Retrieves a complete list of services and their associated properties. Information is saved to a text file: C:\Scripts\Service_List.cs.

Const ForAppending = 8
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objLogFile = objFSO.OpenTextFile("c:\scripts\service_list.csv", _ 
    ForAppending, True)
objLogFile.Write _
    ("System Name,Service Name,Service Type,Service State, Exit " _ 
        & "Code,Process ID,Can Be Paused,Can Be Stopped,Caption," _ 
        & "Description,Can Interact with Desktop,Display Name,Error " _
        & "Control, Executable Path Name,Service Started," _ 
        & "Start Mode,Account Name ") 
objLogFile.Writeline
strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colListOfServices = objWMIService.ExecQuery _
        ("Select * from Win32_Service")
For Each objService in colListOfServices
    objLogFile.Write(objService.SystemName) & "," 
    objLogFile.Write(objService.Name) & "," 
    objLogFile.Write(objService.ServiceType) & "," 
    objLogFile.Write(objService.State) & "," 
    objLogFile.Write(objService.ExitCode) & "," 
    objLogFile.Write(objService.ProcessID) & "," 
    objLogFile.Write(objService.AcceptPause) & "," 
    objLogFile.Write(objService.AcceptStop) & "," 
    objLogFile.Write(objService.Caption) & "," 
    objLogFile.Write(objService.Description) & "," 
    objLogFile.Write(objService.DesktopInteract) & "," 
    objLogFile.Write(objService.DisplayName) & "," 
    objLogFile.Write(objService.ErrorControl) & "," 
    objLogFile.Write(objService.PathName) & "," 
    objLogFile.Write(objService.Started) & "," 
    objLogFile.Write(objService.StartMode) & "," 
    objLogFile.Write(objService.StartName) & "," 
    objLogFile.writeline
Next
objLogFile.Close

Retrieving Service Status
Returns a list of all the services installed on a computer, and indicates their current status (typically, running or not running).

strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colRunningServices = objWMIService.ExecQuery _
    ("Select * from Win32_Service")
For Each objService in colRunningServices 
    Wscript.Echo objService.DisplayName  & VbTab & objService.State
Next

Retrieving Service Status Changes from Event Logs
Retrieves events from the System event log that have an event ID of 7036. These events are recorded any time a service changes status. 

Set dtmConvertedDate = CreateObject("WbemScripting.SWbemDateTime")
strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colServiceEvents = objWMIService.ExecQuery _
    ("Select * from Win32_NTLogEvent Where Logfile = 'System' and " _
        & "EventCode = '7036'")
For Each strEvent in colServiceEvents
    dtmConvertedDate.Value = strEvent.TimeWritten
    Wscript.Echo dtmConvertedDate.GetVarDate    
    Wscript.Echo strEvent.Message
Next

Starting AutoStart Services that have Stopped
Restarts any auto-start services that have been stopped.

strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colListOfServices = objWMIService.ExecQuery _
 ("Select * from Win32_Service Where State = 'Stopped' and StartMode = " _
     & "'Auto'")
For Each objService in colListOfServices
    objService.StartService()
Next

Starting a Service and Its Dependents
Starts the NetDDE service and all its dependent services.

strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colServiceList = objWMIService.ExecQuery _
    ("Select * from Win32_Service where Name='NetDDE'")
For each objService in colServiceList
    errReturn = objService.StartService()
Next
Wscript.Sleep 20000
Set colServiceList = objWMIService.ExecQuery("Associators of " _
   & "{Win32_Service.Name='NetDDE'} Where " _
        & "AssocClass=Win32_DependentService " & "Role=Dependent" )
For each objService in colServiceList
    objService.StartService()
Next

Stopping a Service and Its Dependents
Stops the NetDDE service and all its dependent services.

strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colServiceList = objWMIService.ExecQuery("Associators of " _
   & "{Win32_Service.Name='NetDDE'} Where " _
        & "AssocClass=Win32_DependentService " & "Role=Antecedent" )
For each objService in colServiceList
    objService.StopService()
Next
Wscript.Sleep 20000
Set colServiceList = objWMIService.ExecQuery _
        ("Select * from Win32_Service where Name='NetDDE'")
For each objService in colServiceList
    errReturn = objService.StopService()
Next

Stopping Services Running Under a Specific Account
Stops all services running under the hypothetical service account Netsvc.

strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colServices = objWMIService.ExecQuery _
    ("Select * from win32_Service")
For each objService in colServices 
    If objService.StartName = ".\netsvc" Then
        errReturnCode = objService.StopService()
    End If
Next

Switching Service Accounts to Local Service
Changes the service account to LocalService for any services running under the hypothetical service account Netsvc.

strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colServices = objWMIService.ExecQuery _
    ("Select * from Win32_Service")
For each objService in colServices
    If objService.StartName = ".\netsvc" Then
        errServiceChange = objService.Change _
        ( , , , , , , "NT AUTHORITY\LocalService" , "")  
    End If
Next
2009-3-27 16:42:10
创建删除服务
Function DeleteService(SrvName)
    strComputer = "."
    Set objWMIService = GetObject("winmgmts:" _
        & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")

    Set colListOfServices = objWMIService.ExecQuery _
        ("Select * from Win32_Service Where Name = '" & SrvName & "'")

    For Each objService in colListOfServices
        objService.StopService()
        objService.Delete()
    Next
    If Err.Number <> 0 Then
        DeleteService = 0
    Else
        DeleteService = 1
    End If
End Function 

Sub InstallService(SrvName,DispName,Path)
    Const OWN_PROCESS = 16
    Const NOT_INTERACTIVE = False
    Const NORMAL_ERROR_CONTROL = 2

    strComputer = "."
    Set objWMIService = GetObject("winmgmts:" _
        & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
    Set objService = objWMIService.Get("Win32_Service")

    errReturn = objService.Create(SrvName,DispName, _
        Path, OWN_PROCESS, NORMAL_ERROR_CONTROL,_
            "Automatic", NOT_INTERACTIVE, "LocalSystem", ""  )
End Sub

Service Properties Exposed to the WMI Create Method

Position Property 
1 Name - Name of the service as stored in the registry.
2 DisplayName - Name of the service as displayed in the Services snap-in. 
3 PathName - Full path to the service's executable file. 
4 ServiceType - Type of service. 
5 ErrorControl - Action to be taken should a service fail during startup.
6 StartMode - Method used to start the service. 
7 DesktopInteract - Indicates whether the service can create or communicate with windows on the desktop. 
8 StartName - Account name under which the service runs.
9 StartPassword - Password for the account name specified by StartName.
10 LoadOrderGroup - Load-ordered group to which the service belongs.
11 LoadOrderGroupDependencies - Set of load-ordered groups that must be running before this service can start.
12 ServiceDependencies - Services that must be running before this service can start.

Service Method Error Codes
Value Description 
0 The request was accepted.
1 The request is not supported.
2 The user did not have the necessary access.
3 The service cannot be stopped because other services that are running are dependent on it.
4 The requested control code is not valid, or it is unacceptable to the service.
5 The requested control code cannot be sent to the service because the state of the service (Win32_BaseService State property) is equal to 0, 1, or 2.
6 The service has not been started.
7 The service did not respond to the start request in a timely fashion.
8 Unknown failure when starting the service.
9 The directory path to the service executable file was not found.
10 The service is already running.
11 The database to add a new service is locked.
12 A dependency this service relies on has been removed from the system.
13 The service failed to find the service needed from a dependent service.
14 The service has been disabled from the system.
15 The service does not have the correct authentication to run on the system. 
16 This service is being removed from the system. 
17 The service has no execution thread. 
18 The service has circular dependencies when it starts. 
19 A service is running under the same name. 
20 The service name has invalid characters. 
21 Invalid parameters have been passed to the service. 
22 The account under which this service runs is either invalid or lacks the permissions to run the service. 
23 The service exists in the database of services available from the system. 
24 The service is currently paused in the system.
2009-3-27 16:34:25
快速比较查询结果是否一致
Here’s a quick productivity tip: when optimizing queries by rewriting them to different forms that should return the same results, you can verify that you get the same results by taking a checksum of them.

Just set your pager to md5sum:

 pager md5sum -
PAGER set to 'md5sum -'
mysql> select * from user;
b20bd3864962507e2e05cd8706440ffd  -
3 rows in set (0.00 sec)
mysql> select * from user;
b20bd3864962507e2e05cd8706440ffd  -
3 rows in set (0.00 sec)
mysql> select * from user;
b20bd3864962507e2e05cd8706440ffd  -
3 rows in set (0.00 sec)
2009-3-26 18:03:33
BIND主辅DNS相关知识
 Linux主辅dns数据不同步故障排除
     在互联网中,我们知道任何一台提供应用服务的主机(例如:HTTP、FTP等)都有它一个便于记忆Domain Name,这些名称给用户带来了许多便利。但是,有些时候这些服务却对我们这些维护人员显得有些不“厚道”。本文将介绍DNS主辅配置过程中常遇到的配置问题以及排除方法。
      我们有必要了解一下主辅DNS区域复制原理:如下图3所示主辅DNS服务器数据同步的过程,首先master DNS服务器每次修改完成并重启服务后,将传送notify给所有的slave DNS服务器。slave DNS服务器将查询master服务器的SOA记录,master DNS服务器收到请求后将SOA记录发送给Slave DNS服务器,Slave DNS服务器收到后同时对比查询结果中的serial值,如果serial值不大于本机的话将结束数据同步过程;但是如果serial值大于本机的话,slave DNS将发送zone transfer请求要求(AXFR/IXFR)。Master响应zone transfer请求并传送结果,直到整个slave更新完成。
  按此在新窗口打开图片
整体的同步过程如上所述,但是如何将这些原理体现在相关的配置文件中,这里以创建域名www.qiuri.com记录为例:
测试平台:RedHat Enterprise Linux 5 Server update 2
所需软件包列表:
软件包名称
作用
bind-libs
包含DNS的库文件
Bind-9
DNS服务器软件,安装此软件前需要安装libs
caching-nameserver
配置文件模板
bind-utils
DNS查询工具软件
bind-chroot
使DNS在chroot模式下运行,增强安全性(选择性安装)
根据你使用的安装包安装相应的软件,这里我使用系统自带的rpm包,配置yum本地更新源后,使用命令yum install bind*进行安装。使用yum安装的好处是能够自动处理安装过程中包的连带性,但是有时候也安装了一些不必要的程序到你的系统。
安装完成后第一件需要注意的事情是“查看你是否安装了bind-chroot这个包”这个程序的主要功能是:将DNS服务器在chroot模式下运行,在这种模式下运行的话,它会将所有和DNS相关的文件都锁定到/var/named/chroot目录下,就是说bind的访问范围仅仅定位于这个目录中,无法进一步提升到系统中的其它目录。这样可以提高系统的安全性。这样听起来很美,但是配置起来会出现许多的问题,建议不要使用。如果你使用了的话,所有配置修改需要到/var/named/chroot下,例如配置文件在/var/named/chroot/etc/named.conf。
[root@master ~]#rpm  q bind-chroot
由于RedHat AS 5安装后默认的配置文件名称named.caching-nameserver.conf和/etc/named. caching .zones组成。修改配置文件名称:
[root@master ~]#mv /etc/named.caching-nameserver.conf /etc/named.conf
[root@master ~]#mv /etc/named. caching .zones /etc/named. zones
修改主DNS服务器上的配置文件,修改结果如下:
[root@master~ ]# vi /etc/named.conf
//
// named.caching-nameserver.conf
省略若干注释
options {
        listen-on port 53 { 10.1.1.1; };
        listen-on-v6 port 53 { ::1; };
        directory       "/var/named";
        dump-file       "/var/named/data/cache_dump.db";
        statistics-file "/var/named/data/named_stats.txt";
        memstatistics-file "/var/named/data/named_mem_stats.txt";
        query-source    port 53;
        query-source-v6 port 53;
        allow-query     { any; };
};
include "/etc/named.zones";
[root@master ~]#修改/etc/named.zones文件,添加相关字段创建正向区域,添加内容如下:
[root@master~]# vi /etc/named.zones 
// named.rfc1912.zones:
省略若干注释和若干默认区域
zone "qiuri.com" IN {
        type master;
        file "qiuri.com";
        allow-transfer { 10.1.1.2; };
        allow-update { none; };
};
[root@master~]#
在/var/named创建相关区域文件qiuri.com内容如下所示:
[root@master~ ]# cat /var/named/qiuri.com 
$TTL    86400
@       IN      SOA     master.qiuri.com. root.master.qiuri.com.  (
                                      2008111305 ; Serial
                                      28800      ; Refresh
                                      14400      ; Retry
                                      3600000    ; Expire
                                      86400 )    ; Minimum
        IN      NS      master.qiuri.com.
        IN      NS      slaves.qiuri.com.
www     IN      A       10.1.1.1
ftp     IN      A    3   10.1.1.1
[root@master~ ]#
由于是测试我这里就不建立许多的区域了,在辅助DNS上的配置几乎一样,只需要将named.conf配置文件中的listen-on port 53 中的IP地址字段修改为辅助DNS服务器即可。
[root@ slave~ ]# vi /etc/named.conf 
//
// named.caching-nameserver.conf
省略若干注释
options {
        listen-on port 53 { 10.1.1.2; };
省略其它和主DNS服务器相同字段
        include "/etc/named.zones";
[root@ slave~ ]#
在/etc/named.zones配置文件中将区域类型修改为slave,并指定主DNS服务器IP即可:
[root@ slave~]# vi /etc/named.zones 
// named.rfc1912.zones:
省略若干字段。。。。。。
zone "qiuri.com" IN {
        type slave;
        file "slaves/qiuri.com";
        masters { 10.1.1.1; };
        allow-update { none; };
};
[root@ slave~]#
注意:修改每台DNS服务器自己为DNS服务器,相关配置文件为/etc/resolv.conf。
将所有配置完成后我们分别在主辅DNS上执行命令service named start启动服务。
   故障一:
DNS上使用ping命令测试,发现了第一个故障:启动服务过程中没有任何的错误提示,ping域名的时候却显示没有这个域名。
故障分析:通过ping域名的时候,我们得知没有这个域名的回应值,这表明这个区域没有生效,但是到底是什么原因导致区域没有生效呢?这个时候不要茫然,去看看日志吧!
[root@master~]# tail /var/log/messages
省略若干… …
Nov 21 20:55:57 localhost named[7113]: zone qiuri.com/IN: loading master file qiuri.com: permission denied
Nov 21 20:55:57 localhost named[7113]: zone localdomain/IN: loaded serial 42
Nov 21 20:55:57 localhost named[7113]: zone localhost/IN: loaded serial 42
Nov 21 20:55:57 localhost named[7113]: running
[root@master~]#
黎明前的黑暗终于度过,一行行的日志终于看完,发现在加载qiuri.com的时候出现了permission denied的提示,就是说加载文件时被拒绝了。为什么会拒绝呢?我们先查看一下这个文件的属性吧? 
[root@master~]# ll /var/named/qiuri.com 
-rw-r----- 1 root root 436 11-21 20:54 /var/named/qiuri.com
[root@master~]#
发现这个文件的所有者是root,属组也是root,但是由于DNS服务使用named这个用户启动服务,难怪会拒绝了呢。那修改一下吧! 
[root@master~]#chown named.named /var/named/qiuri.com
修改完成后重启dns服务,使配置生效。
[root@master~]#service named restart
再次查看日志,发现已经成功加载。
[root@master~]# tail -5 /var/log/messages
省略若干... ...
Nov 21 21:11:46 localhost named[7217]: zone qiuri.com/IN: loaded serial 2008111305
Nov 21 21:11:46 localhost named[7217]: zone localdomain/IN: loaded serial 42
Nov 21 21:11:46 localhost named[7217]: zone localhost/IN: loaded serial 42
Nov 21 21:11:46 localhost named[7217]: running
[root@master~]#
总结:这个问题出现的原因是由于我们创建这个文件的时候,没有考虑文件权限,导致出现这个问题。如果有的朋友不是手工编辑的这个文件,而是直接复制/var/named/named.local这个文件后再修改的,建议复制过程中使用-p参数。这样就避免了cp后再修改权限的步骤。
接着迫不及待的去启动了辅助DNS的服务,之后去查看/var/named/slaves中是否存在qiuri.com这个区域文件。发现成功复制过来。
[root@ slave ]# ls /var/named/slaves/
qiuri.com
[root@ slave ]#
到这个时候我们的测试还没有结束,继续进行中,首先我们再次回到主DNS服务器上编辑qiuri.com区域文件,增加主机记录,修改serial值。
[root@master ]# cat /var/named/qiuri.com 
$TTL    86400
@       IN      SOA     master.qiuri.com. root.master.qiuri.com.  (
                                      2008111306 ; Serial
                                      28800      ; Refresh
                                      14400      ; Retry
                                      3600000    ; Expire
                                      86400 )    ; Minimum
        IN      NS      master.qiuri.com.
        IN      NS      slaves.qiuri.com.
www     IN      A       10.1.1.1
ftp     IN      A       10.1.1.1
down    IN      A       10.1.1.1
[root@master~]#
修改完成后,使用service named reload重新加载配置文件,到辅助dns上验证我们添加的记录是否同步过来。但是再次失望了,故障又发生了。
故障二:
主DNS服务器修改记录或添加区域辅助DNS同步不过去,或者需要很长时间。这样如果在现实生活中,会造成各地访问的结果不同。我们有必要研究一下主DNS服务器上修改完成后如何快速的同步给其它辅助的DNS。
故障分析:
为了查清故障的原因,这个时候我分别在各个DNS服务器上开启两个终端,在第一个终端输入命令tail -f /var/log/messages动态监控日志;另一个终端中重启DNS服务。发现没有产生任何日志。这个时候,思考了一下主辅DNS的工作原理,每次主DNS修改完成后重启服务会传送notify值,但是这里却没有传送。再次回到配置文件中检查相关字段发现没有定义。这个字段可以在named.conf中options字段中声明。也可以在单个区域文件中声明。
这里在qiuri.com的zone中添加also-notify { 10.1.1.2; };值。
[root@master~]#
zone "qiuri.com" IN {
        type master;
        file "qiuri.com";
        also-notify { 10.1.1.2; };
        allow-transfer { 10.1.1.2; };
        allow-update { none; };
};
[root@master~]#
注意:如果要在options中声明,可以使用notify yes;即可。
再次加载服务,发现监控的日志开始有相应的请求和发送的字段出现。主DNS服务器的日志如下: 
[root@master ~]#tail -f /var/log/messages
Nov 13 16:17:38 master named[3159]: zone qiuri.com/IN: sending notifies (serial 2008111306)
Nov 13 16:18:57 master named[3159]: client 10.1.1.2#45757: transfer of 'qiuri.com/IN': AXFR-style IXFR started
Nov 13 16:18:57 master named[3159]: client 10.1.1.2#45757: transfer of 'qiuri.com/IN': AXFR-style IXFR ended 
[root@master ~]#
辅助DNS服务器上日志显示如下: 
[root@ slave~ ]#tail -f /var/log/messages
Nov 14 08:12:55 ns named[6014]: running
Nov 14 08:12:55 ns named[6014]: zone qiuri.com/IN: sending notifies (serial 2008111306)
Nov 14 08:15:10 ns named[6014]: client 10.1.1.1#1106: received notify for zone 'qiuri.com'
Nov 14 08:15:10 ns named[6014]: zone qiuri.com/IN: Transfer started.
[root@ slave~ ]#
这个时候问题解决,其实还有配置主辅DNS服务器的时候还会见到类似failed while receiving responses: REFUSED错误提示,一般是由于主DNS服务器上未授权或者是相关的目录没有权限造成。只要耐心查看日志和思考问题,相信问题均可解决。
相关原理:
在解决问题的过程中有的朋友说将SOA中的Refresh值修改小一点,没错!但是这个值什么时候生效呢?当我们主DNS服务器上修改完成后重启服务,会主动传送notify值,如果辅助DNS服务器没有收到才参考Refresh,Refresh 不成功,则参考Retry ,Retry 一直不成功, 则参考 Expire,如果Expire也不成功,则选择放弃zone transfer的过程。

BIND DNS 服务器配置笔记 

#首先我们看看和DNS配置有关的两个配置文件:
[root@redhatlinux9 root]# cat /etc/host.conf
# 查看此文件,它是转换程序控制文件,该文件告诉转换程序使用哪些服务以及按什么顺序进行查询。
order hosts,bind
# 以上是正常标准配置,特殊需要我们可以更改如下(并不是必需):
order  bind hosts #先使用BIND(DNS),再使用HOSTS文件 解析主机名。
multi  off  #hosts文件中所指定的每一台主机只有一个IP地址,反之ON。
nospoof on  #要检查IP地址欺骗。
alert on  #若检查到IP欺骗,将警告信息进行记录。
trim brus.net  #解析器会先把被查找域名中的BRUS.NET去掉,再从/etc/hosts中查找匹配的主机。
[root@redhatlinux9 root]# cat /etc/resolv.conf
# 查看转换程序配置文件,此文件指明使用哪一个DNS服务器,客户端配置必需。
nameserver 61.134.1.9
# 以上是基本配置,本机使用的DNS服务器地址是 61.134.1.9 。
###############################################################################################
#安装和检查BIND域名服务器:
[root@redhatlinux9 root]# rpm -qa|grep bind
bind-9.2.1-16
redhat-config-bind-1.9.0-13
bind-utils-9.2.1-16
ypbind-1.11-4
[root@redhatlinux9 RPMS]# rpm -qa|grep name
caching-nameserver-7.2-7
# 以上是检查到BIND在本机的安装情况和得到的信息,如果未安装,按以下步骤:
[root@redhatlinux9 root]# mount /mnt/cdrom/
# 挂载光驱,需要安装光盘第一张。
[root@redhatlinux9 root]# cd /mnt/cdrom/RedHat/RPMS/
# 进入光盘中RPM包所在路径。
[root@redhatlinux9 RPMS]# rpm -ivh bind-9.2.1-16.i386.rpm
[root@redhatlinux9 RPMS]# rpm -ivh bind-utils-9.2.1-16.i386.rpm
[root@redhatlinux9 RPMS]# rpm -ivh redhat-config-bind-1.9.0-13.norach.rpm
# 安装以上三个RPM包。
[root@redhatlinux9 RPMS]# cd; umount /mnt/cdrom/
# 卸载光驱挂载,放入第二张安装光盘。
[root@redhatlinux9 root]# mount /mnt/cdrom/
# 挂载光驱,需要第二张安装光盘。
[root@redhatlinux9 root]# cd /mnt/cdrom/RedHat/RPMS/
# 进入RPM包所在路径。
[root@redhatlinux9 RPMS]# rpm -ivh caching-nameserver-7.2-7.noarch.rpm
# 安装此RPM包。
# 以下启动BIND服务:
[root@redhatlinux9 RPMS]# service named start
# 立即启动BIND服务,成功。
[root@redhatlinux9 RPMS]# pstree|grep named
     |-named
# 检查服务运行,可以看到NAMED服务正在运行。
[root@redhatlinux9 RPMS]# rndc status
number of zones: 4
debug level: 0
xfers running: 0
xfers deferred: 0
soa queries in progress: 0
query logging is OFF
server is up and running
# 以上是查看服务器运行状态的命令和得到的信息。
###############################################################################################
#以下我们可以查看BIND的一些配置文件:
[root@redhatlinux9 RPMS]# cat /etc/named.conf
# 查看主配置文件 /etc/named.conf
// generated by named-bootconf.pl
 
options {
        directory "/var/named"; #服务器配置文件的工作目录。
        /*
         * If there is a firewall between you and nameservers you want
         * to talk to, you might need to uncomment the query-source
         * directive below.  Previous versions of BIND always asked
         * questions using port 53, but BIND 8.1 uses an unprivileged
         * port by default.
         */
        // query-source address * port 53;
};
 
//
// a caching only nameserver config
//
controls {
        inet 127.0.0.1 allow { localhost; } keys { rndckey; };
};    #定义RNDC命令使用的控制通道。
zone "." IN {
        type hint;
        file "named.ca";
};
 
zone "localhost" IN {
        type master;
        file "localhost.zone";
        allow-update { none; };
};    #定义LOCALHOST正向解析区声明。
 
zone "0.0.127.in-addr.arpa" IN {
        type master;
        file "named.local";
        allow-update { none; };
};    #定义LOCALHOST正向解析区声明。
 
include "/etc/rndc.key";
# 以上是BING默认配置文件,是一个唯高速缓存服务器的配置,如只需唯高速缓存服务器,无需修改。

[root@redhatlinux9 RPMS]# grep -v ";" /var/named/named.ca
# 查看根区域指向文件 /var/named/named.ca 。
.                        3600000  IN  NS    A.ROOT-SERVERS.NET.
A.ROOT-SERVERS.NET.      3600000      A     198.41.0.4
.                        3600000      NS    B.ROOT-SERVERS.NET.
B.ROOT-SERVERS.NET.      3600000      A     128.9.0.107
.                        3600000      NS    C.ROOT-SERVERS.NET.
C.ROOT-SERVERS.NET.      3600000      A     192.33.4.12
.                        3600000      NS    D.ROOT-SERVERS.NET.
D.ROOT-SERVERS.NET.      3600000      A     128.8.10.90
.                        3600000      NS    E.ROOT-SERVERS.NET.
E.ROOT-SERVERS.NET.      3600000      A     192.203.230.10
.