??xml version="1.0" encoding="utf-8" standalone="yes"?>k3k网络捕鱼赢钱游戏http://www.oiklr.tw/alex/category/5489.html不求多得,只求一? about java,hibernate,spring,design,database,Ror,ruby,快速开?lt;br/><br/> 最q关心的内容关键?RoR zh-cnMon, 18 Jun 2007 09:14:53 GMTMon, 18 Jun 2007 09:14:53 GMT60[zt]如何在Linux下增加Swap http://www.oiklr.tw/alex/archive/2007/06/18/124940.htmlAlexAlexMon, 18 Jun 2007 06:27:00 GMThttp://www.oiklr.tw/alex/archive/2007/06/18/124940.htmlhttp://www.oiklr.tw/alex/comments/124940.htmlhttp://www.oiklr.tw/alex/archive/2007/06/18/124940.html#Feedback0http://www.oiklr.tw/alex/comments/commentRss/124940.htmlhttp://www.oiklr.tw/alex/services/trackbacks/124940.html1.查看pȝSwapI间使用

[root@jumper usr]# free
             total       used       free     shared    buffers     cached
Mem:        513980     493640      20340          0     143808     271780
-/+ buffers/cache:      78052     435928
Swap:      1052248      21256    1030992

2.在空间合适处创徏swap文g

[root@jumper usr]# mkdir swap
[root@jumper usr]# cd swap
[root@jumper swap]# dd if=/dev/zero of=swapfile bs=1024 count=10000
10000+0 records in
10000+0 records out
[root@jumper swap]# ls -al
total 10024
drwxr-xr-x    2 root     root         4096  7?28 14:58 .
drwxr-xr-x   19 root     root         4096  7?28 14:57 ..
-rw-r--r--    1 root     root     10240000  7?28 14:58 swapfile


[root@jumper swap]# mkswap swapfile
Setting up swapspace version 1, size = 9996 KiB


3.Ȁzswap文g
[root@jumper swap]# swapon swapfile
[root@jumper swap]# ls -l
total 10016
-rw-r--r--    1 root     root     10240000  7?28 14:58 swapfile
[root@jumper swap]# free
             total       used       free     shared    buffers     cached
Mem:        513980     505052       8928          0     143900     282288
-/+ buffers/cache:      78864     435116
Swap:      1062240      21256    1040984
[root@jumper swap]#  

 

 

SwapQ即交换区,除了安装Linux的时候,有多h兛_q它呢?其实QSwap的调整对Linux服务器,特别是Web服务器的性能臛_重要。通过调整SwapQ有时可以越q系l性能瓉Q节省系l升U费用?nbsp;

本文内容包括Q?nbsp;


Swap基本原理 

H破128M Swap限制 

Swap配置Ҏ能的媄?nbsp;

Swap性能监视 

有关Swap操作的系l命?nbsp;
Swap基本原理 

Swap的原理是一个较复杂的问题,需要大量的幅来说明。在q里只作单的介绍Q在以后的文章中和大家详细讨论Swap实现的细节?nbsp;

众所周知Q现代操作系l都实现?虚拟内存"q一技术,不但在功能上H破了物理内存的限制QɽE序可以操纵大于实际物理内存的空_更重要的是,"虚拟内存"是隔L个进E的安全保护|,使每个进E都不受其它E序的干扰?nbsp;

Swap I间的作用可单描qCؓQ当pȝ的物理内存不够用的时候,需要将物理内存中的一部分I间释放出来Q以供当前运行的E序使用。那些被释放的空间可能来自一些很长时间没有什么操作的E序Q这些被释放的空间被临时保存到SwapI间中,{到那些E序要运行时Q再从Swap中恢复保存的数据到内存中。这PpȝL在物理内存不够时Q才q行Swap交换?nbsp;

计算机用户会l常遇这U现象。例如,在用WindowspȝӞ可以同时q行多个E序Q当你切换到一个很长时间没有理会的E序Ӟ会听到硬?哗哗"直响。这是因个程序的内存被那些频J运行的E序l?偯"了,攑ֈ了SwapZ。因此,一旦此E序被放|到前端Q它׃从Swap区取回自q数据Q将其放q内存,然后接着q行?nbsp;

需要说明一点,q不是所有从物理内存中交换出来的数据都会被放到Swap中(如果q样的话QSwap׃不堪重负Q,有相当一部分数据被直接交换到文gpȝ。例如,有的E序会打开一些文ӞҎ件进行读写(其实每个E序都至要打开一个文Ӟ那就是运行程序本w)Q当需要将q些E序的内存空间交换出LQ就没有必要文仉分的数据攑ֈ SwapI间中了Q而可以直接将其放到文仉厅R如果是L件操作,那么内存数据被直接释放,不需要交换出来,因ؓ下次需要时Q可直接从文件系l恢复;如果是写文gQ只需要将变化的数据保存到文g中,以便恢复。但是那些用malloc和new函数生成的对象的数据则不同,它们需要SwapI间Q因为它们在文gpȝ中没有相应的"储备"文gQ因此被UC"匿名"(Anonymous)内存数据。这cL据还包括堆栈中的一些状态和变量数据{。所以说QSwap I间?匿名"数据的交换空间?nbsp;

H破128M Swap限制 

l常看到有些LinuxQ国内汉化版Q安装手册上有这L说明QSwapI间不能过128M。ؓ什么会有这U说法?在说?128M"q个数字的来历之前,先给问题一个回{:现在Ҏ不存?28M的限Ӟ现在的限制是2GQ?nbsp;

Swap I间是分늚Q每一늚大小和内存页的大一P方便SwapI间和内存之间的数据交换。旧版本的Linux实现SwapI间Ӟ用SwapI间的第一作为所有SwapI间늚一?位映?QBit mapQ。这是说第一늚每一位,都对应着一SwapI间。如果这一位是1Q表C此Swap可用Q如果是0Q表C此|坏块Q不能用。这么说来,W一个Swap映射位应该是0Q因为,W一Swap是映页。另外,最?0个映位也被占用Q用来表CSwap的版本(原来的版本是Swap_space Q现在的版本是swapspace2Q。那么,如果说一늚大小为sQ这USwap的实现方法共能管?8 * ( s - 10 ) - 1"个Swapc对于i386pȝ来说s=4096Q则I间大小׃ؓ133890048Q如果认?1 MB=2^20 Byte的话Q大正好ؓ128M?nbsp;

之所以这h实现SwapI间的管理,是要防止SwapI间中有坏块。如果系l检查到Swap中有坏块Q则在相应的位映上标记?Q表C此不可用。这样在使用SwapӞ不至于用到坏块,而ɾpȝ产生错误?nbsp;

现在的系l设计者认为: 

1.现在盘质量很好Q坏块很?nbsp;

2.q有,也不多,只需要将坏块|列出来Q而不需要ؓ每一徏立映?nbsp;

3.如果有很多坏块,׃应该此盘作ؓSwapI间使用?nbsp;

于是Q现在的Linux取消了位映射的方法,也就取消?28M的限制。直接用地址讉KQ限制ؓ2G?nbsp;

Swap配置Ҏ能的媄?nbsp;

分配太多的SwapI间会浪费磁盘空_而SwapI间太少Q则pȝ会发生错误?nbsp;

如果pȝ的物理内存用光了Q系l就会跑得很慢,但仍能运行;如果SwapI间用光了,那么pȝ׃发生错误。例如,Web服务器能Ҏ不同的请求数量衍生出多个服务q程Q或U程Q,如果SwapI间用完Q则服务q程无法启动Q通常会出?application is out of memory"的错误,严重时会造成服务q程的死锁。因此SwapI间的分配是很重要的?nbsp;

通常情况下,SwapI间应大于或{于物理内存的大,最不应小?4MQ通常SwapI间的大应是物理内存的2-2.5倍。但Ҏ不同的应用,应有不同的配|:如果是小的桌面系l,则只需要较的SwapI间Q而大的服务器pȝ则视情况不同需要不同大的SwapI间。特别是数据库服务器和Web服务器,随着讉K量的增加Q对SwapI间的要求也会增加,具体配置参见各服务器产品的说明?nbsp;

另外QSwap分区的数量对性能也有很大的媄响。因为Swap交换的操作是盘IO的操作,如果有多?Swap交换区,SwapI间的分配会以轮的方式操作于所有的SwapQ这样会大大均衡IO的负载,加快Swap交换的速度。如果只有一个交换区Q所有的交换操作会交换区变得很忙,使系l大多数旉处于{待状态,效率很低。用性能监视工具׃发现Q此时的CPUq不很忙Q而系l却慢。这说明Q瓶颈在 IO上,依靠提高CPU的速度是解决不了问题的?nbsp;
pȝ性能监视 

SwapI间的分配固然很重要Q而系l运行时的性能监控却更加有价倹{通过性能监视工具Q可以检查系l的各项性能指标Q找到系l性能的瓶颈。本文只介绍一下在Solaris下和Swap相关的一些命令和用途?nbsp;

最常用的是Vmstat命oQ在大多数Unixq_下都有这样一些命令)Q此命o可以查看大多数性能指标?nbsp;

例如Q?nbsp;
# vmstat 3 
procs memory swap io system cpu 
r b w swpd free buff cache si so bi bo in cs us sy id 
0 0 0 0 93880 3304 19372 0 0 10 2 131 10 0 0 99 
0 0 0 0 93880 3304 19372 0 0 0 0 109 8 0 0 100 
0 0 0 0 93880 3304 19372 0 0 0 0 112 6 0 0 100 
............ 

命o说明Q?nbsp;
vmstat 后面的参数指定了性能指标捕获的时间间隔?表示每三U钟捕获一ơ。第一行数据不用看Q没有h|它仅反映开Z来的q_性能。从W二行开始,反映每三U钟之内的系l性能指标。这些性能指标中和Swap有关的包括以下几: 


procs下的w 
它表C当前(三秒钟之内)需要释攑ֆ存、交换出ȝq程数量?nbsp;

memory下的swpd 
它表CZ用的SwapI间的大?nbsp;

Swap下的siQso 
si表示当前Q三U钟之内Q每U交换回内存QSwap inQ的总量Q单位ؓkbytesQso表示当前Q三U钟之内Q每U交换出内存QSwap outQ的总量Q单位ؓkbytes?nbsp;
以上的指标数量越大,表示pȝ忙。这些指标所表现的系l繁忙程度,与系l具体的配置有关。系l管理员应该在^时系l正常运行时Q记下这些指标的数|在系l发生问题的时候,再进行比较,׃很快发现问题Qƈ制定本系l正常运行的标准指标|以供性能监控使用?nbsp;

另外Q用Swapon-s也能单地查看当前Swap资源的用情c例如: 
# swapon -s 
Filename Type Size Used Priority 
/dev/hda9 partition 361420 0 3 

能够方便地看出SwapI间的已用和未用资源的大?nbsp;

应该使Swap负蝲保持?0%以下Q这h能保证系l的良好性能?nbsp;

有关Swap操作的系l命?nbsp;


增加SwapI间Q分以下几步Q?nbsp;
1)成ؓ用户 
$su - root 

2)创徏Swap文g 
# dd if=/dev/zero of=swapfile bs=1024 count=65536 

创徏一个有q箋I间的交换文件?nbsp;

3)ȀzSwap文g 
#/usr/sbin/swapon swapfile 

swapfile指的是上一步创建的交换文g?nbsp;4)现在新加的Swap文g已经起作用了Q但pȝ重新启动以后Qƈ不会C前几步的操作。因此要?etc/fstab文g中记录文件的名字Q和SwapcdQ如Q?nbsp;
/path/swapfile none Swap sw,pri=3 0 0 

5)验Swap文g是否加上 
/usr/sbin/swapon -s 


删除多余的SwapI间?nbsp;
1)成ؓ用户 

2)使用Swapoff命o收回SwapI间?nbsp;
#/usr/sbin/swapoff swapfile 

3)~辑/etc/fstab文gQ去掉此Swap文g的实体?nbsp;

4)从文件系l中回收此文件?nbsp;
#rm swapfile 

5)当然Q如果此SwapI间不是一个文Ӟ而是一个分区,则需创徏一个新的文件系l,再挂接到原来的文件系l上?/p>

Alex 2007-06-18 14:27 发表评论
]]>
ssh timeouthttp://www.oiklr.tw/alex/archive/2006/09/06/68048.htmlAlexAlexWed, 06 Sep 2006 08:07:00 GMThttp://www.oiklr.tw/alex/archive/2006/09/06/68048.htmlhttp://www.oiklr.tw/alex/comments/68048.htmlhttp://www.oiklr.tw/alex/archive/2006/09/06/68048.html#Feedback0http://www.oiklr.tw/alex/comments/commentRss/68048.htmlhttp://www.oiklr.tw/alex/services/trackbacks/68048.htmla: set 'TMOUT=3600' in /etc/profile

fine.


Alex 2006-09-06 16:07 发表评论
]]>
[转]OpenLDAP学习W记http://www.oiklr.tw/alex/archive/2006/08/10/62716.htmlAlexAlexThu, 10 Aug 2006 01:33:00 GMThttp://www.oiklr.tw/alex/archive/2006/08/10/62716.htmlhttp://www.oiklr.tw/alex/comments/62716.htmlhttp://www.oiklr.tw/alex/archive/2006/08/10/62716.html#Feedback0http://www.oiklr.tw/alex/comments/commentRss/62716.htmlhttp://www.oiklr.tw/alex/services/trackbacks/62716.html

发布旉:2004q?4?7?/p>

最q更?2005q?8?8?/p>

Abstract

LDAP (轻量U目录服务访问协议,Lightweight Directory Access Protocol)ZX.500标准Q支持TCP/IPQ用简单方ѝ现在越来越多的|络应用pȝ都支持LDAP。OpenLDAP是LDAP的一U? 开源实玎ͼ本笔记基于OpenLDAP2.1.29?/p>


Chapter 1. 目录服务?/h2>

? 录是一个ؓ查询、浏览和搜烦而优化的专业分布式数据库Q它成树状结构组l数据,好象Linux/Unixpȝ中的文g目录一栗目录数据库和关pL据库 不同Q它有优异的L能Q但写性能差,q且没有事务处理、回滚等复杂功能Q不适于存储修改频繁的数据。所以目录天生是用来查询的,好象它的名字一栗目 录服务是q录数据库和一套访问协议组成的pȝ。类g下的信息适合储存在目录中Q?/p>

  • 企业员工和企业客户之cMh员信息;

  • 公用证书和安全密钥;

  • 邮g地址、网址、IP{电脑信息;

  • 电脑配置信息?/p>

  • ...

1.1. X.500和LDAP

现在国际上的目录服务标准有两个,一个是较早的X.500标准Q一个是较新的LDAP标准?/p>

  • X.500是一个协议族Q由一pd的概念和协议l成Q包括:

    • X.501是模型定义,定义目录服务的基本模型和概念Q?/p>

    • X.509是认证框Ӟ定义如何处理目录服务中客户和服务器认证;

    • X.511是抽象服务定义,定义X.500提供的功能性服务;

    • X.518是分布式操作q程定义Q定义如何跨q_处理目录服务Q?/p>

    • X.519 是协议规范,定义了X.500协议Q包括DAP(Directory Access ProtocolQ目录访问协?、DSP(Directory System ProtocolQ目录系l协?、DOP(Directory Operator ProtocolQ目录操作绑定协?、DISP(Directory Information Shadowing ProtocolQ目录信息阴影协?)Q?/p>

    • X.520定义属性类型要求;

    • X.521定义对象cdQ?/p>

    • X.525定义如果在目录服务器间复制内宏V?/p>

    X.500标准中定义了很多内容Q包括:

    • 定义了信息模型,定目录中信息的格式和字W集Q如何在中表示目录信息(定义对象cR属性等模式)Q?/p>

    • 定义命名I间Q确定对信息q行的组l和引用Q如何组l和命名?目录信息树DIT和层ơ命名模型;

    • 定义功能模型Q确定可以在信息上执行的操作Q?/p>

    • 定义认证框架Q保证目录中信息的安全,如何实现目录中信息的授权保护-讉K控制模型Q?/p>

    • 定义分布操作模型Q确定数据如何分布和如何对分布数据执行操作,如何全局目录树划分ؓ理域,以便理?/p>

    • 定义客户端与服务器之间的通信的各U协议?/p>

    ׃X.500较复杂,且需严格늅OSI七层协议模型。造成应用开发较困难。所以开发了LDAPQ以便在INTERNET上用?/p>

  • LDAP协议?993q获批准Q生LDAPv1版,1997q发布最新的LDAPv3版,该版本是LDAP协议发展的一个里E碑Q它作ؓX.500的简化版提供了很多自有的Ҏ,使LDAP功能更ؓ完备Q具有更强大的生命力?/p>

    LDAP也是一个协议族Q包含以下内容:

    • RFC 2251--LDAPv3核心协议Q定义了LDAPv3协议的基本模型和基本操作Q?/p>

    • RFC 2252--定义LDAPv3基本数据模式(Schema)(包括语法、匹配规则、属性类型和对象c?以及标准的系l数据模式;

    • RFC 2253--定义LDAPv3中的分辩?DN)表达式;

    • RFC 2254--定义了LDAPv3中的qo表达式;

    • RFC 2255--定义LDAPv3l一资源地址的格式;

    • RFC 2256--定义LDAPv3中用X.500的Schema列表Q?/p>

    • RFC 2829--定义了LDAPv3中的认证方式Q?/p>

    • RFC 2830--定义了如何通过扩展使用TLS服务Q?/p>

    • RFC 1823--定义了C的LDAP客户端API开发接口;

    • RFC 2847--定义了LDAP数据导入、导出文件接口LDIF?/p>

    q些协议定义了LDAP的内容,包括Q?/p>

    • 定义了一个信息模型,定了LDAP目录中信息的格式和字W集Q如何表C目录信?定义对象cR属性、匹配规则和语法{模?Q?/p>

    • 定义了命名空_定信息的组l方?-目录树DITQ以DN和RDN为基的命名方式,以及LDAP信息的Internet表示方式Q?/p>

    • 定义了功能模型,定在可以在信息上执行的操作及API?/p>

    • 定义了安全框Ӟ保证目录中信息的安全Q定义匿名、用户名/密码、SASL{多U认证方式,以及与TLSl合的通讯保护框架Q?/p>

    • 定义分布式操作模型,Z指引方式的分布式操作框架Q?/p>

    • 定义了LDAP扩展框架?/p>

1.2. LDAP产品

? 在市Z有关LDAP的品已有很多,各大软g公司都在他们的品中集成了LDAP服务Q如Microsoft的ActiveDirectory? Lotus的Domino Directory、IBM的WebSphere中也集成了LDAP服务。LDAP的开源实现是OpenLDAPQ它比商业品一点也不差Q而且源码开 放?/p>

Chapter 2. OpenLDAP安装W记

2.1. 源码安装

我的安装Ҏ是以源码~译的方式进行的Q以root用户q行安装。安装所需软g如下Q?/p>

具体的安装步骤如下:

  1. ׃openldap需要Berkeley DB来存放数据,所以需先安装Berkeley DB 4.2.52Q可到它的网站下载,|址见上面。运行下面的命o解压Q?/p>

    # tar -zxvf db-4.2.52.tar.gz

    解完压后Q会生成一个db-4.2.52目录,q行该目录下的build_unix目录。执行以下命令进行配|安装?/p>

    # ../dist/configure
    # make
    # make install

    也是按linux源码安装的三步曲完成Q没有什么好说的了。该软g默认是安装在/usr/local/BerkeleyDB.4.2? 录下。安装完成后Q要?usr/local/BerkeleyDB.4.2/lib的库路径加到/etc/ld.so.conf文g内,d完成后执? 一ơldconfigQ配置文g生效。这L译openldap时才能找到相应的库文件。这栯料库安装完成了Q接下来可以安装openldap了? ld.so.conf是什么东西?它就是系l动态链接库的配|文件。此文g?存放着可被LINUX׃n的动态链接库所在目录的名字(pȝ目录/lib, /usr/lib除外)Q各个目录名间以I白字符(I格Q换行等)或冒h逗号分隔。一般的LINUX发行版中Q此文g均含一个共享目? /usr/X11R6/libQؓX windowH口pȝ的动态链接库所在的目录? ldconfig是它的管理命令,具体操作Ҏ可查询man手册Q这里就不细讲了?/p>

  2. 到openldap官方|站下蝲最? 的稳定版源码Qƈ解压。查看INSTALLT 和README文档Q这个很重要Q因为安装方法和一些注意事w在里面有介绍。认真弄明白文档内容能节省你不少的安装调试时间。这也是开源Y件的一个特 点,l用h供了最大的灉|性和可配|性。但也增加了pȝ安装配置的难度,需要有相关的文档配|说明和指导。在官方|站上还有详l的帮助文gQ在整个pȝ 配置中需要经常查询?/p>

    # tar -zxvf openldap-stable-20040329.tgz

    解压完成后,会生成一个openldap-2.1.29目录。进行该目录Q执行以下命令进行配|安装?/p>

    # env CPPFLAGS="-I/usr/local/BerkeleyDB.4.2/include" 
    LDFLAGS="-L/usr/local/BerkeleyDB.4.2/lib" ./configure --prefix=/usr/local/openldap
    --enable-ldbm

    注意以上配置语句Q要讄资料库的include和lib路径Q否则在配置到资料库相关内容时会提示Berkeley DB版本不兼容,q中断配|。如果没?-enable-ldbm选项Q在make test时会提示ldbm找不到。ؓ了减出错,q是加上为好?/p>

    #make depens
    #make
    #make test

    在make test阶段要花费较长时间进行测试,好像?6吧。你可以放松一下,上上|,聊聊天,听听歌,呵呵Q开玩笑了,q个旉应该是最紧张的了。成与不成就看这下的了,如果没问题就可安装了?/p>

    #make install

    通过配置命o可以看出Q我们把openldap安装?usr/local/openldap目录下。徏议以源码安装的Y仉攑ֈ独立的目录下Q不要放到Y仉认的目录。好处是方便理和控Ӟ所有文件在l一的目录下Q卸载Y件只要删除整个目录就可以了?/p>

  3. ? 装完相关软g后就可以着手配|了。Berkeley DB资料库没什么好配置的。主要是配置openldap 服务。配|文件在软g的安装目录的etc/openldap下,有四个文Ӟ主要的是slapd.conf and ldap.confQ其它两个是backup文g。首先,我们先来配置slapd.conf文档。系l默认的slapd.conf文g如下Q?/p>

    # $OpenLDAP: pkg/ldap/servers/slapd/slapd.conf,v 1.23.2.8 2003/05/24 23:19:14 kurt Exp $
    #
    # See slapd.conf(5) for details on configuration options.
    # This file should NOT be world readable.
    #
    include /usr/local/openldap/etc/openldap/schema/core.schema
    #讄schema配置文档包含

    # Define global ACLs to disable default read access.

    # Do not enable referrals until AFTER you have a working directory
    # service AND an understanding of referrals.
    #referral ldap://root.openldap.org

    pidfile /usr/local/openldap/var/slapd.pid
    #讄pid和args文档位置
    argsfile /usr/local/openldap/var/slapd.args

    # Load dynamic backend modules:
    # modulepath /usr/local/openldap/libexec/openldap
    # moduleload back_bdb.la
    # moduleload back_ldap.la
    # moduleload back_ldbm.la
    # moduleload back_passwd.la
    # moduleload back_shell.la

    # Sample security restrictions
    # Require integrity protection (prevent hijacking)
    # Require 112-bit (3DES or better) encryption for updates
    # Require 63-bit encryption for simple bind
    # security ssf=1 update_ssf=112 simple_bind=64

    # Sample access control policy:
    # Root DSE: allow anyone to read it
    # Subschema (sub)entry DSE: allow anyone to read it
    # Other DSEs:
    # Subschema (sub)entry DSE: allow anyone to read it
    # Other DSEs:
    # Allow self write access
    # Allow authenticated users read access
    # Allow anonymous users to authenticate
    # Directives needed to implement policy:
    # access to dn.base="" by * read
    # access to dn.base="cn=Subschema" by * read
    # access to *
    # by self write
    # by users read
    # by anonymous auth
    #
    # if no access controls are present, the default policy is:
    # Allow read by all
    #
    # rootdn can always write!

    #######################################################################
    # ldbm database definitions
    #######################################################################

    database bdb
    #讄使用的资料库Q也可用lbdm?br />suffix "dc=my-domain,dc=com"
    #讄目录后缀
    rootdn "cn=Manager,dc=my-domain,dc=com"
    #讄目录理?br /># Cleartext passwords, especially for the rootdn, should
    # be avoid. See slappasswd(8) and slapd.conf(5) for details.
    # Use of strong authentication encouraged.
    rootpw secret
    #讄理密码Q这里用了明文的“secret”密码。这栯|不安全Q需使用加密的密码,下面会讲到如何设|加密密码?br /># The database directory MUST exist prior to running slapd AND
    # should only be accessible by the slapd and slap tools.
    # Mode 700 recommended.
    directory /usr/local/openldap/var/openldap-data
    #讄资料库\?br /># Indices to maintain
    index objectClass eq
    #讄目录烦?br />

    要服务器正常动作Q要修改一些始初参数和讄Q修改后的配|文档如下:

    # $OpenLDAP: pkg/ldap/servers/slapd/slapd.conf,v 1.23.2.8 2003/05/24 23:19:14 kurt Exp $
    #
    # See slapd.conf(5) for details on configuration options.
    # This file should NOT be world readable.
    #
    #Z有效使用目录服务Q包含相关的文g。注意,在包含文件时是要按一定顺序的Q因?br />#文g里的属性存在依赖关pR如果顺序不对,服务器启动不了,文档间的依赖关系在文?br />#中都有说明,请仔l查看一下。如果懒得看也可以按我的序?br />include /usr/local/openldap/etc/openldap/schema/core.schema
    include /usr/local/openldap/etc/openldap/schema/corba.schema
    include /usr/local/openldap/etc/openldap/schema/cosine.schema
    include /usr/local/openldap/etc/openldap/schema/inetorgperson.schema
    include /usr/local/openldap/etc/openldap/schema/misc.schema
    include /usr/local/openldap/etc/openldap/schema/openldap.schema
    include /usr/local/openldap/etc/openldap/schema/nis.schema
    include /usr/local/openldap/etc/openldap/schema/samba.schema
    # Define global ACLs to disable default read access.

    # Do not enable referrals until AFTER you have a working directory
    # service AND an understanding of referrals.
    #referral ldap://root.openldap.org

    pidfile /usr/local/openldap/var/slapd.pid
    argsfile /usr/local/openldap/var/slapd.args

    loglevel 1
    #增加了日志功能,需修改syslog配置文gQ在文g中增加一:local4.* /var/log/ldap.log日志U别定义可查相官方网站的文档?br />#1U记录的信息很多Q可用于调试?br /># Load dynamic backend modules:
    # modulepath /usr/local/openldap/libexec/openldap
    # moduleload back_bdb.la
    # moduleload back_ldap.la
    # moduleload back_ldbm.la
    # moduleload back_passwd.la
    # moduleload back_shell.la

    # Sample security restrictions
    # Require integrity protection (prevent hijacking)
    # Require 112-bit (3DES or better) encryption for updates
    # Require 63-bit encryption for simple bind
    # security ssf=1 update_ssf=112 simple_bind=64

    # Sample access control policy:
    # Root DSE: allow anyone to read it
    # Subschema (sub)entry DSE: allow anyone to read it
    # Other DSEs:
    # Allow self write access
    # Allow authenticated users read access
    # Allow anonymous users to authenticate
    # Directives needed to implement policy:
    # access to dn.base="" by * read
    # access to dn.base="cn=Subschema" by * read
    # access to *
    # by self write
    # by users read
    # by anonymous auth
    #
    # if no access controls are present, the default policy is:
    # Allow read by all
    #
    # rootdn can always write!

    #######################################################################
    # ldbm database definitions
    #######################################################################

    database bdb
    suffix "dc=it,dc=com"
    #Ҏ你自已的目录后缀Q?br />rootdn "cn=root,dc=it,dc=com"
    #讄root为管理员Q与linux的root没有什么关pR?br /># Cleartext passwords, especially for the rootdn, should
    # be avoid. See slappasswd(8) and slapd.conf(5) for details.
    # Use of strong authentication encouraged.
    rootpw {MD5}mjkiuPt0wXhpxxkdiOOO+0000000AKq0by
    #讄root密码Q用MD5加密。密码串用slappasswd -h {MD5}指o生成
    # The database directory MUST exist prior to running slapd AND
    # should only be accessible by the slapd and slap tools.
    # Mode 700 recommended.
    directory /usr/local/openldap/var/openldap-data
    # Indices to maintain
    index objectClass eq
    #q里可根据你的需要设|相关烦引,以加快查询速度。具体内容可查询官方|站理手册?br />
    #ACL configure以下内容定义讉K控制
    access to attr=userPassworduserPassword
    #只能p已修改,有效验证用户查询?br /> by self write
    by anonymous auth
    access to attr=mail
    by dn="cn=root,dc=it,dc=tigerhead" writemail
    #只能p已修改,有效验证用户查询?br /> by self write
    by anonymous auth
    access to dn=".*,dc=it,dc=tigerhead"
    #允许所有h查询没受控制讉K限制的信息?br /> by self write
    by * read

    到现在ؓ止,服务器基本就配置完成了,可以启动了,服务器程序是位于安装目录的libexec下的slapdE序。注意,不是 sldap哦。okQ到现在为止Q服务器基本配|完成了Q可以启动了Q服务器E序是位于安装目录的libexec下的slapdE序。注意,不是 sldap哦。启动服务器执行以下命oQ?/p>

    # ./slapd

    如果没有提示什么出错信息,直接q回shell状态,p明服务器正常启动了,你可以查询日志或用ps -aux查看。或用以下命令查询服务器:

    ldapsearch -x -b '' -s base '(objectclass=*)' namingContexts

    如果命o执行成功Q返回一些信息,则说明服务器正常q行了。如果启动不成功Q它会提CZ些出错信息,多数是slapd.conf配置出错。回头仔l核查一下配|文档?/p>

  4. 客户端配|文档是ldap.conf。该文档相当单,其实不用配置也能正常操作?/p>

    # $OpenLDAP: pkg/ldap/libraries/libldap/ldap.conf,v 1.9 2000/09/04 19:57:01 kurt Exp $
    #
    # LDAP Defaults
    #

    # See ldap.conf(5) for details
    # This file should be world readable but not world writable.

    BASE dc=it, dc=com讄目录L
    #URI ldap://ldap.example.com ldap://ldap-master.example.com:666

    #SIZELIMIT 12
    #TIMELIMIT 15
    #DEREF never

2.2. 数据录入

? 务器正常q作后,可以录入信息了。信息的录入有三U方法,一U是手工录入Q一U是.ldif文g格式录入Q一U是脚本自动录入。我们先从最基础的手工录 入方式开始介l,了解录入信息的格式。明白了手工录入的格式,其它两种方式都很Ҏ明白。信息录入用到ldapaddq个E序。可在安装目录的bin目录 下找到?/p>

2.2.1. 手动录入Ҏ

  • W一步是要徏立DNQ?/p>

    # ldapadd -x -D 'cn=root,dc=it,dc=com' -W
    dn: dc=it,dc=com
    objectClass: dcObject
    objectClass: organization
    dc: it
    o: Corporation
    description: d Corporation
    注意Q如果你用复?_脓功能把以上内Ҏ贝过去,一定要注意每行后面不要有空|q是手工输入Q按Ctrl+d存盘?br />
  • W二步是建立RDN:

    # ldapadd -x -D 'cn=root,dc=it,dc=com' -W        
    #-x表示用简单验证,-D表示指定目录Q?W表示弹出密码输入提示

    输入密码Q这里的密码是在配置文g中rootpw设|的密码Q不是操作系l中root用户的密码。验证通过后就可输入以下内容:

    dn: uid=qq,dc=it,dc=com
    objectClass: person
    objectClass: organizationalPerson
    objectClass: inetOrgPerson
    uid: qq
    cn: qq
    sn: qq
    telephoneNumber: 138888888
    description: openldap test
    telexNumber: tex-8888888
    street: my street
    postOfficeBox: postofficebox
    displayName: qqdisplay
    homePhone: home1111111
    mobile: mobile99999
    mail:qq@qq.com

    输入完所有信息后Q按Ctrl+dl束存盘。如果出现出错信息,h一下对象类和属性的对应关系有没有错或输入失误。初学者就Ҏ出错 的地Ҏ对象cd属性的对应关系没有处理好。对象类和属性是在schema文档中定义的。它们之间的关系是这LQ对象类中有些属性是必选的Q有些属性是 可选的。录入信息的属性必d对象cM有定义才能用?/p>

输入以下命o可查询到刚才输入的信息?/p>

# ldapsearch -x -b 'dc=it,dc=com'            
-b选项是设|目录v点,如果讄了客L的BASE配置参数Q该可不用?br />

如果按以上配|文件设|了aclQ用上面的查询命令是查询不到受保护的内容的。如上面的userPassword and mail。要查询到这些受限内容,需要通过验证才可以:

# ldapsearch -x -LLL -h it.com -b 'dc=it,dc=com' -D 'uid=qq,dc=it,dc=com' -W 'uid=qq'
接着提示输入密码。输入userPassword的密码回车,所有信息就都出来了?br />

2.2.2. 文g方式

.ldif文g方式也就是把以上手工输入的内容先写入一?ldif文g中,然后Q用ldapadd命o?f参数导入?/p>

# ldapadd -x -D "cn=root,dc=it,dc=com" -W -f test.ldif

一个完整的global.ldif文g例子Q?/p>

dn: dc=info, dc=net
objectClass: top
objectClass: organization
o: info.net

dn: ou=People, dc=info, dc=net
objectClass: top
objectClass: organizationalUnit
ou: People
description: User Info

dn: cn=Admin, dc=info, dc=net
objectClass: top
objectClass: person
objectClass: organizationalPerson
cn: Admin
sn: Admin
userPassword: Admin
description: Administrator for info.net

dn: id=1, ou=People, dc=info, dc=net
objectclass: top
objectclass: InfoPerson
id: 1
username: 张三
tel:021-63138990
card_id:ABC001

我们也可用slapadd命o来导入数据。该命o可以导入包含一些系l信息的ldif文gQ如Q?/p>

dn: dc=it,dc=com
objectClass: top
objectClass: dcObject
objectClass: organization
dc: it
structuralObjectClass: organization
entryUUID: d97b06da-d77e-1028-9866-d4ec7ac00d12
creatorsName: cn=anonymous #pȝ信息
createTimestamp: 20041201005115Z #pȝ信息
o:: 5bm/5bee5biC6JmO5aS055S15rGg6ZuG5Zui5pyJ6ZmQ5YWs5Y+4
userPassword:: e01ENX14TXBDT0tDNUk0SU56RkNhYjNXRW13PT0=
entryCSN: 2004120603:50:08Z#0x0001#0#0000 #pȝ信息
modifiersName: cn=admin,dc=it,dc=com #pȝ信息
modifyTimestamp: 20041206035008Z #pȝ信息
[Note]
再次提醒Q注意每行后面不要留有空根{?/td>

2.2.3. 脚本方式

脚本录入方式需要自已编写脚本,或到|上下蝲。有一个用PHP写的LDAP理工具不错Q叫phpLDAPadmin。可以到以下|址下蝲Q?a href="http://phpldapadmin.sourceforge.net/" target="_top">http://phpldapadmin.sourceforge.net。安装方法也很简单,只要解压出来Q拷贝到apache的web目录下,按说明配|一下设定文?ok了?/p>

2.3. 常用命o介绍

接着为大家介l一下几个常用的ldap命oQ如果你用了phpLDAPadminE序Q其实它已经有一个很好的囑Ş介面帮你完成q些命o了。但了解一下还是对你还是很有益的,因ؓ命oҎ才是最Ҏ的?/p>

  • 删除命oldapdelete

    # ldapdelete -x -D 'cn=root,dc=it,dc=com' -W 'uid=qq1,dc=it,dc=com'
  • 重新索引ldap数据库命令slapindex

    # slapindex -f slapd.conf
  • 讄使用者密码,当然了,你的用户需要有userPassword了?/p>

    #ldappasswd -x -D "cn=root,dc=it,dc=com" -W "uid=qq1,dc=it,dc=com" -S 
    New password:
    Re-enter new password:
    Enter bind password:
    Result: Success (0)
    [Note]
    "Enter bind password" ?"cn=root,dc=it,dc=com"理员的密码?/td>
  • 理员密码更?

    #slappasswd 
    New password
    Re-enter new password
    {SSHA}83DJ4KVwqlk1uh9k2uDb8+NT1U4RgkEs

    接下再拷贝到 path/to/sldap.conf ?rootpw 卛_,重启使用配置文g生效

  • 通过ldapmodify修改目录内容

    # ldapmodify -x -D "cn=root,dc=it,dc=com" -W -f modify.ldif

    通过ldif文g修改ldap数据Qldif文g格式如下Q?/p>

    dn: cn=qq,dc=it,dc=com
    changetype: modify
    replace: mail
    mail: modme@example.com
    -
    add: title
    title: Grand Poobah
    -
    add: jpegPhoto
    jpegPhoto:< file:///tmp/modme.jpeg
    -
    delete: description
    -

2.4. 启用sasl验证

前提是你在系l中安装了sasl认证库,q在~译openldap时支持它Q默认就支持了。到http://asg.web.cmu.edu/cyrus下蝲。安装方法见我写的sendmail安装W记。安装好之后Q需要在sasl中徏立相应的帐号Q用以下命o可完成?/p>

# saslpasswd2 -c test

接着配置slapd.conf文gQ加入以下内宏V?/p>

sasl-regexp
uid=(.*),cn=.*,cn=auth
uid=$1,dc=it,dc=com

重启服务器配置文g生效。这个配|是最大权限的配置Q如果要l化h阅相x档。用以下命o试?/p>

# ldapsearch -U qq  -b 'uid=qq,dc=it,dc=com' -D 'dc=it,dc=com' -Y DIGEST-MD5

采用digest-md5验证,提示密码Q输入saslpasswd2的密码?/p>

2.5. 配置服务器复?/h2>

? 一些关键的应用场合Q我们需讄多个ldap服务器实例,且数据要保持同步。当一台服务器出现故障或被黑客dӞ我们pl箋保持应用的正常运行。通过 DNS的轮查询功能,q能实现服务器的负蝲均衡Q提高响应速度。在openldap中有一个slurpdq程Q利用slurpdq程可帮助我们实现多? ldap服务器数据的同步功能。下面简单介l一下主、从ldap服务器的配置?/p>

slurpdq行在主服务器上Q它能把L务器上的变化通过 LDAP协议传送到从服务器上。从服务器上的变化不能传送到L务器上,也就是说是单向同步的。主从服务器的版本最好一P以减兼Ҏ问题。主从服务器 的安装方法是一LQ关键是配置文g有所不同。我的操作系l是debian sargeQ在保M服务器能正常q行的前提下q行以下配置Q?/p>

  • 首先Q把M服务器关闭。通过以下三步操作静态同步主从服务器上的数据Q?/p>

    1. 把主服务器上/var/lib/ldap目录下的所有数据库文g全部拯C服务器的同目录中Q覆盖原有文件?/p>

    2. 把主服务器上?etc/ldap/schema目录下的所有schema文g拯C服务器的同目录中Q覆盖原有文件?/p>

    3. 把主服务器上/etc/ldap/slapd.conf文g拯C服务器的同目录中Q覆盖原有文件?/p>

  • 配置L务器上的slapd.conf文gQ取消replogfile指o前的注释W号Q取消后的结果如下:

    # Where to store the replica logs for database #1
    replogfile /var/lib/ldap/replog

    增加replica指oQ如Q?/p>

    #replace config
    replica uri=ldap://192.168.6.195:389 #指定从服务器L名和端口?br /> binddn="cn=admin,dc=com" #指定需同步的DN的管理员
    bindmethod=simple credentials=1 #指定验证方式和需同步的DN的管理员密码
  • 配置从服务器上的slapd.conf文gQ增加updatedn指oQ如Q?/p>

    updatedn "cn=admin,dc=com"          #与主服务器的binddn对应

    在从服务器的配置文g中,不要包含replica和replogfile指o?/p>

  • 先启动主服务器的slapd和slurpdQ再启动从服务器的slapd?/p>

配置完成后,我们可测试一下,在主服务器上修改一个目录项Q在从服务器上可查看目录的数据已同步?/p>

Chapter 3. 理工具

开源的目录服务理工具有很多,包括phpldapadminQgqQCPUQJXplore{。这些工具可帮助我们方便l护目录服务器上的数据。这些工具各有优~点Q下面简要介l一下,详细的内容可参考相关的官方|站?/p>

3.1. phpldapadmin

3.2. gq

3.3. CPU

3.4. JXplore

3.5. LAM

官方|站Q?a href="http://lam.sourceforge.net/index.htm" target="_top">http://lam.sourceforge.net/index.htm

Chapter 4. HowTo

4.1. 止整个服务器的匿名讉K

在slapd.conf配置文g中加入disallow bind_anon卛_?/p>




Alex 2006-08-10 09:33 发表评论
]]>
[转]使用 OpenLDAP 集中理用户帐号http://www.oiklr.tw/alex/archive/2006/08/10/62714.htmlAlexAlexThu, 10 Aug 2006 01:19:00 GMThttp://www.oiklr.tw/alex/archive/2006/08/10/62714.htmlhttp://www.oiklr.tw/alex/comments/62714.htmlhttp://www.oiklr.tw/alex/archive/2006/08/10/62714.html#Feedback0http://www.oiklr.tw/alex/comments/commentRss/62714.htmlhttp://www.oiklr.tw/alex/services/trackbacks/62714.html

2006 q? 6 ? 26 ?/p>

使用轻量U目录访问协议(LDAPQ构建集中的w䆾验证pȝ可以减少理? 本,增强安全性,避免数据复制的问题,q提高数据的一致性。随着 Linux] 的不断成熟,已经出现了很多工L来简化用户帐号信息到 LDAP 目录的迁UR还开发了一些工L来在客户机和目录服务器之间启用加密通信配置Qƈ通过复制提供定w性。本文将向您展示如何配置服务器和客户机在 Red Hat Linux 上?OpenLDAP?/blockquote>

?/span>

Linux 发行版中提供?OpenLDAP 软g按照一个客h/服务器模型实C轻量U目录访问协议(LDAPQ。LDAP 的设计目的是提供一U有效的Ҏ来查扑֒理信息。OpenLDAP 软g和包提供了创建目录信息树Q一个主要进行读操作的数据库Q的工具。本文向您展C如何存储用L帐号信息Qƈ修改w䆾验证服务来?LDAP 获取所需要的信息。内部细节ƈ不重要,因ؓq些工具可以数据库的内容以文本格式QLDAP 数据交换格式QLDIFQ呈现在您的面前?/p>

LDAP 信息被组l成属性和值的l合Q称?条目QentryQ?/i>。条目可能会h必须的属性或可选属性。一个条目的属性必要遵@ /etc/openldap/schema/ 模式文g中定义的规则。规则包含在条目?objectclass 属性中。看一下下面的关系Q我们可以看?posixAccount objectclass 中包含了密码文g条目的信息(posixAccount userPassword 是文件条目的 base64 ~码Q?/p>
?1. LDAP 目录条目?Linux 密码文g之间的关p?/b>
LDAP 目录条目?Linux 密码文g之间的关p? src=

文g /etc/openldap/schema/nis.schema ?posixAccount 对象cM的条目定义了所有的属性和 objectclass。例如,下面是对 uidNumber 属性的描述Q?/p>

attributetype ( 1.3.6.1.1.1.1.0 NAME 'uidNumber'
DESC 'An integer uniquely identifying a user in an administrative domain'
EQUALITY integerMatch
SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )

所有的属性类型都已经定义了,它们被收集到 posixAccount objectclass 中。例如:

objectclass ( 1.3.6.1.1.1.2.0 NAME 'posixAccount' SUP top AUXILIARY
DESC 'Abstraction of an account with POSIX attributes'
MUST ( cn $ uid $ uidNumber $ gidNumber $ homeDirectory )
MAY ( userPassword $ loginShell $ gecos $ description ) )

ldapuser 条目h一个识别名属?dnQ它用作用户名,q与 userPassword 一L来在 LDAP 目录中记录信息,或与 LDAP 目录l定在一起用?/p>

LDAP Z为容器用的Ҏ条目提供了将q些条目l织成树l构的功能。在q个例子中,我们用一个容?People 保存用户帐号信息Q用另外一个容?Groups 保存l帐号信息。所生成的目录信息树如图 2 所C?/p>
?2. 用户帐号信息使用的目录信息树
用户帐号信息使用的目录信息树

让我们来看一下如何配|?OpenLDAP 服务器,如何信息从pȝ文gq移?LDAP 目录中,如何配置 OpenLDAP 客户机通过 LDAP 对用戯行n份验证。在使用一个集中的w䆾验证数据库时Q应该通过使用复制技术采用第二个 LDAP 服务器提供高可用性,q样在主服务器出现问题时Q就可以使用W二?LDAP 服务器响应客h的请求。由于诸如密码之cȝw䆾验证数据会通过|络q行传输Q因此希望?TSL 协议建立加密通信q接?/p>

我们?OpenLDAP 服务器和客户机都是虚拟机Q上面运行的?Red Hat Enterprise Linux AS release 4QNahant Update 1Q。在我们的例子中使用??1 所列出的系l。如果想模仿q些例子Q请使用适合您自q讄?/p>
?1. pȝ|络信息
角色L?/th>IP 地址
OpenLDAP L务器dhcp64-233.ibm.com9.47.64.233
OpenLDAP 从服务器dhcp64-253.ibm.com9.47.64.253
OpenLDAP 客户?/td>dhcp64-251.ibm.com9.47.64.251





回页?/b>


配置 LDAP 服务?/span>

我们使用 Red Hat Enterprise Linux release 4 Update 1 上的包来构徏服务器:

  • openldap-2.2.13-2Q包?OpenLDAP 配置文g、库和文?/li>
  • openldap-servers-2.2.13-2Q包?slapd ?slurpd 服务器、迁U脚本和相关文g
  • openldap-clients-2.2.13-2Q包含客hE序Q用来访问和修改 OpenLDAP 目录

OpenLDAP 包在服务器上安装了很多程序:

  • 守护q程Q?
    • slapdQ主 LDAP 服务?/li>
    • slurpdQ负责与复制 LDAP 服务器保持同步的服务?/li>
  • 对网l上的目录进行操作的客户机程序。下面这两个E序是一对儿Q?
    • ldapaddQ打开一个到 LDAP 服务器的q接Q绑定、修Ҏ增加条目
    • ldapsearchQ打开一个到 LDAP 服务器的q接Q绑定ƈ使用指定的参数进行搜?/li>
  • Ҏ地系l上的数据库q行操作的几个程序:
    • slapaddQ将?LDAP 目录交换格式QLDIFQ指定的条目d?LDAP 数据库中
    • slapcatQ打开 LDAP 数据库,q将对应的条目输Zؓ LDIF 格式

OpenLDAP 的主要服务器配置文g?/etc/openldap/slapd.conf。本例所使用的完?slapd.conf 文g?清单 18 所C。slapd.conf 文g中包括一pd全局配置选项Q它们作Z个整体应用到 slapd 上面Q后面是包含数据库特有信息的数据库后端定义。如果一行内Ҏ以空格开始的Q就认ؓ它是上一行的延箋。空行和???字符开头的注释行都会被忽略?/p>

如果您正把本文当作练习来做,那就可以按照下面指定的方式进行修改,从而启?LDAP 服务器。一旦确认服务器正常工作之后Q就可以d复制功能Q然后再d安全性支持。首先是全局配置信息D늚讄。其中每个选项的值都是我们想要的?/p>

正如上面介绍的一P信息被组l成属性和值的l合Q称为条目。条目属性必遵循的规则是?objectclass 专用属性进行组l的Q这可以?/etc/openldap/schema/ 模式文g中找到。对于n份验证来_需要用在 nis.schema 中定义的 posixAccount ?shadowAccount objectclassesQ?/p>

include /etc/openldap/schema/nis.schema

loglevel 行设|的是日志选项。可以将其设|ؓq样的别:调试语句和操作统计信息都会被记录?/var/log/slapd.log 中。日志别是累加的:296 = 256 日志q接/操作/l果 + 32 搜烦qo器处?+ 8 q接理Q?/p>

loglevel 296

日志信息会被记录?syslogd LOG_LOCAL4 机制中。还需要将下面的内Ҏ加到 /etc/syslog.conf 中,q让 syslogd 重新d自己的配|文Ӟ

local4.debug /var/log/slapd.log

access 行定义了谁可以访问目录中的内宏V我们希望用户可以修改自q密码Qƈ更新自己?shadow 信息来反映密码的变化。希望n份验证程序能够检索用L密码。还希望用户能够d所有其他条目。注意密码条目是不可ȝQshadow 属性的惟一用处是理密码的过期问题?/p>

access to attrs=shadowLastChange,userPassword
by self write
by * auth

access to *
by * read

接下来,?database 部分Q要定义下面的内宏V?/p>

使用新的 bdb 后端数据库:

database bdb

指定后端数据库需要响应的查询?DN 前缀。ؓ了确保惟一性,根前~应该从自q|络域名构徏出来。在本例的情况中Q它?.dc=svc,dc=beaverton,dc=ibm,dc=com.Q但是在下面的例子中我们对其q行了简化:

suffix "dc=ibm,dc=com"

指定理 DNQ它不用于访问控制或限制数据库的操作。也不需要在目录中ؓq个 DN 指定一个条目。ؓh rootpw 密码的管理员使用 DN 可以跌 ACL 规则中的所有访问控Ӟ

rootdn "cn=Manager,dc=ibm,dc=com"
rootpw {MD5}ijFYNcSNctBYg

q就是我们现在想要设|的选项。稍后将q回 slapd.conf 文g来配|复Ӟ然后在配|安全性?/p>

现在Q我们希望将数据d到目录中Qƈ认可以讉Kq些信息。要实现q种功能Q需要配|服务器来?ldap 客户机工P例如 ldapadd ?ldapsearch。ldap 客户机工L配置文g? /etc/openldap/ldap.conf。我们用的q个文g的完整列表如本文末尾?清单 19 所C。要?ldap 服务器上q行q些工具Q只需要将该行修改成下面的内容Q?/p>

BASE dc=ibm,dc=com

讄启动脚本在?2? ?5 时启?LDAPQ?/p>
清单 1. 讄启动q行U别
# chkconfig --levels 235 ldap on

从命令行中启动服务:


清单 2. 启动服务
# service ldap start
Starting slapd: [ OK ]

OpenLDAP 守护q程 slapd 应该已经q行了:


清单 3. 查服务正在运?/b>
# ps -ef | grep slap
ldap 13521 1 0 Oct24 ? 00:00:00 /usr/sbin/slapd -u ldap -h ldap:/// ldaps:///

ldapsearch -x 命o应该可以成功完成Q但不会q回M数据?/p>



回页?/b>


q移密码?shadow 信息

Red Hat 所提供?openldap-servers 包包?PADL Software Pty Ltd. 公司? MigrationTools 工具。我们将使用q些工具数据从 Linux pȝ文gQ例?/etc/group ? /etc/passwordQ{换成 LDAP LDIF 格式Q这是数据库信息的一U文本格式的表示。这U格式是行界定、冒号分隔的属?值对?/p>

有一l?Perl 脚本被安装到 /usr/share/openldap/migration/ 中执行迁UR这?Perl 脚本的配|信息包含在 migrate_common.ph 文g的开头。对于我们的目的来说Q只需要修改命名前~的变量来使用条目的识别名p够了Q如下所C:

$DEFAULT_BASE = "dc=ibm,dc=com"

在进行这些修改之后,误行脚?migrate_base.plQ它会创建根,qؓ Hosts、Networks、Group ?People {创Z一U的l织单元Q?/p>
清单 4. q行 migrate_base.pl
# migrate_base.pl > base.ldif

~辑 base.ldifQ删除除下面之外的所有条目:


清单 5. base.ldif 条目
# cat base.ldif
dn: dc=ibm,dc=com
dc: ibm
objectClass: top
objectClass: domain

dn: ou=People,dc=ibm,dc=com
ou: People
objectClass: top
objectClass: organizationalUnit

dn: ou=Group,dc=ibm,dc=com
ou: Group
objectClass: top
objectClass: organizationalUnit

?LDAP 服务器上Q?OpenLDAP 客户机工?ldapadd 以下条目插入到数据库中。简单n份验证必要使用 -x 选项指定。在 slapd.conf 中定义的 rootdn w䆾验证识别名是 “cn=Manager,dc=ibm,dc=com”。对于简单n份验证来_必须使用密码。选项 -W 强制提示输入密码。这个密码就是在 slapd.conf 文g中指定的 rootpw 参数的倹{包含这些条目的 LDIF 文g是?-f 选项指定的:


清单 6. 使用 ldapadd 插入条目
# ldapadd -x -D "cn=Manager,dc=ibm,dc=com" -W -f base.ldif

接下来,?/etc/group 中迁U?ldapuser l:


清单 7. q移 ldapuser l?/b>
# grep ldapuser /etc/group > group.in
# ./migrate_group.pl group.in > group.ldif

# cat group.ldif
dn: cn=ldapuser,ou=Group,dc=ibm,dc=com
objectClass: posixGroup
objectClass: top
cn: ldapuser
userPassword: {crypt}x
gidNumber: 500

# ldapadd -x -D "cn=Manager,dc=ibm,dc=com" -W -f group.ldif

最后,?/etc/passwd ?/etc/shadow 中迁U?ldapuser 的信息:


清单 8. q移 ldapuser 信息
# grep ldapuser /etc/passwd > passwd.in
# ./migrate_passwd.pl passwd.in > passwd.ldif

# cat passwd.ldif
dn: uid=ldapuser,ou=People,dc=ibm,dc=com
uid: ldapuser
cn: ldapuser
objectClass: account
objectClass: posixAccount
objectClass: top
objectClass: shadowAccount
userPassword: {crypt$1$TeOlOcMc$cpQaa0WpLSFRC1HIHW5bt1
shadowLastChange: 13048
shadowMax: 99999
shadowWarning: 7
loginShell: /bin/bash
uidNumber: 500
gidNumber: 500
homeDirectory: /home/ldapuser
gecos: ldapuser

# ldapadd -x -D "cn=Manager,dc=ibm,dc=com" -W -f passwd.ldif

现在查已l添加到数据库中的信息。清?9 l出了全部输出结果:


清单 9. ?LDIF 格式填充?OpenLDAP 数据?/b>
# ldapsearch -x

# extended LDIF
#
# LDAPv3
# base <> with scope sub
# filter: (objectclass=*)
# requesting: ALL
#

# ibm.com
dn: dc=ibm,dc=com
dc: ibm
objectClass: top
objectClass: domain

# People, ibm.com
dn: ou=People,dc=ibm,dc=com
ou: People
objectClass: top
objectClass: organizationalUnit

# Group, ibm.com
dn: ou=Group,dc=ibm,dc=com
ou: Group
objectClass: top
objectClass: organizationalUnit

# ldapuser, Group, ibm.com
dn: cn=ldapuser,ou=Group,dc=ibm,dc=com
objectClass: posixGroup
objectClass: top
cn: ldapuser
gidNumber: 500

# ldapuser, People, ibm.com
dn: uid=ldapuser,ou=People,dc=ibm,dc=com
uid: ldapuser
cn: ldapuser
objectClass: account
objectClass: posixAccount
objectClass: top
objectClass: shadowAccount
shadowMax: 99999
shadowWarning: 7
loginShell: /bin/bash
uidNumber: 500
gidNumber: 500
homeDirectory: /home/ldapuser
gecos: test2

# search result
search: 2
result: 0 Success

# numResponses: 6
# numEntries: 5





回页?/b>


配置 LDAP 客户?/span>

用来讄客户机的 Red Hat Enterprise Linux release 4 Update 1 包包括:

  • nss_ldap-226-6Q包括两?LDAP 讉K客户机:nss_ldap ?pam_ldap
    • nss_ldap 是一l?C 库扩展,它允?LDAP 目录服务器用作一个用户和l信息的L
    • pam_ldap 是一?Linux-PAM 模块Q它支持w䆾验证功能

LDAP w䆾验证要想正确地工作,需要配|两个服务:pȝ命名服务和n份验证服务?/p>

pȝ命名服务QNSSQ需要配|ؓ使用 LDAP 来解析诸如用户和l帐号之cȝ资源。例如,在运行命?ls -l Ӟ如果某个文g inode l出文g的所有者是 “user 501”,那么命名服务需要将 “uid 501?解析成用户名Qƈ?ls 命o输出l果中输出。通常来说Q这是通过查找 /etc/passwd 文g中的所有用户帐号实现的。由于用L在都存储?LDAP 目录中,因此pȝ需要配|成同时?passwd 文g?LDAP 目录中的帐号q行解析。这U功能是通过 /usr/lib/libnss_ldap.so 库提供的?/p>

w䆾验证服务是实际向 LDAP 验证用户w䆾的服务。可插入w䆾验证模块QPAMQ提供了本地 Linux w䆾验证服务。下面我们将配置 PAM 先对本地?/etc/passwd 文g查用户帐P然后再对 LDAP 服务器进行检查。PAM LDAP 模块可以用来n份验证重定向?LDAP 目录上?lib/security/pam_ldap.so PAM 模块提供?LDAP w䆾验证功能?/p>

w䆾验证本n是由 PAM E序执行的,它从w䆾验证候选机制中获取用户名,其l定?OpenLDAP 服务器上Q检索与q个 uid 条目Q用户名条目Q相关的 DNQ从w䆾验证候选机制中获取密码Q然后用这?DN 和密码试囑ְ其绑定到 OpenLDAP 服务器上。如果绑定成功,PAM 会报告说q个用户已经成功通过?pam_ldap.so 提供的n份验证测试。根?PAM 的配|不同,在用L到命令行提示W之前可能会执行其他试?/p>

我们可以采用两种Ҏ来配|?LDAP 客户机。一U快速而简单的Ҏ是运? /usr/sbin/authconfigQƈ在两个屏q中输入信息。另外一U方法是通过~辑客户?LDAP 配置文g /etc/ldap.confQ然后修?/etc/nsswitch.conf?etc/sysconfig/authconfig ? /etc/pam.d/system-auth。首先让我们来看一下如何运?authconfig?/p>

如图 3 所C行选择Q然后点?Next?/p>
?3. 执行 authconfig 命o的第一个页?/b>
执行 authconfig 命o的第一个页? src=

在如?4 所C的W二个屏q中输入对应的信息,然后点击 OK?/p>
?4. 执行 authconfig 命o的第二个面
执行 authconfig 命o的第二个面

要手工配|?OpenLDAP 客户机,请遵循下面的步骤?/p>

用来跟踪特定w䆾验证机制是否已经启用的文件是 /etc/sysconfig/。我们可以希望以下条目的值都?“yes”:

USELDAP=yes
USELDAPAUTH=yes
USEMD5=yes
USESHADOW=yes
USELOCAUTHORIZE=yes

PAM ?NSS 模块使用的基本配|文件是 /etc/ldap.conf。host 选项指定 LDAP 服务器,base 选项指定q个目录使用?DNQ最初我们希望关闭加密功能:

host dhcp64-233.ibm.com
base dc=ibm,dc=com
ssl off

要让 NSS 服务使用 OpenLDAP 服务器,需要将 “ldap?d?/etc/nsswitch.conf 文g?passwd、shadow ?group 行中Q如下所C:

passwd: files ldap
shadow: files ldap
group: files ldap

要让 PAM w䆾验证服务使用 OpenLDAP 服务器,请将 pam_ldap 行加入到 /etc/pam.d/system-auth 中,位置在对应的标准 pam_unix.so 条目之后。尽其他设|也可以实现相同的结果,但是我用下面的文g讄Q?/p>

auth required /lib/security/$ISA/pam_env.so
auth sufficient /lib/security/$ISA/pam_unix.so likeauth nullok
auth sufficient /lib/security/$ISA/pam_ldap.so use_first_pass
auth required /lib/security/$ISA/pam_deny.so

account required /lib/security/$ISA/pam_unix.so broken_shadow
account sufficient /lib/security/$ISA/pam_localuser.so
account sufficient /lib/security/$ISA/pam_succeed_if.so uid %lt; 100 quiet
account [default=bad success=ok user_unknown=ignore] /lib/security/$ISA/pam_ldap.so
account required /lib/security/$ISA/pam_permit.so

password requisite /lib/security/$ISA/pam_cracklib.so retry=3
password sufficient /lib/security/$ISA/pam_unix.so nullok use_authtok md5 shadow
password sufficient /lib/security/$ISA/pam_ldap.so use_authtok
password required /lib/security/$ISA/pam_deny.so

session required /lib/security/$ISA/pam_limits.so
session required /lib/security/$ISA/pam_unix.so
session optional /lib/security/$ISA/pam_ldap.so

现在Q用户帐号信息可以从客户机系l中删除q从 LDAP 目录中进行获取了。当用户试图d客户机系l时QPAM w䆾验证服务׃从用户那里获取用户名Q在我们的例子中?ldapuser。PAM 会从 LDAP 服务器中索识别名QDNQ条?.dn: uid=ldapuser, ou=People, dc=ibm, dc=com.。PAM 然后会从用户那里获取密码。然?PAM 试图使用q个 DN 和密码与 LDAP 服务器进行绑定。DN 和密码都以正文文本的格式发送给 LDAP 服务器。在对密码进行散列操作之后,如果服务器可以让用户dQ就会向 PAM 报告说已l成功进行了l定。成功绑定可以完全满?PAM ? pam_ldap 模块汇报成功的标准,如果所有其?PAM 标准都已l满了Q那么就允许用户d到系l中?/p>

?LDAP 服务器对w䆾验证q行处理Ӟ需要解军_外两个问题才能满x供可靠安全的w䆾验证的目标。现在,M客户机系l不能成功地? LDAP 服务器进行通信都会L用户d客户机系l。在下一节中我们看到如何消除这U单Ҏ障,q将昄客户机如何从备䆾服务器上讉K LDAP 目录。由于用户密码是在网l上以正文文本格式传输的Q因此这q不能满_全n份验证的需求?a href="http://www-128.ibm.com/developerworks/cn/linux/l-openldap/#configtls">配置 TLS 安全?/a> 解册个问题?/p>



回页?/b>


配置复制

Z防止出现客户机由?LDAP 服务器的问题而不能登录的情况Q我们需要采用复制技术来实现可靠性目标。复制是通过 OpenLDAP 复制q程 slurpd 提供的,它会周期性地唤醒Qƈ查主服务器上的日志文Ӟ从而确定是否有M更新。这些更新然后会传播C服务器上。读h可以׃Q何一个服务器q行? 析,而更新请求则只能׃服务器进行解析。客h需要负责在推荐地址上重试更新操作?/p>

要配|复Ӟ需要停?OpenLDAP 服务器的 slapd 守护q程Q?/p>
清单 10. 停止服务
# service ldap stop

以下内Ҏ加到服务器的 /etc/openldap/slapd.conf 文g中,从而启用对C服务器的复制?code>replogfile 行的内容指定c?LDIF 变化应该写入的文件?code>replica 原语定义了变化应该传播到的主机:

#Replicas of this database
replogfile /var/lib/ldap/replog
replica host=dhcp64-253.ibm.com:389
binddn="cn=Manager,dc=ibm,dc=com"
credentials=secret
bindmethod=simple

在运行从 OpenLDAP 服务器的pȝ上,请遵?配置 LDAP 服务?/a> 一节给出的步骤。然后通过信息导出到一?ldif 文g中ƈ其dC服务器数据库上,从而将数据库从L务器拯到复制服务器上?/p>

在主服务器上Q?/p>
清单 11. 数据导出到 LDIF 文g?/b>
# ldapsearch -x > database.ldif

在复制服务器上:


清单 12. 数据添加到从服务器数据库中
# ldapadd -x -D "cn=Manager,dc=ibm,dc=com" -W -f database.ldif

以下内Ҏ加到复制服务器的 /etc/openldap/slapd.conf 文g中?code>updatedn 指定了在更新从目录时?slurpd 守护q程使用?DN?code>updateref 指定的是ȝ录服务器。当一?LDAP 客户求从服务器进行更新时Q从服务器就客h重定向到q个L务器上?/p>

updatedn "cn=Manager,dc=ibm,dc=com"
updateref ldap://dhcp64-233.ibm.com:389/

启动复制 OpenLDAP 服务器,当它q行之后Q再启动?OpenLDAP 服务器。在L务器上,slapd ?slurpd 都会启动?/p>

现在Q可以让 OpenLDAP 客户机除了主服务器之外还可以使用复制服务器,q可以通过q行 authconfig q将复制L名添加到W二个屏q中?Server 行中实现Q也可以通过?/etc/ldap.conf 中修?host 实现Q?/p>

host dhcp64-253.ibm.com dhcp64-233.ibm.com

Z认复制可以正常工作Q需要研I一下在更新 gecos 属性时到底发生了什么。复制日志用了?LDIF cM的格式。在d replogfile 之后Qslurpd 会将q个条目拯到自q重做日志中。实际的变化都以 LDIF 格式保存在主 LDAP 服务器上 /var/lib/ldap/replica/ 中的 slurpd.replog 文g中?/p>

使用文g user_mod 中的变化Q客hE序 ldapmodify 应用q些变化Q?/p>
清单 13. 应用 user_mod 的变?/b>
# cat user_mod
dn: uid=ldapuser,ou=People,dc=ibm,dc=com
changetype: modify
replace: gecos
gecos: test2

# tail -f /var/lib/ldap/replog &

# ldapmodify -x -r -f /home/ldapuser/user_mod -D'cn=Manager,dc=ibm,dc=com' -W
Enter LDAP Password:
modifying entry "uid=ldapuser,ou=People,dc=ibm,dc=com"

replica: dhcp64-253.ibm.com:389
time: 1130111686
dn: uid=ldapuser,ou=People,dc=ibm,dc=com
changetype: modify
replace: gecos
gecos: test2
-
replace: entryCSN
entryCSN: 20051023235446Z#000001#00#000000
-
replace: modifiersName
modifiersName: cn=Manager,dc=ibm,dc=com
-
replace: modifyTimestamp
modifyTimestamp: 20051023235446Z
-





回页?/b>


配置 TLS 安全?/span>

LDAP 是以明文的格式通过|络来发送所有信息的Q包括密码。我们将采用 TLS 所提供的加密机ӞSSL 的后l者)来解册个问题。在传输层,数据使用 TLS 协议q行加密和封装,然后通过|络q行传输。用来配|加密的工具都是?OpenSSL 包提供的?/p>

虽然加密是一个复杂的主题Q但是要使用 OpenSSL 包,我们依然需要简要介l一?TLS 是如何工作的。数据块使用一个对U密钥算法进行加密,它用一个密钥来实现Ҏ据的加密和解密。我们还有一个问题:如何防止出现以正文文本格式将密钥? LDAP 服务器发送到 LDAP 客户Z的情c我们用公钥算法来解决q个问题Q其中客h可以使用一个自p取的公钥对自q密钥q行加密Q而只有服务器才可以对q个密钥q行解密?/p>

公钥是作书的一部分来创建和分发的,其中包含了一些支持信息,例如 ID、过期日期、提供这个证书的 LDAP 服务器的完整域名QFQDNQ。在 LDAP 客户Z用证书进行加密之前,它会验证自己正在与之q行交谈的服务器拥有q个证书Q这是通过加密一个挑战ƈ验证服务器可以对其进行解密实现的?/p>

要验证发行这个证书的服务器是一个已l批准过?LDAP 服务器,客户配置为只接受本地证书机构QCAQ所{v的证书。它使用 CA 所生成的证书中的公钥,q个公钥保存到客h中以验证q个 LDAP 所产生的证书是有效的?/p>

在这个例子中Q我们将自己?LDAP 服务器设|ؓ证书机构Qƈ创徏一个自{v的证书供 LDAP 客户机和服务器在加密信息中用?/p>

用来构徏 TLS 服务器的 Red Hat Enterprise Linux release 4 Update 1 包是Q?/p>

  • openssl-0.9.7a-43.1Q包括一个证书管理工具和提供各种加密法和协议的׃n?/li>

要构书机构的工作环境q生成自q自签|证书,需要运?/usr/share/ssl/misc/CA shell 脚本Q这是一个对 openssl 命o的封装程序。私密性增强邮ӞPEMQ是一U用来对数据q行加密和编码的格式Q?/p>
清单 14. q行 CA shell 脚本
# cd /usr/share/ssl/misc
# ./CA -newca
CA certificate filename (or enter to create)

Making CA certificate ...
Generating a 1024 bit RSA private key
.........++++++
......++++++
writing new private key to './demoCA/private/./cakey.pem'
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
-----
You are about to be asked to enter information that will be incorporated into
your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [GB]:US
State or Province Name (full name) [Berkshire]:Oregon
Locality Name (eg, city) [Newbury]:Beaverton
Organization Name (eg, company) [My Company Ltd]:IBM
Organizational Unit Name (eg, section) []:its
Common Name (eg, your name or your server's hostname) []:dhcp64-233.ibm.com
Email Address []:root@dhcp64-233.ibm.com

接下来,要生成由证书机构q行{v的服务器证书。其余的步骤只会对主 LDAP 服务器执行一ơ,此时指定的是 CN=dhcp64-233.ibm.comQ然后对从服务器执行一ơ,此时指定的是 CN=dhcp64-253.ibm.com。还要?nodes 选项Q这样就不用在每ơ启?OpenLDAP 服务器守护进E?slapd 旉需要输入密码了。签|后的公钥被嵌入到证书请?slapd-req.pem 中,与之匚w的私钥嵌入在 slapd-key.pem 中:


清单 15. 生成服务器证?/b>
# openssl req -new -nodes -subj
'/CN=dhcp64-233.ibm.com/O=IBM/C=US/ST=Oregon/L=Beaverton'
-keyout slapd-key.pem -out slapd-req.pem -days 365
Generating a 1024 bit RSA private key
...............++++++
.....................................++++++
writing new private key to 'slapd-key.pem'
-----

使用在第一个步骤中创徏?CA 证书对这个证书进行签|Ԍ


清单 16. 对证书进行签|?/b>
# openssl ca -out slapd-cert.pem -infiles slapd-req.pem
Using configuration from /usr/share/ssl/openssl.cnf
Enter pass phrase for ./demoCA/private/cakey.pem:
Check that the request matches the signature
Signature ok
Certificate Details:
Serial Number: 1 (0x1)
Validity
Not Before: Oct 25 02:50:05 2005 GMT
Not After : Oct 25 02:50:05 2006 GMT
Subject:
countryName = US
stateOrProvinceName = Oregon
organizationName = IBM
commonName = dhcp64-233.ibm.com
X509v3 extensions:
X509v3 Basic Constraints:
CA:FALSE
Netscape Comment:
OpenSSL Generated Certificate
X509v3 Subject Key Identifier:
11:A2:FB:59:42:A4:B3:26:73:1D:6D:F5:4D:2F:80:F0:FA:10:38:F5
X509v3 Authority Key Identifier:
keyid:F7:6A:25:F5:76:BE:20:E7:8D:0F:51:EF:D8:86:7B:AF:2C:74:2F:80
DirName:/C=US/ST=Oregon/L=Beaverton/O=IBM/OU=its/CN=dhcp64-233.ibm.com
/emailAddress=root@dhcp64-233.ibm.com
serial:00

Certificate is to be certified until Oct 25 02:50:05 2006 GMT (365 days)
Sign the certificate? [y/n]:y

1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated

下一个步骤将所有需要的证书拯?slapd 可以扑ֈ的地斏V另外,q要Ҏ个文件强刉用正的权限Q?/p>
清单 17. 拯证书q强制设|权?/b>
# cp -p slapd-key.pem /etc/openldap/slapdkey.pem
# cp -p slapd-cert.pem /etc/openldap/slapdcert.pem
# chown ldap:ldap /etc/openldap/slapdcert.pem
# chmod 644 /etc/openldap/slapdcert.pem
# chown ldap:ldap /etc/openldap/slapdkey.pem
# chmod 400 /etc/openldap/slapdkey.pem

# mkdir /etc/openldap/cacerts/
# cp /usr/share/ssl/misc/demoCA/cacert.pem /etc/openldap/cacerts/cacert.pem
# chown ldap:ldap /etc/openldap/cacerts cacert.pem
# chmod 644 /etc/openldap/cacerts cacert.pem

?OpenLDAP 服务器上Q将以下内容d?/etc/openldap/slapd.conf 文g?global D下面?code>TLSCertificateFile ?TLSCertificateKeyFile 指定了证书文件和U钥文g的\径?code>TLSCipherSuite 指定了一?OpenSSL 密码的列表,slapd 在与 TLS 协商建立q接时可以从中按照降序顺序依ơ选择?code>HIGH 的意思是 “所有密钥的长度都大?128 位”;MEDIUM 表示 “所有密钥的长度都等?128 位”;+SSLv2 表示 “不密钥强度如何,所有密码都是以 SSL 协议版本 2 的Ş式指定的”?/p>

TLSCipherSuite HIGH:MEDIUM:+SSLv2
TLSCACertificateFile /etc/openldap/cacerts/cacert.pem
TLSCertificateFile /etc/openldap/slapdcert.pem
TLSCertificateKeyFile /etc/openldap/slapdkey.pem

以下内Ҏ加到 LDAP 服务器的W二个配|文?/etc/openldap/ldap.conf 中:

TLS_CACERTDIR /etc/openldap/cacerts
TLS_REQCERT allow

Z允许?OpenLDAP 客户Z使用安全q接Q需要将以下内容d?/etc/openldap/ldap.conf 文g中:

ssl start_tls
tls_checkpeer yes
tls_cacertfile /etc/openldap/cacerts/cacert.pem





回页?/b>


l束?/span>

按照本文l出的提C,我们现在已经使用轻量U目录访问协议(LDAPQ构Z一个集中的w䆾验证pȝ。我们最初是通过配置 LDAP 服务器来响应?“dc=ibm,dc=com?的基本请求开始入手的。我们用了一l?Perl 脚本来将用户帐号信息q移?LDAP 目录中。我们对 Linux 用户帐号服务、PAM ?NSS 服务q行了修改,从而可以从 LDAP 服务器中索用户信息。还讄了一? LDAP 服务器副本作为备用服务器来响应客h的请求。然后,使用 TLS 协议?LDAP 客户机和服务器之间对通信q行安全加密。恭喜!

Z参考方便,下面l出了本文中使用的配|文件的完整清单?/p>
清单 18. 本文例子中用的服务?/etc/openldap/slapd.conf 文g
#
# See slapd.conf (5) for details on configuration options.
#
include /etc/openldap/schema/core.schema
include /etc/openldap/schema/cosine.schema
include /etc/openldap/schema/inetorgperson.schema
include /etc/openldap/schema/nis.schema

loglevel 256
pidfile /var/run/slapd.pid
argsfile /var/run/slapd.args

# The next three lines allow use of TLS for encrypting connections.
TLSCipherSuite HIGH:MEDIUM:+SSLv2
TLSCACertificateFile /etc/openldap/cacerts/cacert.pem
TLSCertificateFile /etc/openldap/slapdcert.pem
TLSCertificateKeyFile /etc/openldap/slapdkey.pem

# access control policy:
# Restrict password access to change by owner and authentication.
# Allow read access by everyone to all other attributes.

access to attrs=shadowLastChange,userPassword
by self write
by * auth

access to *
by * read

#######################################################################
# database definition
#######################################################################

database bdb
suffix "dc=ibm,dc=com"

rootdn "cn=Manager,dc=ibm,dc=com"
rootpw {MD5}ijFYNcSNctBYg

directory /var/lib/ldap

# Indices to maintain for this database
index objectClass eq,pres
index ou,cn,mail,surname,givenname eq,pres,sub
index uidNumber,gidNumber,loginShell eq,pres
index uid,memberUid eq,pres,sub
index nisMapName,nisMapEntry eq,pres,sub

#Replicas of this database
replica host=dhcp64-253.ibm.com:389
binddn="cn=Manager,dc=ibm,dc=com"
credentials=secret
bindmethod=simple
replogfile /var/lib/ldap/replog


清单 19. 本文例子中用的服务?/etc/openldap/ldap.conf 文g
#
# LDAP Defaults
#

# See ldap.conf(5) for details

HOST 127.0.0.1
BASE dc=ibm,dc=com

TLS_CACERTDIR /etc/openldap/cacerts
TLS_REQCERT allow


清单 20. 本文例子中用的客户?/etc/ldap.conf 文g
a
# @(#)$Id: ldap.conf,v 1.34 2004/09/16 23:32:02 lukeh Exp $
#
# This is the configuration file for the LDAP nameservice
# switch library and the LDAP PAM module.
#
# PADL Software
# http://www.padl.com
#

# Your LDAP server.
# Multiple hosts may be specified, each separated by a
# space.

host dhcp64-233.ibm.com dhcp64-233.ibm.com

# The distinguished name of the search base.

base dc=ibm,dc=com

# OpenLDAP SSL mechanism, start_tls mechanism uses the normal LDAP port 389
ssl start_tls

#Require and verify server certificate
tls_checkpeer yes

# CA certificates for server certificate verification
tls_cacertfile /etc/openldap/cacerts/cacert.pem

pam_password md5





回页?/b>


参考资?

学习

获得产品和技?/b>

讨论




回页?/b>


关于作?/span>

Mike O'Reilly

Mike O'Reilly ?IBM Linux ?VMware ESX 产品支持组的一员,他ؓ Linux 产品提供支持已经?5 q的旉了。另外,他支?VMware ?/p>




Alex 2006-08-10 09:19 发表评论
]]>[转]bash~程教学实例http://www.oiklr.tw/alex/archive/2006/06/16/53293.htmlAlexAlexFri, 16 Jun 2006 06:20:00 GMThttp://www.oiklr.tw/alex/archive/2006/06/16/53293.htmlhttp://www.oiklr.tw/alex/comments/53293.htmlhttp://www.oiklr.tw/alex/archive/2006/06/16/53293.html#Feedback0http://www.oiklr.tw/alex/comments/commentRss/53293.htmlhttp://www.oiklr.tw/alex/services/trackbacks/53293.html
转自 q里

另一?详解Bash命o行处?/a>

bash~程教学实例

bash~程

--------------------------------------------------------------------------------
時間Q?004/03/02    來源Q不?br />
  Shell Script(bash)?br />
  众所皆知圎ͼUNIX上以工兯名,利用许多单的工P来完成原本需要大量Y体开发的工作Q这一点特Ԍ使得UNIX成ؓ许多人心目中理想的系l^台。 
  在众多的工具中QShell Script得上是最基本、最强大、运用最q泛的一个。它q用围之q,不但从系l启动、程式编译、定期作业、上|连U,甚至安装整个LinuxpȝQ都可以用它来完成。 

  因ؓShell Script是利用您qx在用的一些指令,之l合hQ成Z?E式"。如果您qx某些序列的指令下得特别频J,便可以将q些指ol合hQ成为另 一个新的指令。这P不但可以化ƈ加速操作速度Q甚臌可以q脆自动定期执行Q大大简化系l管理工作。 

  *************************
  Bash(GNU Bourne-Again SHell)是许多Linuxq_的内定ShellQ事实上Q还有许多传lUNIX上用的ShellQ像tcsh、csh、ash、bsh、ksh{等Q? Shell Script大致都类同,当您学会一UShell以后Q其它的Shell会很快就上手Q大多数的时候,一个Shell Script通常可以在很多种Shell上用。 
  q里我介l您bash的用方法。事实上Q当?man bash"Ӟ可以看到bash的说明书Q不q对许多人来_q䆾说明书犹?无字天书"一样难懂。这份文Ӟ主要资料来源?man bash"Q我加上一些实际日常的应用例来说明。希望这栯让那些始l不得其门而入的h们,多多少能有Ҏc 


  教学例子

  "Hello world" Shell Script 
  照传l程式教学例Q这一节介lShell Script?Hello World"如何撰写。 

  *************************

  #!/bin/sh 
  # Filename : hello 
  echo "Hello world!" 

  *************************

  大家应该会注意到W一行的"#!/bin/sh"。在UNIX下,所有的可执行ScriptQ不是那一U语aQ其开头都?#!"Q例如Perl? "#!/usr/bin/perl"Qtcl/tk?#!/usr/bin/wish"Q看您要执行的ScriptE式位置在那里。您也可以用"#! /bin/bash"?#!/bin/tcsh"{等Q来指定使用特定的Shell。 
  echo是个bash的内建指令。 

  *************************

  接下来,执行helloq个script: 
  要执行一个Script的方式有很多U。 

  *************************

  W一U?: helloq个档案的权限设定ؓ可执行。 
  [foxman@foxman bash]# chmod 755 hello 
  执行 
  [foxman@foxman bash]# ./hello 
  hello world 

  *************************

  W二U?: 使用bash内徏指o"source"?."。 
  [foxman@foxman bash]# source hello 
  hello world 
  或 
  [foxman@foxman bash]# . hello 
  hello world 

  *************************

  W三U?: 直接使用sh/bash/tcsh指o来执行。 
  [foxman@foxman bash]# sh hello 
  hello world 
  或 
  [foxman@foxman bash]# bash hello 
  hello world 

  *************************

  Bash执行选项 

  *************************

  -c string : dstring来当命o。 
  -i : 互动介面。 
  -s : 由stdind命o。 
  - : 取消往后选项的读取。 
  -norc : 不要读~/.bashrc来执行。 
  -noprofile : 不要?etc/profile、~/.bash_profile、~/.bash_login、~/.profile{等来执行。 
  -rcfile filename : 执行filenameQ而非~/.bashrc 
  -version : 昄版本。 
  -quiet : 启动时不要哩唆。 
  -login : 保bash是个login shell。 
  -nobraceexpansion : 不要用curly brace expansion({}W号展开)。 
  -nolineediting : 不用readline来读取命令列。 
  -posix : 攚wPosix 1003.2标准。 


  用于自动备䆾的Shell Script


  一个用于自动备份的Shell Script
  我们先前提到Q可利用Shell Script搭配crond来作定期的工作。要作定期性的工作Q在UNIX上,是与crond的搭配运用。 

  *************************

  首先我们先来研究如何对系l进行备份。 
  要对pȝq行备䆾Q不外乎便是利用一些压~工兗在许多UNIXpȝ上,tar及gzip是de facto的资料交换标准。我们经常可以看见一些tar.gz或tgz档,q些档案Q被UCؓtarball。当然了Q您也可以用bzip2、zip{等? ~工hq行压羃Q不必限定于gzip。但tar配合gzip是最普遍的,也是最方便的方式。 

  要将我们惌的资料压~v来,q行备䆾Q可以结合tar及gzip一赯行。方式有很多U,最常用的指令是以下q一U? 

  tar -c file/dir ... | gzip -9 > xxxx.tar.gz 

  您也可以分开来做: 

  tar -r file/dir ... -f xxxx.tar 
  gzip -9 xxxx.tar 

  或 

  tar -r file/dir ... -f xxxx.tar 
  gzip -9 < xxxx.tar > xxxx.tar.gz 

  *************************

  在解qLinux下档案备份的基本知识后,我们来写一个将档案备䆾的Script。 
  #!/bin/sh 
  # Filename : backup 

  DIRS="/etc /var /your_directories_or_files" 
  BACKUP="/tmp/backup.tgz" 

  tar -c $DIRS | gzip -9 > $BACKUP 

  其中DIRS攄是您要备份的档案及目录,BACKUP是您的备份档。可不要?tmp放进DIRS中,那样做,您是在做备䆾的备份,可能您的硬塞爆。 


  *************************

  接下来测试 
  [foxman@foxman bash]# chmod 755 backup 
  [foxman@foxman bash]# ./backup 

  执行完成后在/tmp׃有一个backup.tgzQ里面储存了您重要的资料。您可用 

  gzip -dc /tmp/backup.tgz | tar -vt 
  或 
  tar vtfz /tmp/backup.tgz 

  来看看里面的档案列表。 

  要解开Ӟ可用以下指o来完成复? 

  gzip -dc /tmp/backup.tgz | tar -xv 
  或 
  tar xvfz /tmp/backup.tgz 

  备䆾通常是仅备䆾pȝ通常最重要的部份,/etc可说是不可缺的一部䆾。另外,看您pȝ中有那些重要的资料需要备份。通常来说Q您没有必要备䆾 /bin?sbin?usr/bin?usr/sbin?usr/X11R6/bin{等q些执行档目录。只要备份您重要的档案即可,别把整个? 备份,那是蛮呆的动作。 

  *************************

  如果您有许多台机器,可利用其中一CQ务较ȝ内部|\LQ做Z要备份主机。将所有机器都自动执行备䆾Q然后利用NFS/Coda/Samba{网路档案系l,备份的资料攑ֈ该备份机器中Q该机器则定时收取备份资料,然后您再p机器中进行一ơ备份。 
  q里是整个系l备份方案的囄。 

  在您q行之前Q先解一下,pȝ中那些是要备份的Q那些是不需要的。 

  *************************

  新的backup
  #!/bin/sh 
  HOSTNAME=`hostname` 
  DIRS="/etc /var /your_important_directory" 
  BACKUP="/tmp/$HOSTNAME.tgz" 
  NFS="/mnt/nfs" 

  tar -c $DIRS | gzip -9 > $BACKUP 
  mv -f $BACKUP $NFS 


  *************************

  备䆾L内的Script : collect_backup
  #!/bin/sh 
  NFS="/mnt/nfs" 
  BACKUP="/backup" 

  mv -f $NFS/*.tgz $BACKUP 


  在此Q您不能够将所有备份都直接攑֜/mnt/nfsQ这是危险的。万一M台机器不心?mnt/nfs所有内容删除,那么备䆾׃消失。因此,您需要将/mnt/nfsUd一个只有该备䆾L可存取的目录中。 


  *************************

  当这些个别的Script都测试好以后Q接下来我们他们放到crontab里面。找到您的crontabQ它的位|可能在/var/spool/cron/crontabs/root?etc/crontab?var/cron/tabs/root。 
  在crontab中选择以下之一加入(看您定期的时?: 

  Slackware : /var/spool/cron/crontabs/root
  01 * * * * /full_backup_script_path/backup 1> /dev/null 2> /dev/null # 每小?太过火一? 
  30 16 * * * /full_backup_script_path/backup 1> /dev/null 2> /dev/null # 每日16:30Q下班前备䆾 
  30 16 * * 0 /full_backup_script_path/backup 1> /dev/null 2> /dev/null # 每周一16:30 
  0 5 1 * * /full_backup_script_path/backup 1> /dev/null 2> /dev/null # 每月一?:0 
  RedHat/Debian : /etc/crontab
  RedHat可直接将backup攑օ/etc/cron.hourly, /etc/cron.daily, /etc/cron.weekly, /etc/cron.monthly。或采用如上加入/etc/crontab的方? 
  有关crontab的用法,可查"man 5 crontab"Q在此不详述。 

  备䆾L的设定类同。 

  注意: 所有机器不要同时进行备份,否则|\会大塞R。备份主机收取备份的旉要设为最后,否则会收不到备䆾资料。您可以在实作后Q将旉间隔调整一下。 


  *************************

  看看Q两个小不C行的Shell ScriptQ配合cronq个定时工具。可以让原本需要耗时多个时的h工备份工作,化到不到十分钟。善用您的想像力Q多加一点变化,可你让您的生zd得轻村ּ常,快乐悠哉?br />

  档案pȝ?br />
  pȝ安全一向是大多数电脑用户关心的事,在UNIXpȝ中,最重视的事Q即pȝ中有没有"木马"(Trojan horse)。不Trojan horse如何放进来的Q有一点始l会不变Q即被放|木马的档案Q其档案日期一定会被改变,甚至会有其它的状态改变。此外,许多状况下,pȝ会多Z些不 知名的档案。因此,qx查整个档案系l的状态是否有被改变,所有状态有改变的档案,以及目前有那些程式正在执行,自动报告l系l管理员Q是个避免坐? "木马"的良斏V 

  *************************

  #!/bin/sh 
  # Filename : whatever_you_name_it 
  DIRS="/etc /home /bin /sbin /usr/bin /usr/sbin /usr/local /var /your_directory" 
  ADMIN="email@your.domain.com" 
  FROM="admin@your.domain.com" 
  # 写入Sendmail的标头 
  echo "Subject: $HOSTNAME filesystem check" > /tmp/today.mail 
  echo "From: $FROM" >> /tmp/today.mail 
  echo "To: $ADMIN" >> /tmp/today.mail 
  echo "This is filesystem report comes from $HOSTNAME" >> /tmp/today.mail 
  # 报告目前正在执行的程式 
  ps axf >> /tmp/today.mail 
  # 档案pȝ查 
  echo "File System Check" >> /tmp/today.mail 
  ls -alR $DIRS | gzip -9 > /tmp/today.gz 
  zdiff /tmp/today.gz /tmp/yesterday.gz >> /tmp/today.mail 
  mv -f /tmp/today.gz /tmp/yesterday.gz 
  # 寄出信g 
  sendmail -t < /tmp/today.mail 

  然后把它攑ֈ一个不昄的地方去Q让别h找不到。 

  把它加入crontab中。 

  30 7 * * * /full_check_script_path/whatever_you_name_it 1> /dev/null 2> /dev/null #上班前检查 

  有些档案是固定会更动的,?var/log/messages?var/log/syslog?dev/ttyX{等Q不要太大惊怪?br />

  控制圈for

  演示了几个简单的Shell ScriptQ相信您应该对Shell Script有点概念了。现在我们开始来仔细研究一些较高等的Shell Script写作。一些进一步的说明Q例?$"?>"?<"?>>"?1>"?2>"W号的用,会在 E后解释。 

  *************************

  for name [ in word; ] do list ; done
  控制圈。 
  word是一序列的字Qfor会将word中的个别字展开Q然后设定到name上面。list是一序列的工作。如果[in word;]省略掉,那么name会被设定ؓScript后面所加的参数。 


  *************************

  例一: 
  #!/bin/sh 

  for i in a b c d e f ; do 
  echo $i 
  done 

  它将会显C出a到f。 


  *************************

  例二: 另一U用法,A-Z
  #!/bin/sh 
  WORD="a b c d e f g h i j l m n o p q r s t u v w x y z" 

  for i in $WORD ; do 
  echo $i 
  done 

  q个Script会昄a到z。 


  *************************

  例三 : 修改副档?br />   如果您有许多?txt档想要改名成.doc档,您不需要一个一个来。 
  #!/bin/sh 

  FILES=`ls /txt/*.txt` 

  for txt in $FILES ; do 
  doc=`echo $txt | sed "s/.txt/.doc/"` 
  mv $txt $doc 
  done 

  q样可以?.txt档修Ҏ*.doc档。 


  *************************

  例四 : meow
  #!/bin/sh 
  # Filename : meow 
  for i ; do 
  cat $i 
  done 

  当您输入"meow file1 file2 ..."Ӟ其作用就?cat file1 file2 ..."一栗 


  *************************

  例五 : listbin 
  #!/bin/sh 
  # Filename : listbin 

  for i in /bin/* ; do 
  echo $i 
  done 

  当您输入"listbin"Ӟ其作用就?ls /bin/*"一栗 


  *************************

  例六 : /etc/rc.d/rc 
  拿一个实际的例来_Red Hat?etc/rc.d/rc的启动程式中的一个片断。 

  for i in /etc/rc.d/rc$runlevel.d/S*; do 
  # Check if the script is there. 
  [ ! -f $i ] && continue 

  # Check if the subsystem is already up. 
  subsys=${i#/etc/rc.d/rc$runlevel.d/S??} 
  [ -f /var/lock/subsys/$subsys ] || \ 
  [ -f /var/lock/subsys/${subsys}.init ] && continue 

  # Bring the subsystem up. 
  $i start 
  done 

  q个例中Q它扑և/etc/rc.d/rcX.d/S*所有档案,查它是否存在Q然后一一执行。 


  程控制case

  case word in [ pattern [ | pattern ] ... ) list ;; ] ... esac
  case/esac的标准用法大致如? 
case $arg in 
  pattern | sample) # arg in pattern or sample 
  ;; 
  pattern1) # arg in pattern1 
  ;; 
  *) #default 
  ;; 
esac 
  arg是您所引入的参敎ͼ如果arg内容W合pattern目的话Q那么便会执行pattern以下的程式码Q而该D늨式码则以两个分号";;"做结。 

  可以注意?case"?esac"是对U的Q如果记不v来的话,?case"颠倒过来即可。 


*************************

  例一 : paranoia
#!/bin/sh 
case $1 in 
    start | begin) 
     echo "start something" 
    ;; 
    stop | end) 
     echo "stop something" 
    ;; 
    *) 
     echo "Ignorant" 
    ;; 
esac 

  执行
  [foxman@foxman bash]# chmod 755 paranoia 
  [foxman@foxman bash]# ./paranoia 
  Ignorant 
  [foxman@foxman bash]# ./paranoia start 
  start something 
  [foxman@foxman bash]# ./paranoia begin 
  start something 
  [foxman@foxman bash]# ./paranoia stop 
  stop something 
  [foxman@foxman bash]# ./paranoia end 
  stop something 

*************************

  例二 : inetpanel
  许多的daemon都会附上一个管理用的Shell ScriptQ像BIND附上ndcQApache附上apachectl。这些管理程式都是用shell script来写的,以下CZ个管理inetd的shell script。 
#!/bin/sh 

case $1 in 
  start | begin | commence) 
    /usr/sbin/inetd 
  ;; 
  stop | end | destroy) 
    killall inetd 
  ;; 
  restart | again) 
    killall -HUP inetd 
  ;; 
  *) 
    echo "usage: inetpanel [start | begin | commence | stop | end | destory | restart | again]" 
  ;; 
esac 


*************************

  例三 : 判断pȝ
  有时候,您所写的Script可能会跨好几种q_Q如Linux、FreeBSD、Solaris{等Q而各q_之间Q多多少都有不同之处,有时候需要判断目前正在那一U^C执行。此Ӟ我们可以利用uname来找出系l资讯。 
#!/bin/sh 

SYSTEM=`uname -s` 

case $SYSTEM in 
  Linux) 
    echo "My system is Linux" 
    echo "Do Linux stuff here..." 
  ;; 
  FreeBSD) 
    echo "My system is FreeBSD" 
    echo "Do FreeBSD stuff here..." 
  ;; 
  *) 
    echo "Unknown system : $SYSTEM" 
    echo "I don't what to do..." 
  ;; 
esac 


  程控制select

  select name [ in word; ] do list ; done
  select֐思义是在word中选择一V与for相同Q如果[in word;]省略Q将会用Script后面所加的参数。 
  ?
#!/bin/sh 
WORD="a b c" 

select i in $WORD ; do 
 case $i in 
  a) 
   echo "I am A" 
  ;; 
  b) 
   echo "I am B" 
  ;; 
  c) 
   echo "I am C" 
  ;; 
  *) 
   break; 
  ;; 
 esac 
done 

  执行l果
  [foxman@foxman bash]# ./select_demo 
1) a 
2) b 
3) c 
#? 1 
I am A 
1) a 
2) b 
3) c 
#? 2 
I am B 
1) a 
2) b 
3) c 
#? 3 
I am C 
1) a 
2) b 
3) c 
#? 4 


  q回状态Exit

  在l下M前,我们必须要切入另一个话题,卌回状态?- Exit Status。因为if/while/until都迁涉到了用Exit Status来控制程式流E的问题。 

  *************************

  许多人都知道Q在许多语言?C/C++/Perl....)Q都有一个exit的函敎ͼ甚至qBash自己都有个exit的内建命令。而exit后面所带的数字Q便是返回状态?- Exit Status。 
  q回状态值可以得程式与E式之间Q利用Shell script来结合的可能性大增,利用程式,透过Shell scriptQ来完成很杂的工作。 

  在shell中,q回gؓ零表C成?True)Q非零gؓp|(False)。 


  *************************

  举例来说Q以下这个两个小E式yes/no分别会返?/1(成功/p|): 
  /* yes.c */ 
  void main(void) { exit(0); } 
  /* no.c */ 
  void main(void) { exit(1); } 
  那么以下q个"YES"的shell script便会昄"YES"。 
  #!/bin/sh 
  # YES 
  if yes ; then 
  echo "YES" 
  fi 
  ?NO"不会昄M东西。 
  #!/bin/sh 
  # NO 
  if no ; then 
  echo "YES" 
  fi 

  *************************

  test express 
  [ express ] 
  在Shell script中,test express/[ express ]q个语法被大量地使用Q它是个非常实用的指令。由于它的返回值即Exit StatusQ经常被q用在if/while/until的场合中。而在后面Q我们也会大量运用到Q在q入介绍if/while/until之前Q有必要 先解一下。 

  其返回gؓ0(True)?(False)Q要看表q?express)的结果ؓ何。 

  express格式 

  -b file : 当档案存在ƈ且属性是Block special(通常?dev/xxx)Ӟq回True。 
  -c file : 当档案存在ƈ且属性是character special(通常?dev/xxx)Ӟq回True。 
  -d file : 当档案存在ƈ且属性是目录Ӟq回True。 
  -e file : 当档案存在时Q返回True。 
  -f file : 当档案存在ƈ且是正常档案Ӟq回True。 
  -g file : 当档案存在ƈ且是set-group-idӞq回True。 
  -k file : 当档案存在ƈ且有"sticky" bit被设定时Q返回True。 
  -L file : 当档案存在ƈ且是symbolic linkӞq回True。 
  -p file : 当档案存在ƈ且是name pipeӞq回True。 
  -r file : 当档案存在ƈ且可dӞq回True。 
  -s file : 当档案存在ƈ且档案大大于零Ӟq回True。 
  -S file : 当档案存在ƈ且是socketӞq回True。 
  -t fd : 当fd被开启ؓterminalӞq回True。 
  -u file : 当档案存在ƈ且set-user-id bit被设定时Q返回True。 
  -w file : 当档案存在ƈ且可写入Ӟq回True。 
  -x file : 当档案存在ƈ且可执行Ӟq回True。 
  -O file : 当档案存在ƈ且是被执行的user id所拥有Ӟq回True。 
  -G file : 当档案存在ƈ且是被执行的group id所拥有Ӟq回True。 
  file1 -nt file2 : 当file1比file2新时(Ҏ修改旉)Q返回True。 
  file1 -ot file2 : 当file1比file2旧时(Ҏ修改旉)Q返回True。 
  file1 -ef file2 : 当file1与file2有相同的device及inode numberӞq回True。 
  -z string : 当string的长度ؓ零时Q返回True。 
  -n string : 当string的长度不为零Ӟq回True。 
  string1 = string2 : string1与string2相等Ӟq回True。 
  string1 != string2 : string1与string2不相{时Q返回True。 
  ! express : express为FalseӞq回True。 
  expr1 -a expr2 : expr1及expr2为True。 
  expr1 -o expr2 : expr1或expr2其中之一为True。 
  arg1 OP arg2 : OP?eq[equal]?ne[not-equal]?lt[less-than]?le[less-than-or-equal]?gt [greater-than]?ge[greater-than-or-equal]的其中之一。 



  *************************

  在Bash中,当错误发生在致命信号Ӟbash会返?28+signal number做ؓq回倹{如果找不到命oQ将会返?27。如果命令找CQ但该命令是不可执行的,返?26。除此以外,Bash本n会返回最后一? 指o的返回倹{若是执行中发生错误Q将会返回一个非零的倹{ 
  Fatal Signal : 128 + signo 
  Can't not find command : 127 
  Can't not execute : 126 
  Shell script successfully executed : return the last command exit status 
  Fatal during execution : return non-zero

  程控制if

  if list then list [ elif list then list ] ... [ else list ] fi
  几种可能的写法 

*************************

W一U 
if list then 
 do something here 
fi 
当list表述q回gؓTrue(0)Ӟ会执行"do something here"。 

例一 : 当我们要执行一个命令或E式之前Q有时候需要检查该命o是否存在Q然后才执行。 
if [ -x /sbin/quotaon ] ; then 
  echo "Turning on Quota for root filesystem" 
  /sbin/quotaon / 
fi 

例二 : 当我们将某个档案做ؓ讑֮档时Q可先检查是否存在,然后该档案讑֮D入。 
# Filename : /etc/ppp/settings 
PHONE=1-800-COLLECT 

#!/bin/sh 
# Filename : phonebill 
if [ -f /etc/ppp/settings ] ; then 
  source /etc/ppp/settings 
  echo $PHONE 
fi 
执行 
[foxman@foxman ppp]# ./phonebill 
1-800-COLLECT 


*************************

W二U 
if list then 
 do something here 
else 
 do something else here 
fi 
例三 : Hostname 
#!/bin/sh 
if [ -f /etc/HOSTNAME ] ; then 
  HOSTNAME=`cat /etc/HOSTNAME` 
else 
  HOSTNAME=localhost 
fi 


*************************

W三U 
if list then 
 do something here 
elif list then 
 do another thing here 
fi 
例四 : 如果某个讑֮档允许有好几个位|的话,例如crontabQ可利用if then elif fi来找寅R 
#!/bin/sh 

if [ -f /etc/crontab ] ; then 
  CRONTAB="/etc/crontab" 
elif [ -f /var/spool/cron/crontabs/root ] ; then 
  CRONTAB="/var/spool/cron/crontabs/root" 
elif [ -f /var/cron/tabs/root ] ; then 
  CRONTAB="/var/cron/tabs/root" 
fi 
export CRONTAB 


*************************

W四U 
if list then 
 do something here 
elif list then 
 do another thing here 
else 
 do something else here 
fi 
例五 : 我们可利用uname来判断目前系l,q分别做各系l状况不同的事。 
#!/bin/sh 

SYSTEM=`uname -s` 

if [ $SYSTEM = "Linux" ] ; then 
 echo "Linux" 
elif [ $SYSTEM = "FreeBSD" ] ; then 
 echo "FreeBSD" 
elif [ $SYSTEM = "Solaris" ] ; then 
 echo "Solaris" 
else 
 echo "What?" 
fi 

控制圈while/until

while list do list done
当list为TrueӞ该圈会不停地执行。 
例一 : 无限回圈写法 
#!/bin/sh 

while : ; do 
 echo "do something forever here" 
 sleep 5 
done 

例二 : 把pppd杀掉。 
#!/bin/sh 

while [ -f /var/run/ppp0.pid ] ; do 
  killall pppd 
done 


*************************

until list do list done
当list为False(non-zero)Ӟ该圈会不停地执行。 
例一 : {待pppd上线。 
#!/bin/sh 
until [ -f /var/run/ppp0.pid ] ; do 
  sleep 1 
done 


  参数与变?br />
  在l下Mlfunction之前Q我们必d下来介绍"参数与变?。 

  *************************

  参数(Parameters)是用来储??的资料型态,有点像是一般语a中的变数。它可以是个名称(name)、数?number)、或者是以下所列出来一些特D符?Special Parameters)。 
  在shell中,变数是由name形式的参数所构成的。 


  *************************

  在前面的许多例中Q我们事实上已经看到许多参数的运用。要讑֮一个Parameter实际很简? 
  name=value 

  例如? 

  MYHOST="foxman" 

  而要使用它时Q则是加?$"W号。 

  echo $MYHOST 

  *************************

  位置参数(Positional Parameters) 

  *************************

  所谓的位置参数便是0,1,2,3,4,5,6,7,8,9...。用时Q用$0,$1,$2...。 
  位置参数是当script被蝲入时Q后面所附加的参数?0是本w,$1则ؓW一个参敎ͼ$2为第二个Q依此类推。而当Positional Parameters被function所使用Ӟ它们会被暂时取代(下一节会介绍function)。 

  例如以下q个script: 
  #!/bin/sh 
  # Filename : position 
  echo $0 
  echo $1 

  执行? 
  [foxman@foxman bash]# ./position abc 
  ./position 
  abc 

  当位|参数超q两位数Ӟ有特别的Ҏ来展开Q称为Expansion。 

  *************************

  Ҏ参数(Speical Parameters) 
  q些W号Q非怸人性,Ҏ手来说很困扰。但上手后,会觉得方便无比,有些如果您看不懂的话Q就--了Q不用浪费太多时间在上面。 

  *************************

  * 星号 
  Positional Parameters合成一个参敎ͼ光隔ؓIFS内定参数的第一个字?见内建变C?。 
  ? 
  #!/bin/sh 
  # starsig 
  echo $* 

  执行: 
  [foxman@foxman bash]# starsig a b c d e f g 
  a b c d e f g 

  *************************

  @ atW号 
  ?星号cd。不同之处在于不参照IFS。 

  ? 
  #!/bin/sh 
  # atsig 
  echo $@ 

  执行: 
  [foxman@foxman bash]# atsig a b c d e f g 
  a b c d e f g 


  *************************

  # 井字受
  展开Positional parameters的数量。 

  ? 
  #!/bin/sh 
  # poundsig 
  echo $# 

  执行 
  [foxman@foxman bash]# poundsig a b c d e f g 
  7 

  *************************

  ? 问号 
  最q执行的foreground pipeline的状态。 


  *************************

  - 减号 
  最q执行的foreground pipeline的选项参数。 

  *************************

  $ 钱钱钱 
  本n的Process ID。 

  [foxman@foxman bash]# ps ax | grep bash 
  1635 p1 S  0:00 /bin/bash 

  [foxman@foxman bash]# echo $$ 
  1635 

  *************************

  ! 惊号 
  最q执行背景命令的Process ID。 

  *************************

  0 零 
  在Positional Parameters一部䆾已经说明q了Q是执行的shell script本n。但如果是用"bash -c"Q则$0被设为第一个参数。 

  [foxman@foxman bash]# echo $0 
  /bin/bash 

  *************************

  _ 底线W号 
  昄出最后一个执行的命o。 

  [foxman@foxman bash]# echo $_ 
  bash 


  *************************

  内徏变数(Shell Variables) 
  Bash有许多内建变敎ͼ像PATH、HOME、ENV......{等。这些内建变数将在另一节中Q专门一一说明?br />
  函数function

  [ function ] name () { list; }
  function的参数是Positional Paraments。 

  例 
#!/bin/sh 

function func() { 
 echo $1 
 echo $2 
 return 1 
} 

func "Hello" "function" 

  局部变数可用local来宣告。 

  函数可exportQ用下一层的shell可以使用。 

  函数可递,没有递层数的限制?br />
  Bash内徏指o集 

  以下的命令,大部份都没有使用例,您可能会看不出所以然Q摸不著头脑。在我加入例说明前,?man bash"Q然后自己实际操作一ơ。 

  *************************
  : [arguments] 
  不做M事,除了[arguments]一些参数展开及一些特定重导向的作业外。 

  永远q回零。它的用法跟true一栗 

  *************************
  . filename [arguments] 
  source filename [arguments] 
  由filename中读取命令,q执行。 
  您会?etc/rc.d/*中发现很多 
  . /xxxx 
  的指令,而xxxx的permission都不是可执行的。事实上Q在tcsh中,需要用 
  source /xxxx 
  来做同样的指令。 
  注意?."的后面是有空格的(比较一?. /"?./"Q不一?。filename是内含指令的U文字档卛_Q无chmod 755 filename。 

  ?br />   filename : my_source 
  DEV=lo 
  IP=127.0.0.1 
  NETMASK=255.0.0.0 
  BROADCAST=127.255.255.255 

  ifconfig $IP netmask $NETMASK broadcast $BROADCAST dev $DEV 

  接下来 
  . my_source 
  或 
  source my_source 

  便可执行该scriptQ而不需?chmod 755 my_source" 

  *************************
  alias [name[=value] ...] 
  늧命o 
  例如您如果来自DOS的世界,对UNIX的指令不习惯Q可用alias来修改,以符合您的习惯。 

  ?br />   alias ls="ls --color" 
  alias dir="ls" 
  alias cd..="cd .." 
  alias copy="cp -f" # dangerous, recommend, "cp -i" 
  alias del="rm -f" # dangerous, recommend, "rm -i" 
  alias move="mv -f" # dangerous, recommend, "mv -i" 
  alias md="mkdir" 
  alias rd="rmdir" 

  *************************
  unalias [-a] [name ...] 
  unalias取消alias的设定?unalias -a"全部alias取消。 

  ?br />   unalias copy 

  *************************
  bg [jobspec] 
  指定Q务放到背景中Q如果jobspec未指定,内定为目前的。 

  *************************
  fg [jobspec] 
  指定Q务放到前景中Q如果jobsepc没有指定Q那么内定ؓ目前的。 

  *************************
  jobs [-lnp] [ jobspec ... ] 
  W一UŞ式列出目前正在工作的d。 
  -l : 除了列出一般资讯外Q还列出Process IDs。 
  -p : 仅列工作?首脑"(Process group leader)的Process ID. 
  -n : 则仅列出有改变的jobs的状态。 
  如果l定jobspecQ输讯则只有该jobspec。 

  q回gؓӞ除非有非法的选项发生。 

  jobs -x command [ args ... ] 

  如果使用W二UŞ?-x)Qjobs取代指定的command及argsQƈ执行q回其Exit Status。 

  *************************
  kill [-s sigspec | -sigspec] [pid | jobspec] ... 
  sigspec的信号送到pid或jobspec。 
  sigspec可以是SIGKILL/KILLq种形式或是信号L。如果sigspec是signal nameQ则大小写无养I而且可以没有SIG。 
  kill -l [signum] 
  列出信号名称。 

  [foxman@foxman bash]# kill -l 
  1) SIGHUP    2) SIGINT    3) SIGQUIT   4) SIGILL 
  5) SIGTRAP   6) SIGIOT    7) SIGBUS    8) SIGFPE 
  9) SIGKILL   10) SIGUSR1   11) SIGSEGV   12) SIGUSR2 
  13) SIGPIPE   14) SIGALRM   15) SIGTERM   17) SIGCHLD 
  18) SIGCONT   19) SIGSTOP   20) SIGTSTP   21) SIGTTIN 
  22) SIGTTOU   23) SIGURG   24) SIGXCPU   25) SIGXFSZ 
  26) SIGVTALRM  27) SIGPROF   28) SIGWINCH  29) SIGIO 
  30) SIGPWR 

  *************************
  wait [n] 
  {待指定的行E,q返回其l束状态。n可以是个jobspec或Process ID。如果n未指定,则等待所有的子行E,及返回gؓ零。若nZ存在的job或processQ则q回127。否则,q回gؓ最后一? job/process的Exit Status。 

  *************************
  bind [-m keymap] [-lvd] [-q name] 
  bind [-m keymap] -f filename 
  bind [-m keymap] keyseq:function-name 
  昄出目前readline的按键及铄函数讑֮或是巨集。 

  -m keymap : 讑֮keymap binding。 
  -l : 昄出所有readline function的名U。 
  -v : 昄出目前的function name及bindings。 
  -d : 昄出function name及bindings。 
  -f filename : 从filenamedkey bindings。 
  -q function : 询问那个按键触发function。 

  *************************
  break [n] 
  跛_控制回圈for/while/until中用。如果有指定nQ则跛_n层。n必须是大于等?。若n大于巢状圈数Q则所有的圈都会蟩R返回值回零。 

  *************************
  continue [n] 
  q原控制回圈for/while/until中用。如果有指定nQ则q回n层。n必须是大于等?。若n大于巢状圈数Q则q原到最上层。返回值回零。 

  *************************
  exit [n] 
  dE式。n是Exit Status。 

  *************************
  return [n] 
  在function中用。n回|其作用与Exit Status一栗 

  *************************
  builtin shell-builtin [arguments] 
  执行内徏函数。当您定义了与内建函数相同的指oӞ可用此命令来执行内徏函数。 

  *************************
  cd [dir] 
  更换目录到dir。如果没有指定,内定为HOME所指定的目录。 

  *************************
  command [-pVv] command [arg ...] 
  用command指定可取消正常的shell functionL。只有内建命令及在PATH中找得到的才会被执行?-p"选项Q搜d令的方式是用PATH来找?-V"?-v"选项Q会昄命o的一些简U描q。 

  *************************
  declare [-frxi] [name[=value]] 
  typeset [-frxi] [name[=value]] 
  宣告参数q给它们讑֮属性。如果没有给定名Uͼ会昄各参数倹{ 

  -f : 仅用函数名U。 
  -r : name设ؓreadonly。 
  -x : name输出l后l环境用。 
  -i : 该参数被设ؓinteger来用,可用于算术表q。 

  ?+"Ӟ关闭该属性。 

  *************************
  dirs [-l] [+/-n] 
  昄目前记忆的目录。目录可透过pushd/popd来操作。 

  +n : 昄开始的记录n个。 
  -n : 昄l尾的记录n个。 
  -l : 昄较多的资讯。 

  *************************
  echo [-neE] [arg ...] 
  输出昄argsQ由I白分隔。返回值永为零。 

  -n : 不蟩行。 
  -e : 启动"\"W号的解译。 
  -E : ESC解译功能取消。 

  "\a" : alert(bell)Q发出声响。 
  "\b" : backspaceQ倒退。 
  "\c" : suppress trailing newlineQ不跌。 
  "\f" : form feedQ蟩行蟩根{ 
  "\n" : new lineQ新行。 
  "\r" : carriage returnQ回到行L。 
  "\t" : horizontal tabQ水q位。 
  "\v" : vertical tabQ垂直蟩位。 
  "\\" : 输出"\"。 
  "\nnn" : 输出ASCII CodeLnnn(八进?。 

  *************************
  enable [-n] [-all] [name ...] 
  启动或关闭内建函数命令。?-n"所有指定命令皆关闭Q否则都是启动的。如果只?-n"参数Q它会昄所有关闭的函数。如果只?-all"Q它会昄所有内建命令。 

  *************************
  eval [arg ...] 
  dargsQƈargs合ؓ一个命令,然后执行。其q回值成为eval的返回倹{如果没有参敎ͼevalq回True。 

  *************************
  exec [[-] command [arguments]] 
  当命令执行时Q该命o取代shellQ没有新的process产生。如果第一个参数是"-"Qshell会将"-"攑օW零个参敎ͼ传给command。 

  *************************
  export [-nf] [name[=word]] ... 
  export -p 
  name输出l环境,l往后的命o使用?-f"选项表示name是函数?-p"昄出所有export的名U?-n"U除name。 

  *************************
  set [--abefhkmnptuvxldCHP] [-o option] [arg ...] 
  -a : 自动变数标Cؓ可让后面环境所使用。 
  -b : 立即报告被终l的背景E式状态。 
  -e : 当命?simple-commandQ见后面)q回非零值时Q立卌出。 
  -f : 取消pathname expansion。 
  -h : 扑և所记忆的函数命令位|。 
  -k : 所有keyword参数都放到环境中。 
  -m : 监督模式。 
  -n : d命oQ但不要执行。可用于语法查。 
  -p : 打开privileged模式。 
  -t : 当读取一个命令ƈ执行后,立即d。 
  -u : 当参数展开Ӟ把unset参数当成是错误。 
  -v : 列出shell input lines。 
  -x : 在展开每个simple-command后,bash昄展开值在PS4上。 
  -l : 储存q还原name binding在for语法中。 
  -d : 关闭hasing command搜寻。 
  -C : 跟`noclobber=`一栗请见内定参C节。 
  -H : 启动! style history substitution。 
  -P : 在用像cdq种指oӞ不要跟随symbolic links。 
  -- : "--"之后Q没有参数跟在后面。 
  - : 指定所有后面的参数当成是位|参数。 
  -o option-name : option-name可以是以下之一 
  allexport : ?-a"相同。 
  braceexpand : 启动Brace Expansion。这是内定设定。 
  emacs : 使用emacs-style命o列编辑界面。 
  errexit : ?-e"相同。 
  histexpand : ?-H"相同。 
  ignoreeof : 效果跟`IGNOREEOF=10`一栗 
  interactive-commands : 允许#做ؓ解。 
  monitor : ?-m"相同。 
  noclobber : ?-C"相同。 
  noexec : ?-n"相同。 
  noglob : ?-f"相同。 
  nohash : ?-d"相同。 
  notify : ?-b"相同。 
  nounset : ?-u"相同。 
  physical : ?-P"相同。 
  posix : Bash行ؓ修改为Posix 1003.2标准。 
  privileged : ?-p"相同。 
  verbose : ?-v"相同。 
  vi : 使用vi-style命o列编辑程式。 
  xtrace : ?-x"相同。 

  *************************
  unset [-fv] [name ...] 
  U除Ҏ于name的参数。要注意PATH、IFS、PPID、PS1、PS2、UID、EUID不能unset。若RANDOM、SECONDS? LINENO、HISTCMD被unsetQ它们会丧失原有意义Q既始它们后来被重设也一栗返回gؓTrueQ除非name是不能被unset的。 

  *************************
  fc [-e ename] [-nlr] [first] [last] 
  fc -s [pat=rep] [cmd] 
  修正命o。 

  *************************
  getopts optstring name [args] 
  解析位置参数。 

  *************************
  help [pattern] 
  昄协助资讯。 

  *************************
  history [n] 
  history -rwan [filename] 
  没有参数Ӟ会显C所下命令的历史记录。带有参?n"则显C最后n个。 

  其它参数如下: 
  -a : 新增"新历?到历史档中。 
  -n : d未d历史中的记录。 
  -r : dfilename做ؓ历史档,q用它ؓ目前历史记录。 
  -w : 现有历史记录写到filename中。 

  *************************
  let arg [arg ...] 
  术表述。请参考算术表qC节。 

  *************************
  local [name[=value] ...] 
  产生一个局部参数。如果用于functionQ则其作用围在function内及其子函数。 

  *************************
  logout 
  dlogin shell。 

  *************************
  popd [+/-n] 
  U除目录堆叠?+n"U除上面n个,"-n"U除下面n个。 


  *************************
  pushd [dir] 
  pushd +/-n 
  目录新增到目录堆叠的最上面?+n"旋{该堆叠,使第n个目录变成最上面?-n"旋{该堆叠,使倒数Wn个目录变成最上面。 

  *************************
  pwd 
  列出目前工作目录的绝对\径。 

  *************************
  read [-r] [name ...] 
  读进一行,然后W一个字讑ֈW一个nameQ第二个讑ֈW二个nameQ依此类推。如果没有name在参CQ则read会将D到REPLY。返回gؓӞ除非遇到End-Of-File。若?-r"选项Q则"\n"被考虑行的一部䆾。 

  *************************
  readonly [-f] [name ...] 
  readonly -p 
  给定的name标记为readonly。如果是"-f"选项Q则函数也一栯标记为readonly?-p"会列出所有readonly的name?--"取消查剩余的参数。 

  *************************
  shift [n] 
  Positional Parameters从n+1...开始,会被改ؓ$1...。n若ؓӞ则没有改变。n若未l定Q则内定?。n必须是非负数Qƈ且小于或{于$#。若n大于$#Q则没有改变。返回gؓӞ除非n大于$#或小于零。 

  *************************
  suspend [-f] 
  暂停q个shell的执行,直到它收到SIGCONT信号?-f"选项则是叫login shell不要抱怨,不过q是一h停。返回状态零Q除非该shell是个login shellQ而且没有"-f"选项。 

  *************************
  test expr 
  [ expr ] 
  我们在Exit Status的部份已l说q了Q不再重。 

  *************************
  times 
  列出该shell的篏U的使用者及pȝ旉及从shell执行的process旉Q返回gؓ零。 

  ------------------------------------------------------------------------------
  trap [-l] [arg] [sigspec] 
  当收到sigspec信号Ӟ执行arg命o?-l"昄Z号名U及L。 

  *************************
  type [-all] [-type | -path] name [name ...] 
  没有参数的状况下Q它会显C出shell如何解译name做ؓ命o。如果有"-type"Q它会昄alias、keyword? function、builtin或file。如果有"-path"的参敎ͼ它将会显C命o的\径,找不到的话,不显CZQ何东ѝ如果有"-all"? 参数Q它会昄所有可执行name的可能\径。type接受"-a"?-t"?-p"做ؓ~写。 

  *************************
  ulimit [-SHacdfmstpnuv [limit]] 
  ulimit提供了对shell的可获取资源控制的功能。 

  -a : 报告目前所有限制。 
  -c : 讑֮最大可产生的core档案。 
  -d : 行程资料D?process's data segment)最大倹{ 
  -f : 可被q个shell产生的最大档案。 
  -m : resident set size最大倹{ 
  -s : 堆叠最大倹{ 
  -t : CPU TIME最大?以秒计算)。 
  -p : pipe size in 512-byte blocks的最大倹{ 
  -n : 可开启的file descriptors最大倹{ 
  -u : 单一使用者可使用的最大process数。 
  -v : 该shell最大虚拟记忆体可用倹{ 

  所有项目是?024做ؓ单位。 

  *************************
  umask [-S] [mode] 
  用者的file-creation mask设ؓmode?-S"选项mask印成W号形式?br />

  Bash内徏参数

  PPID : 该bash的呼叫者process ID. 

  PWD : 目前的工作目录。 

  OLDPWD : 上一个工作目录。 

  REPLY : 当read命o没有参数Ӟ直接讑֜REPLY上。 

  UID : User ID。 

  EUID : Effective User ID。 

  BASH : Bash的完整\径。 

  BASH_VERSION : Bash版本。 

  SHLVL : 每次有Bash执行Ӟ数字加一。 

  RANDOM : 每次q个参数被用到时Q就会生一个ؕ数在RANDOM上。 

  SECONDS : 从这个Shell一开始启动后的时间。 

  LINENO : Script的行数。 

  HISTCMD : 历史记录数。 

  OPTARG : getopts处理的最后一个选项参数。 

  OPTIND : 下一个要由getopts所处理的参数号码。 

  HOSTTYPE : 机器U类。 

  OSTYPE : 作业pȝ名称。 

  IFS : Internal Field Separator。 

  PATH : 命o搜寻路径。 
  PATH="/usr/gnu/bin:/usr/local/bin:/usr/ucb:/bin:/usr/bin:." 

  HOME : 目前使用者的home directory; 

  CDPATH : cd命o的搜寻\径。 

  ENV : 如果q个参数被设定,每次有shell script被执行时Q将会执行它所讑֮的档名做为环境设定。 

  MAIL : 如果q个参数被设定,而且MAILPATH没有被设定,那么有信件进来时Qbash会通知使用者。 

  MAILCHECK : 讑֮多久旉查邮件一ơ。 

  MAILPATH : 一串的邮g查\径。 

  MAIL_WARNING : 如果有设定的话,邮g被读取后Q将会显C息。 

  PS1 : 提示讯息讑֮Q内定ؓ"bash\$ "?误见提C息一节? 

  PS2 : W二提示讯息讑֮Q内定ؓ"> "。 

  PS3 : select命o所使用的提C息。 

  PS4 : 执行q踪时用的提C息设定,内定?+ "。 

  HISTSIZE : 命o历史记录量,内定?00。 

  HISTFILE : 历史记录档,内定~/.bash_history。 

  HISTFILESIZE : 历史记录档行数最大|内定500。 

  OPTERR : 如果设ؓ1Qbash会显Cgetopts的错误。 

  PROMPT_COMMAND : 如果讑֮的话Q该g在每ơ执行命令前都显C。 

  IGNOREEOF : EOF值当成输入,内定?0。 

  TMOUT : 如果设ؓ大于Ӟ该D解译入等待秒数。若无输入,当成没有输入。 

  FCEDIT : fc命o的内定编辑器。 

  FIGNORE : 误见READLINE。 

  INPUTRC : readline的startup fileQ内定~/.inputrc 

  notify : 如果讑֮了,bash立即报告被终l的背景E式。 

  history_control, HISTCONTROL : history使用。 

  command_oriented_history : 存入多行指o。 

  glob_dot_filenames : 如果讑֮了,bash会?."包含入档案\径中。 

  allow_null_glob_expansion : 如果讑֮了,bash允许路径明称为null string。 

  histchars : history使用。 

  nolinks : 如果讑֮了,执行指oӞ不会跟随symbolic links。 

  hostname_completion_file, HOSTFILE : 包含?etc/hosts相同格式的档名。 

  noclobber : 如果讑֮了,Bash不会覆写M?>"?>&"?<>"所操作的档案。 

  auto_resume : 误d控制一节。 

  no_exit_on_failed_exec : 如果该值存在,非互动的shell不会因ؓexecp|而蟩出。 

  cdable_vars : 如果启动Q而cd命o找不到目录,可切换到参数形态指定的目录下?br />

  提示W号

  Bash使用PS1~PS4来显C提C符P其格式如? 

  *************************

  \t : 现在旉。 
  \d : 现在日期。 
  \n : 新行。 
  \s : shell的名U。 
  \w : 目前工作目录。 
  \W : 目前工作目录完整路径。 
  \u : 使用者名U。 
  \h : Hostname。 
  \# : q个命o的号码。 
  \! : 历史L。 
  \$ : 如果EUID?Q则#Q否则ؓ$。 
  \nnn : 八进位的字元。 
  \\ : "\"W号。 
  \[ : 开始一序列不可列印的字元。 
  \] : l束一序列不可列印的字元?br />

  术表述

  - + 
  ! ~ 
  * / % 
  + - 
  << >> 
  <= >= < > 
  == != 
  & 
  ^ 
  | 
  && 
  || 
  = *= /= %= += -= <<= >>= &= ^= |= 

  重导Redirection

  > 
  >> 
  1> 
  . 
  . 


  语法

  Simple Command 


  Pipelines 


  Lists 

  (list) 
  { list; }

Alex 2006-06-16 14:20 发表评论
]]>
[转]iptables使用实例http://www.oiklr.tw/alex/archive/2006/06/06/50815.htmlAlexAlexTue, 06 Jun 2006 09:05:00 GMThttp://www.oiklr.tw/alex/archive/2006/06/06/50815.htmlhttp://www.oiklr.tw/alex/comments/50815.htmlhttp://www.oiklr.tw/alex/archive/2006/06/06/50815.html#Feedback0http://www.oiklr.tw/alex/comments/commentRss/50815.htmlhttp://www.oiklr.tw/alex/services/trackbacks/50815.html
举一个具体的例子Q假讄l中有一台服务器A (IP地址?.1.1.1)提供WWW服务Q另有客hB(2.2.2.2)、C(3.3.3.3)。首先,服务器Aq行提供WWW服务的后台程序(? 如ApacheQƈ且把该服务绑定到端口80Q也是_在端?0q行监听。当B发v一个连接请求时,B打开一个大?024的连接端?1024? 为已定义端口),假设?037。A在接收到h后,?0端口与B建立q接以响应B的请求,同时产生一?0端口l定的拷贝,l箋监听客户端的h。假 如A又接收到C的连接请求(设连接请求端口ؓ1071Q,则A在与C建立q接的同时又产生一?0端口l定的拷贝l监听客L的请求。如下所C,因ؓp? l是以源地址、源端口、目的地址、目的端口来标识一个连接的Q所以在q里每个q接都是唯一的?

服务?客户?
q接1Qa.b.c.1:80 <=> a.b.c.4:1037
q接2Qa.b.c.1:80 <=> a.b.c.7:1071

? 一U特定的服务都有自己特定的端口,一般说来小?024的端口多Z留端口,或者说是已定义端口Q低端口分配l众所周知的服务(如WWW、FTP{? {)Q从512?024的端口通常保留l特D的UNIX TCP/IP应用E序Q具体情况请参?etc/services文g或RFC1700?

假设|络环境如下Q某一单位Q租用DDN专线上网Q网l拓扑如下:

+--------------+
| 内部|段 | eth1+--------+eth0 DDN
| +------------|firewall|<===============>Internet
| 198.168.80.0 | +--------+
+--------------+
eth0: 198.199.37.254
eth1: 198.168.80.254

以上的IP地址都是Internet上真实的IPQ故没有用到IPƺ骗。ƈ且,我们假设在内部网中存在以下服务器Q?
www服务器:www.yourdomain.com 198.168.80.11
ftp服务器:ftp.yourdomain.com 198.168.80.12
email服务器:mail.yourdomain.com 198.168.80.13

下面我们用iptables一步一步地来徏立我们的包过滤防火墙Q需要说明的是,在这个例子中Q我们主要是对内部的各种服务器提供保护?

1. ?etc/rc.d/目录下用touch命o建立firewall文gQ执行chmod u+x firewll以更Ҏ件属? Q编?etc/rc.d/rc.local文gQ在末尾加上 /etc/rc.d/firewall 以确保开机时能自动执行该脚本?

2. h所有的铄规则
#!/bin/sh

echo "Starting iptables rules..."

#Refresh all chains

/sbin/iptables -F

3. 我们首先禁止{发Q何包Q然后再一步步讄允许通过的包?
所以首先设|防火墙FORWARD铄{略为DROPQ?

/sbin/iptables -P FORWARD DROP

4.讄关于服务器的包过虑规则:

在这里需要注意的是,服务?客户Z互是有来有往的,也就是说是双向的Q所以我们不仅仅要设|数据包出去的规则,q要讄数据包返回的规则Q我们先建立针对来自Internet数据包的q虑规则?

WWW服务Q服务端口ؓ80Q采用tcp或udp协议。规则ؓQeth0=>允许目的为内部网WWW服务器的包?

###########################Define HTTP packets####################################

#Allow www request packets from Internet clients to www servers
/sbin/iptables -A FORWARD -p tcp -d 198.168.80.11 --dport www -i eth0 -j ACCEPT

FTP 服务QFTP服务有点特别Q因为需要两个端口,因ؓFTP有命令通道和数据通道。其中命令端口ؓ21Q数据端口ؓ20Qƈ且有d和消极两U服务模式,? 消极模式q接q程为:FTP客户端首先向FTP服务器发赯接请求,三步握手后徏立命令通道Q然后由FTP服务器请求徏立数据通道Q成功后开始传输数据, 现在大多数FTP客户端均支持消极模式Q因U模式可以提高安全性。FTP服务采用tcp协议。规则ؓQeth0=>仅允许目的ؓ内部|ftp? 务器的包?

############################Define FTP packets#####################################

#Allow ftp request packets from Internet clients to Intranet ftp server
/sbin/iptables -A FORWARD -p tcp -d 198.168.80.12 --dport ftp -i eth0 -j ACCEPT


EMAIL服务Q包含两个协议,一是smtpQ一是pop3。出于安全性考虑Q通常只提供对内的pop3服务Q所以在q里我们只考虑针对smtp的安全性问题。smtp端口?1Q采用tcp协议。eth0=>仅允许目的ؓemail服务器的smtph?

###########################Define smtp packets####################################
/sbin/iptables -A FORWARD -p tcp -d 198.168.80.13 --dport smtp -i eth0 -j ACCEPT

5. 讄针对Intranet客户的过虑规则:

? 本例中我们的防火墙位于网关的位置Q所以我们主要是防止来自Internet的攻击,不能防止来自Intranet的攻凅R假如我们的服务器都是基? linux的,也可以在每一部服务器上设|相关的q虑规则来防止来自Intranet的攻凅R对于Internet对Intranet客户的返回包Q我? 定义如下规则?

#############Define packets from Internet server to Intranet#######################
/sbin/iptables -A FORWARD -p tcp -s 0/0 --sport ftp-data -d 198.168.80.0/24 -i eth0 -j ACCEPT
/sbin/iptables -A FORWARD -p tcp -d 198.168.80.0/24 ! -syn -i eth0 -j ACCEPT
/sbin/iptables -A FORWARD -p udp -d 198.168.80.0/24 -i eth0 -j ACCEPT

说明Q第一条允许Intranet客户采用消极模式讉KInternet的FTP服务器;W二条接收来自Internet的非q接htcp包;最后一条接收所有udp包,主要是针对oicq{用udp的服务?

6. 接受来自整个Intranet的数据包q虑Q我们定义如下规则:

#############Define packets from Internet server to Intranet server###############
/sbin/iptables -A FORWARD -s 198.168.80.0/24 -i eth1 -j ACCEPT

7. 处理ip片

我们接受所有的ip片Q但采用limit匚w扩展对其单位旉可以通过的ip片数量q行限制Q以防止ip片d?

#################################Define fregment rule##################################
/sbin/iptables -A FORWARD -f -m limit --limit 100/s --limit-burst 100 -j ACCEPT

说明Q对不管来自哪里的ip片都进行限Ӟ允许每秒通过100个ip片Q该限制触发的条件是100个ip片?

8. 讄icmp包过?

icmp包通常用于|络试{,故允许所有的icmp包通过。但是黑客常帔R用icmpq行dQ如ping of death{,所以我们采用limit匚w扩展加以限制Q?

#################################Define icmp rule##################################
/sbin/iptables -A FORWARD -p icmp -m limit --limit 1/s --limit-burst 10 -j ACCEPT

说明Q对不管来自哪里的icmp包都q行限制Q允许每U通过一个包Q该限制触发的条件是10个包?


? q以上个步骤Q我们徏立了一个相对完整的防火墙。只对外开放了有限的几个端口,同时提供了客户对Internet的无~访问,q且对ip片d? icmp的ping of death提供了有效的防护手段。以下是完整的脚本文件内容,希望通过q个实例能是对iptables的用法有所了解Q?

#!/bin/sh

echo "Starting iptables rules..."

#Refresh all chains

/sbin/iptables -F

###########################Define HTTP packets####################################

#Allow www request packets from Internet clients to www servers
/sbin/iptables -A FORWARD -p tcp -d 198.168.80.11 --dport www -i eth0 -j ACCEPT

############################Define FTP packets#####################################

#Allow ftp request packets from Internet clients to Intranet ftp server
/sbin/iptables -A FORWARD -p tcp -d 198.168.80.12 --dport ftp -i eth0 -j ACCEPT

###########################Define smtp packets####################################
/sbin/iptables -A FORWARD -p tcp -d 198.168.80.13 --dport smtp -i eth0 -j ACCEPT

#############Define packets from Internet server to Intranet#######################
/sbin/iptables -A FORWARD -p tcp -s 0/0 --sport ftp-data -d 198.168.80.0/24 -i eth0 -j ACCEPT
/sbin/iptables -A FORWARD -p tcp -d 198.168.80.0/24 ! -syn -i eth0 -j ACCEPT
/sbin/iptables -A FORWARD -p udp -d 198.168.80.0/24 -i eth0 -j ACCEPT

#############Define packets from Intranet to Internet###############
/sbin/iptables -A FORWARD -s 198.168.80.0/24 -i eth1 -j ACCEPT

#################################Define fregment rule##################################
/sbin/iptables -A FORWARD -f -m limit --limit 100/s --limit-burst 100 -j ACCEPT

#################################Define icmp rule##################################
/sbin/iptables -A FORWARD -p icmp -m limit --limit 1/s --limit-burst 10 -j ACCEPT

Alex 2006-06-06 17:05 发表评论
]]>
[转]iptables基础http://www.oiklr.tw/alex/archive/2006/06/06/50813.htmlAlexAlexTue, 06 Jun 2006 08:58:00 GMThttp://www.oiklr.tw/alex/archive/2006/06/06/50813.htmlhttp://www.oiklr.tw/alex/comments/50813.htmlhttp://www.oiklr.tw/alex/archive/2006/06/06/50813.html#Feedback0http://www.oiklr.tw/alex/comments/commentRss/50813.htmlhttp://www.oiklr.tw/alex/services/trackbacks/50813.html

QM者序Q:本来是要译http://www.justlinux.com/nhf/Security/IPtables_Basics.htmlq篇文章的,可惜当年实在是没有学好语法,许多句子按照原文译Q如何也理不通顺。只好按照自q理解重新l织了,但愿不会有太大的偏差。好在,无论如何Q现在读hQ基本通顺了?img src="http://bbs.linuxsky.net/images/smilies/icon_mrgreen.gif" align="absmiddle" border="0" />

Iptables用三U链来管理放出、进入或l过你计机的(数据Q包。INPUT铄理进入你计算机的包,OUTPUT铄理你计算机放出的包,FORWARD铄理经q你的计机转送到另一台计机的包?br />
所以,讄iptables的过E事实上是定义一些规则来军_如何处理q三U包的过E?br />
例如Q如果你讉Khttp://www.yahoo.comQ你的计机放Z个包向Yahoo!h。这个包pl过OUTPUT铄审核。内怼览OUTPUT链,看看是否有某条规则不允许攑ևq个包,如果有的话,拒l放出?br />
现在让我们来处理一些实际问题。比如你想阻塞所有来?00.200.200.1的包。首先你需要用-s选项来指明源IP地址或DNSQ?br />
CODE:
iptables -s 200.200.200.1

然后可以?j选项来说明如何处理这个包。最常用的处理方式有三种QACCEPT、DENY和DROP。ACCEPT֐思义表示接受包,DENY不接受同时回送一条拒l信息,而DROP则根本对包不予理睬。如果确信某个IP可疑Q那么最好选择DROP而不是DENYQ?br />
CODE:
iptables -s 200.200.200.1 -j DROP

但是仅仅使用上面q条命oQ我们的计算Z无所适从Q因为它不知道该用哪条链来处理这规则。这p用到-A选项Q它表示把某条规则追加到某个铄末尾。我们打拒l所有来?00.200.200.1的包Q所以用:
CODE:
iptables -A INPUT -s 200.200.200.1 -j DROP

选项的顺序不会媄响最l的处理l果Q?j DROP也可以放?s 200.200.200.1的前面,只不q放在后面似乎更Ҏ理解?br /> 现在扩展一下,假设我们不想发送Q何包l?00.200.200.1该如何做呢?很简单,只要把INPUT换成OUTPUTQ同时用-d替换-s可以了Q?br />
CODE:
iptables -A OUTPUT -d 200.200.200.1 -j DROP

? 么,如果我们打算忽略来自q台机器的telneth该怎么办呢Q你可能知道telnet使用的是23端口Q但是如果你愿意Q你也可以在iptables 中用telnet关键字而不是端口号。TelnetQ像大多数服务一Pq行于TCP协议之上。我们可以?p选项来指明所用的协议。但是只指明协议 不会有Q何作用,q需要用—destination-port来指出我们要为哪个目标端口指定规则。与之相对应Q?-source-prot用来指明? 端口Q确信别把二者弄混了。所以我们可以这hl某台机器的telnethQ?br />
CODE:
iptables -A INPUT -s 200.200.200.1 -p tcp --destination-port telnet -j DROP

扩展一下,如果你想拒绝一个网D늚telnethQ可以?00.200.200.0/24来代替上面的200.200.200.1Q它匚wM200.200.200.*q样的IP地址?br />
再复杂一些。假设我们同时可以连接到本地局域网和internetQeth0|卡用来q接本地局域网Qppp0用来拨号到internet。我们可能只? 为本地局域网提供telnet服务而不想ؓ不安全的internet提供此项服务。有两种选择Q在OUTPUT链上?o选项d讑֤输出数据Q但更好? 是在INPUT链上?i选项d讑֤输入数据。因此,q条规则可以q样讄Q?br />
CODE:
iptables -A INPUT -p tcp --destination-port telnet -i ppp0 -j DROP

q将关闭一切来自internet的telneth但是开攑ֱ域网同样的请求?br />
规则可以使用-A选项来追加在规则列表之后 Q也可以使用-I选项插入在某条规则之前。例如,如果我们x一条规则放在INPUT铄最前面Q我们可以用?I INPUT 1”。其中的1代表规则列表的第一行,你也可以把它换成其它的数字。除此之外,我们q可以?R选项来替换某条规则(它将删除原来的规则)Q?D选项? 删除某条规则Q?L选项来列出所有已l设|的规则Q?F选项来初始化所有规则?br />
现在Q再深入一步。网l中的数据包通常使用某种协议Q如果这U协议是TCPQ它q会使用某个端口。你可能惛_脆关闭所有端口拒l进来的包,但是记着Q如? 你的计算机同另一台计机会话Q另一台计机肯定会发送反馈信息。如果你关闭了所有进来的端口Q那本质上就表示你的q接没有用了。而且对于大多数非服务 E序来说Q你无法预知它们使用哪个端口q行会话。但是仍然有一U办法。当两台计算机在TCPq接上进行会话时Q连接一定会首先被初始化。完成这Q务的? 叫作SYN。一个SYN包简单的表明另一台计机已经做好了会话的准备。只有发出服务请求的计算机才发送SYN包。所以如果你仅拒l进来的SYN包,它将 l止其它计算机打开你计机上的服务Q但是不会终止你使用其它计算Z的服务,如果它没有拒l你发送的SYN包的话。这是一U折L办法Q但是可以完成许 多我们想完成的Q务。这个选项?-synQ用在你指明的TCP协议之后。所以制定一条规则阻塞所有来自internet的连接会是这P
CODE:
iptables -A INPUT -i ppp0 -p tcp --syn -j DROP

q是一条非常有用的规则除非你的计算行有web服务。如果你仅打开放一个端口,比如?0QHTTPQ,有种单的办法。和许多~程语言一P可以用一个惊叹号表示“非”。例如,你打阻塞所?0端口以外的SYN包,我想会是q样Q?br />
CODE:
iptables -A INPUT -i ppp0 -p tcp --syn --destination-port ! 80 -j DROP

q稍微有点复杂但q不隄解?br />
最后,如何改变铄现有规则呢?INPUT铑֒OUTPUTN常默认被设|ؓACCEPT而FORWARDN认则被设|ؓDENY。如果你打算把一? 计算Z\由器Q你可能要设|FORWARD规则为ACCEPT。如何做q个Q事实上很简单。只要?P选项Q在它后面跟上链的名字和你制定的新规? 可以了。例如,把FORWARD链改为ACCEPT规则Q我们这样做Q?br />
CODE:
iptables -P FORWARD ACCEPT


Alex 2006-06-06 16:58 发表评论
]]>
[转]RHEL AS 3 安装及启?Oracle10g 指南http://www.oiklr.tw/alex/archive/2006/05/09/45191.htmlAlexAlexTue, 09 May 2006 05:12:00 GMThttp://www.oiklr.tw/alex/archive/2006/05/09/45191.htmlhttp://www.oiklr.tw/alex/comments/45191.htmlhttp://www.oiklr.tw/alex/archive/2006/05/09/45191.html#Feedback5http://www.oiklr.tw/alex/comments/commentRss/45191.htmlhttp://www.oiklr.tw/alex/services/trackbacks/45191.html 转自: q里

1. 配置RedHat AS 3

操作pȝ版本Q?
Red Hat Enterprise Linux AS release 3 (Taroon)
Kernel 2.4.21-4.EL on an i686
按照常规来安装操作系l?记得要安装开发工?gcc{必要工?.

1.1 查必要的g信息

查内?/font> 最?/font> 查命令参?/font>
物理内存 512M # grep MemTotal /proc/meminfo
交换I间 1.0 GB或?倍内存大?/font> # grep SwapTotal /proc/meminfo
/tmp I间 400 MB # df -k /tmp
软g所需I间 2.5 GB # df -k (I间大好,如果是正式系l?应该q行详尽的规?
数据库文?/font> 1.2 GB # df -k (I间大好,如果是正式系l?应该q行详尽的规?
查完如上各项之后, 应该修改核心参数.执行如下命o:

#vi /etc/sysctl.conf

#注释:
#表示使用root用户操作,$表示使用oracle 用户q行操作.提示W后面的蓝色部分表示需要输入的命oQ以下同Q?

在该文g末尾加入如下内容:
kernel.shmall = 2097152
kernel.shmmax = 2147483648
kernel.shmmni = 4096
kernel.sem = 250 32000 100 128
fs.file-max = 65536
net.ipv4.ip_local_port_range = 1024 65000

~辑完之?保存,执行 # /sbin/sysctl -p 命o操作来我们所做的变更生效.
?上面kernel.shmmax/kernel.sem{是典型的核心参数配|?您可能需要根据您的实际环境进行适当的变?

关于q些核心参数的说明在Oracle?Oracle9i Installation Guide Release 2 (9.2.0.1.0) for UNIX Systems 中有很详l的说明.( http://download-west.oracle.com/docs/html/A96167_01/toc.htm )

然后,应该查一下上面的操作是否正确:
# /sbin/sysctl -a | grep sem
# /sbin/sysctl -a | grep shm
# /sbin/sysctl -a | grep file-max
# /sbin/sysctl -a | grep ip_local_port_range

为Oracle用户讑֮Shell的限?br />一般来_Z性能上的考虑,q需要需要进行如下的讑֮Q以便改qOracle用户的有?nofile(可打开的文件描q符的最大数)和nproc(单个用户可用的最大进E数?

# vi /etc/security/limits.conf
# d如下的行

*               soft    nproc   2047
*               hard    nproc   16384
*               soft    nofile  1024
*               hard    nofile  65536

d如下的行?etc/pam.d/login 文gQ?
session    required     /lib/security/pam_limits.so

~辑 /etc/profile 文g,d如下部分Q?
if [ $USER = "oracle" ]; then 
        if [ $SHELL = "/bin/ksh" ]; then 
                ulimit -p 16384 
                ulimit -n 65536 
        else 
                ulimit -u 16384 -n 65536 
        fi 
fi
之后Q执?font color="#0000ff">$ ulimit
验证一?

1.2 查ƈ安装相关补丁
在这个版本的RHEL上安装Oracle,必须要有几个软g? 认以下 rpm包都已经安装:

make-3.79
binutils-2.11
openmotif-2.2.2-16
setarch-1.3-1
compat-db-4.0.14.5
compat-gcc-7.3-2.96.122
compat-gcc-c++-7.3-2.96.122
compat-libstdc++-7.3-2.96.122
compat-libstdc++-devel-7.3-2.96.122

# rpm -qa | grep compat
# 在机器上输出如下:

compat-gcc-c++-7.3-2.96.122
compat-libstdc++-7.3-2.96.122
compat-libstdc++-devel-7.3-2.96.122
compat-glibc-7.x-2.2.4.32.5
compat-db-4.0.14-5
compat-gcc-7.3-2.96.122

# rpm -qa | grep openmotif
openmotif-devel-2.2.2-16
openmotif-2.2.2-16

# rpm -qa | grep setarch
setarch-1.3-1


上面昄的内Ҏ在笔者已l安装了具体的RPM包之后的l果.一般情况下,你的pȝ上的输出l果和这个不?如果个别包没有安?把系l安装光盘mount?扑ֈ具体的Y件包(大多数在W三张光盘上),然后利用如下的命令来安装相应的包:
# rpm -ivh *.rpm

要额外注意的?q些软g包之间是有依赖性的,先后的顺序要扑֥.否则会报告不能安装的错误. 此外Q最好验证一?gcc和glibc的版?要求是gcc-3.2.3-2 或者更?:
#gcc -v
#rpm -q glibc

1.3 创徏用户和相关的l?/strong>
# /usr/sbin/groupadd oinstall
# /usr/sbin/groupadd dba
# /usr/sbin/useradd -g oinstall -G dba oracle
 

如果只是试目的的话Q不创徏oinstalll也没什? 不过q是规范一Ҏ较好.如果oracle 用户和dbal等已经存在Q作适当的调整即?

1.4 查ƈ调整环境变量
d为oracle用户

# su - oracle
$ cd
$ vi .bash_profile

#d如下内容,你的具体值应该不会和q个完全相同.
export ORACLE_BASE=/oracle
export ORACLE_HOME=$ORACLE_BASE/product/dbse
export ORACLE_SID=orcl
export PATH=$PATH:$HOME/bin:$ORACLE_HOME/bin
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/usr/lib
export LC_CTYPE=en_US.UTF-8

然后执行
$ source .bash_profile

使环境变量生? /oracle {目录应该徏立好q做合适的授权.

2. 安装Orale10g
mount安装?׃10g无法以root安装Q以前面建的oracle用户d.执行:

$ ./runInstaller

按照提示安装卛_Q最后还需要以rootq行两个脚本?/font>

3. 配置TNS参数
?/oracle/product/dbse/network/admin/ 目录下有 listener.ora ?tnsnames.ora 两个文gQ设|如下:

#listener.ora
SID_LIST_LISTENER =
  (SID_LIST =
     (SID_DESC =
      (GLOBAL_DBNAME = orcl)
      (ORACLE_HOME = /oracle/product/dbse)
      (SID_NAME = orcl)
     )
  )

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
        (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC))
        )
        (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.100)(PORT = 1521))
        )
    )
  )

#tnsnames.ora
ORCL =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.100)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = orcl)
    )
  )

EXTPROC_CONNECTION_DATA =
  (DESCRIPTION =
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC))
        (CONNECT_DATA =
      (SID = PLSExtProc)
      (PRESENTATION = RO)
    )
  )

其中SERVICE_NAME与SID_NAME一定要?bash_profile中的ORACLE_SID怸_否则无法启动

4. 启动Oracle
以oracle用户d

4.1 启动TNS监听?/strong>
$ lsnrctl start
出现如下昄Q表C监听服务成功开?br />LSNRCTL for Linux: Version 10.2.0.1.0 - Production on 22-FEB-2006 10:24:03

Copyright (c) 1991, 2005, Oracle.  All rights reserved.

Starting /oracle/product/dbse/bin/tnslsnr: please wait...

TNSLSNR for Linux: Version 10.2.0.1.0 - Production
System parameter file is /oracle/product/dbse/network/admin/listener.ora
Log messages written to /oracle/product/dbse/network/log/listener.log
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC)))
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.1.100)(PORT=1521)))

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC)))
STATUS of the LISTENER
------------------------
Alias                     LISTENER
Version                   TNSLSNR for Linux: Version 10.2.0.1.0 - Production
Start Date                22-FEB-2006 10:24:03
Uptime                    0 days 0 hr. 0 min. 0 sec
Trace Level               off
Security                  ON: Local OS Authentication
SNMP                      OFF
Listener Parameter File   /oracle/product/dbse/network/admin/listener.ora
Listener Log File         /oracle/product/dbse/network/log/listener.log
Listening Endpoints Summary...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.1.100)(PORT=1521)))
Services Summary...
Service "orcl" has 1 instance(s).
  Instance "orcl", status UNKNOWN, has 1 handler(s) for this service...
The command completed successfully


4.2启动数据?/strong>
9i 之后已经没有 svrmgrl 了,所有的理工作都通过 sqlplus 来完成:
$ sqlplus /nolog
SQL> connect system/change_on_install as sysdba
SQL> startup

出现如下昄Q表COracle已经成功启动
ORACLE instance started.

Total System Global Area  285212672 bytes
Fixed Size                  1218968 bytes
Variable Size              88082024 bytes
Database Buffers          188743680 bytes
Redo Buffers                7168000 bytes
Database mounted.
Database opened.

4.3 自动启动与关?/strong>

~辑 /etc/oratab Q把所有的 instance 的重启动标志讄?'Y'Q如:
orcl:/oracle/product/dbse:Y

做一个启动脚?/etc/init.d/dbora Q如下所C?

#!/bin/sh
# description: Oracle auto start-stop script.
# chkconfig: - 20 80
#
# Set ORA_HOME to be equivalent to the $ORACLE_HOME
# from which you wish to execute dbstart and dbshut;
#
# Set ORA_OWNER to the user id of the owner of the
# Oracle database in ORA_HOME.

ORA_HOME=/oracle/product/dbse
ORA_OWNER=oracle
if [ ! -f $ORA_HOME/bin/dbstart ]
then
echo "Oracle startup: cannot start"
exit
fi
case "$1" in
'start')

# Start the Oracle databases:
# The following command assumes that the oracle login
# will not prompt the user for any values

su - $ORA_OWNER -c $ORA_HOME/bin/dbstart
su - $ORA_OWNER -c "$ORA_HOME/bin/lsnrctl start"
;;
'stop')

# Stop the Oracle databases:
# The following command assumes that the oracle login
# will not prompt the user for any values

su - $ORA_OWNER -c "$ORA_HOME/bin/lsnrctl stop"
su - $ORA_OWNER -c $ORA_HOME/bin/dbshut
;;
'restart')
$0 stop
$0 start
;;
esac

赋予执行权限
chmod 750 /etc/init.d/dbora

作成以下链接:
ln -s /etc/init.d/dbora /etc/rc0.d/K10dbora
ln -s /etc/init.d/dbora /etc/rc3.d/S99dbora


执行以下命o:
chkconfig --level 345 dbora on

q样OK了。下ơ开x的时候,Oracle也会随之启动/停止?/font>

参考信?/font>

http://www.dbanotes.net



Alex 2006-05-09 13:12 发表评论
]]>
2013粶Ϸ ϿʮֿԤ ʱʱƭ ̨ô׬Ǯ pk10ţţԤ 11ѡ5ͼ nba2kol2 3dԤ 㽭ֲͼ ͨ ֻ ˿© ij52033ֵ ӮƱַ âѶĶ׬Ǯ 㶫36ѡ7н mx47 cnϷ ɽӾ̳𿪽ѯ