http://www-128.ibm.com/developerworks/cn/linux/shell/awk/awk-1/index.html
在php中有没有这样的函数呢,恳请高人指点。最好是能给一个源代码,谢谢了。
gethostbyname()
操作系统命令nslookup
http://blog.wangyuhui.net/vi-tips/

vi 里面实现批量字符串替换:
1、打开文件
2、ESC
3、shift + :
4、输入%s/from/to/g, 其中%s表示替换,from是被替换的字符串,to是替换后的,g表示global
如果要替换11到22行,则:34,78s/from/to/

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

上下左右:
ctrl+u/d 上下半屏,ctrl+f/b,上下一屏
H/G屏幕头/文章末 ,0/$ 行首行末

增删改:
yy/dd 复制/删除 一行,p/P:将yy/dd的内容paste出来
I/A 在行首/末添加, o/O 开新行,d0/d$ 删除到行首,行末
u:undo查:
? 向前查找, n/N 重复上一次查找

—————————————————————————

文本处理命令:

awk:处理结构化的文本(每行以固定符号分成若干列),提取打印某些字段,如:
ls -l|awk ‘{print $1}’ –将ls-l结果的第一列打印出来
awk -F”:” ‘{print $1″ “$6}’ /etc/passwd ,将以:分割的/etc/passwd文件的第1,6列打印出来,中间以空格分开
详见IBM DW中国的AWK实例(共3篇) 或 Bash新手指南中文版第6章。

grep:过滤,大家用得最多的命令,支持正则表达式。参数有:
-i忽略大小写,-n显示line number,-c 统计在每个文件的出现次数,-l只显示符合的文件的名字。

sed:流编辑器,主要用于替换,如:
sed -e ‘1,10s/foo/bar/g’ myfile2.txt 将1到10行的文本中的foo 替换成bar,s代表替换,g代表全局替换
支持正则的替换字符串,可以只替换某个范围内的内容。
用法不算简单,详见IBM DW中国的Sed实例(共3篇)或 Bash新手指南中文版第5章。

sort:排序,参数有:
-r逆序, -n 数字比较 , -M 日历比较 Feb,Dec, -f 忽略大小写
同样支持结构化文件,如
sort -t : -k 1,1 /etc/passwd,以: 分割,只按第1列排序
sort -t : -k 1,1 -k2.2,3.4 /etc/passwd ,以:分割,先按第1列排序,再按第2列的第二个字符到第3列的第4个字符排序。

uniq:去除重复行。
除了正常用法外,还有-c统计重复次数,和-u (唯一)和 -d (重复)两个参数,只显示唯一的和重复的行。

http://www.chinahtml.com/databases/4/2005/11299916311055.shtml
find . -name TEMP -mtime +3 | xargs rm
http://warran.blueidea.com/archives/2007/4803.shtml

https://memcached.org/downloads
Debian/Ubuntu: apt-get install libevent-dev Redhat/Centos: yum install libevent-devel 。
经实践,它本质上是使用了这个libevent,并不是libevent-devel,但编译时应该需要这个libevent-devel库,libevent-devel在用yum安装时会把libevent库给以依赖的形式下载下来,于是运行正常。


验证libevent-devel是和libevent包是有yum有依赖的:
1 LDAP是什么
       LDAP是一个用来发布目录信息到许多不同资源的协议。通常它都作为一个集中的地址本使用,不过根据组织者的需要,它可以做得更加强大。
  LDAP最基本的形式是一个连接数据库的标准方式。该数据库为读查询作了优化。因此它可以很快地得到查询结果,不过在其它方面,例如更新,就慢得多。要特别注意的是,LDAP通常作为一个hierarchal数据库使用,而不是一个关系数据库。因此,它的结构用树来表示比用表格好。正因为这样,就不能用SQL语句了。

  简单说来,LDAP是一个得到关于人或者资源的集中、静态数据的快速方式。

   LDAP是轻量目录访问协议(Lightweight Directory Access Protocol)的缩写,其实是一话号码簿,类似于我们所使用诸如NIS(Network Information Service)、DNS (Domain Name Service)等网络目录,也类似于你在花园中所看到的树木。
   LDAP是一种特殊的数据库。但是LDAP和一般的数据库不同,明白这一点是很重要的。 LDAP对查询进行了优化,与写性能相比LDAP的读性能要优秀很多。
1.1 LDAP的存储规则
   区分名(DN,Distinguished Name)
   和自然界中的树不同,文件系统/LDAP/电话号码簿目录的每一片枝叶都至少有一个独一无二的属性,这一属性可以帮助我们来区别这些枝叶。
   在文件系统中, 这些独一无二的属性就是带有完整路径的文件名。比如/etc/passwd,该文件名在该路径下是独一无二的。当然我们可以有/usr/passwd, /opt/passwd,但是根据它们的完整路径,它们仍然是唯一的。
   在LDAP中,一个条目的区分名称叫做“dn”或者叫做区分名。在一个目录中这个名称总是唯一的。比如,我的dn是"uid= aghaffar, ou=People, o=developer.ch"。不可能有相同的dn,但是我们可以有诸如"uid=aghaffar, ou=Administrators, o=developer.ch"的dn。这同上面文件系统中/etc/passwd 和 /usr/passwd的例子很类似。
   我们有独一无二的属性,在"ou=Administrators, o=developer.ch" 中uid和在"ou=People, o=developer.ch"中的uid。这并不矛盾。
CN=Common Name 为用户名或服务器名,最长可以到80个字符,可以为中文;
OU=Organization Unit为组织单元,最多可以有四级,每级最长32个字符,可以为中文;
O=Organization 为组织名,可以3—64个字符长
C=Country为国家名,可选,为2个字符长

   LDAP目录以一系列“属性对”的形式来存储记录项,每一个记录项包括属性类型和属性值(这与关系型数据库用行和列来存取数据有根本的不同)。
mail = testmail@mccc.net
othermailbox = testmailother@mccc.com
givenname = givenname
sn = test sn
属性可添加,以下一个属性必须赋值:
objectclass=person (值为:person 或 server 或 organization 或 其他自定义的值)

2 Php如何操作LDAP
2.1 Php如何与LDAP连接和关闭
$ds=ldap_connect("ServerName")
ServerName是LDAP的服务器名,

例:
$ds=ldap_connect(“10.31.172.30:1000”)
返回值是:true 或 false

关闭连接
ldap_close($ds);

2.2 在php中如何搜索用户信息


$ds=ldap_connect("10.31.172.30:1000");
//首先连接上服务器
$justthese = array("cn","userpassword",”location”);
//搜索函数中的一个参数,要求返回哪些信息,
//以上传回cn,userpassword,location,这些都要求小写
$sr=ldap_search($ds,"o=jite", "cn=dom*",$justthese);
//第一个参数开启LDAP的代号
//第二个参数最基本的 dn 条件值 , 例:”o=jite,c=cn”
//第三个参数 filter 为布林条件,它的语法可以在 Netscape 站上找一份 dirsdkpg.pdf 档案.
// ’o’为组织名,’cn’ 为用户名,用户名可用通配符 ’*’
echo "domadmin姓氏有".ldap_count_entries($ds,$sr)." 个

";
//ldap_count_entries($ds,$sr)传回记录总数

$info = ldap_get_entries($ds, $sr);
//LDAP的全部传回资料
echo "资料传回 ".$info["count"]."笔:

";
for ($i=0; $i<$info["count"]; $i++) {
echo "dn为:". $info[$i]["dn"] ."
";
echo "cn为:". $info[$i]["cn"][0] ."
"; //显示用户名
echo "email为:". $info[$i]["mail"][0] ."

"; //显示mail
echo "email为:". $info[$i][“userpassword"][0] ."

"; //显示加密后的密码
}
2.3 添加用户
$ds=ldap_connect("10.31.172.30:1000");
//首先连接上服务器
$r=ldap_bind($ds,"cn=domadmin,o=jite","password");
//系住一个管理员,有写的权限
// cn=domadmin,o=jite顺序不能变
$info["cn"]="aaa"; //必填
$info["userpassword"]="aaa";
$info["location"]="shanghai";
$info["objectclass"] = "person"; //必填person为个人,还有server…
ldap_add($ds, "cn=".$info["cn"].",o=jite", $info);
ldap_unbind($ds);
//取消绑定
ldap_close($ds);
//关闭连接
2.4 删除用户
$ds=ldap_connect("10.31.172.30:1000");
//首先连接上服务器
ldap_bind($ds,"cn=domadmin,o=jite","password");
//绑定管理员,有删除的权限
$dn="cn=dingxf,o=jite";
ldap_delete($ds, $dn);
//删除用户
ldap_unbind($ds);
//取消绑定
ldap_close($ds);
//关闭连接
2.5 修改用户资料
$ds=ldap_connect("10.31.172.30:1000");
//首先连接上服务器
ldap_bind($ds,"cn=domadmin,o=jite","password");
//绑定管理员,有修改的权限
$dn="cn=dingxf,o=jite";
//用户dn
$info["userpassword"]="aaa"; //要修改的信息,放在数组变量中
$info["location"]="shanghaisdaf";

ldap_modify($ds, $dn , $info);
//修改函数
ldap_unbind($ds);
//取消绑定
ldap_close($ds);
//关闭连接
2.6 用户登录验证
$ds=ldap_connect("10.31.172.30:1000");
//首先连接上服务器
if (ldap_bind($ds,"cn=dingxf,o=jite","dingxf")){
echo "验证通过";
}else{
echo "验证不通过";
}
ldap_unbind($ds);
//取消绑定
ldap_close($ds);
//关闭连接

LDAP是什么
LDAP是一个用来发布目录信息到许多不同资源的协议。通常它都作为一个集中的地址本使用,不过根据组织者的需要,它可以做得更加强大。
 
 
 
 
  LDAP最基本的形式是一个连接数据库的标准方式。该数据库为读查询作了优化。因此它可以很快地得到查询结果,不过在其它方面,例如更新,就慢得多。要特别注意的是,LDAP通常作为一个hierarchal数据库使用,而不是一个关系数据库。因此,它的结构用树来表示比用表格好。正因为这样,就不能用SQL语句了。

  简单说来,LDAP是一个得到关于人或者资源的集中、静态数据的快速方式。

LDAP是轻量目录访问协议(Lightweight Directory Access Protocol)的缩写,其实是一话号码簿,类似于我们所使用诸如NIS(Network Information Service)、DNS (Domain Name Service)等网络目录,也类似于你在花园中所看到的树木。
LDAP是一种特殊的数据库。但是LDAP和一般的数据库不同,明白这一点是很重要的。 LDAP对查询进行了优化,与写性能相比LDAP的读性能要优秀很多。
1.1 LDAP的存储规则
区分名(DN,Distinguished Name)
和自然界中的树不同,文件系统/LDAP/电话号码簿目录的每一片枝叶都至少有一个独一无二的属性,这一属性可以帮助我们来区别这些枝叶。
在文件系统中, 这些独一无二的属性就是带有完整路径的文件名。比如/etc/passwd,该文件名在该路径下是独一无二的。当然我们可以有/usr/passwd, /opt/passwd,但是根据它们的完整路径,它们仍然是唯一的。
在LDAP中,一个条目的区分名称叫做“dn”或者叫做区分名。在一个目录中这个名称总是唯一的。比如,我的dn是"uid=aghaffar, ou=People, o=developer.ch"。不可能有相同的dn,但是我们可以有诸如"uid=aghaffar, ou=Administrators, o=developer.ch"的dn。这同上面文件系统中/etc/passwd 和 /usr/passwd的例子很类似。
我们有独一无二的属性,在"ou=Administrators, o=developer.ch" 中uid和在"ou=People, o=developer.ch"中的uid。这并不矛盾。
CN=Common Name 为用户名或服务器名,最长可以到80个字符,可以为中文;
OU=Organization Unit为组织单元,最多可以有四级,每级最长32个字符,可以为中文;
O=Organization 为组织名,可以3—64个字符长
C=Country为国家名,可选,为2个字符长

LDAP目录以一系列“属性对”的形式来存储记录项,每一个记录项包括属性类型和属性值(这与关系型数据库用行和列来存取数据有根本的不同)。
mail = testmail@mccc.net
othermailbox = testmailother@mccc.com
givenname = givenname
sn = test sn
属性可添加,以下一个属性必须赋值:
objectclass=person (值为:person 或 server 或 organization 或 其他自定义的值)

2 Php如何操作LDAP
2.1 Php如何与LDAP连接和关闭
$ds=ldap_connect("ServerName")
ServerName是LDAP的服务器名,

例:
$ds=ldap_connect(“10.31.172.30:1000”)
返回值是:true 或 false

关闭连接
ldap_close($ds);

2.2 在php中如何搜索用户信息

$ds=ldap_connect("10.31.172.30:1000");
//首先连接上服务器
$justthese = array("cn","userpassword",”location”);
//搜索函数中的一个参数,要求返回哪些信息,
//以上传回cn,userpassword,location,这些都要求小写
$sr=ldap_search($ds,"o=jite", "cn=dom*",$justthese);
//第一个参数开启LDAP的代号
//第二个参数最基本的 dn 条件值 , 例:”o=jite,c=cn”
//第三个参数 filter 为布林条件,它的语法可以在 Netscape 站上找一份 dirsdkpg.pdf 档案.
// ’o’为组织名,’cn’ 为用户名,用户名可用通配符 ’*’
echo "domadmin姓氏有".ldap_count_entries($ds,$sr)." 个

";
//ldap_count_entries($ds,$sr)传回记录总数

$info = ldap_get_entries($ds, $sr);
//LDAP的全部传回资料
echo "资料传回 ".$info["count"]."笔:

";
for ($i=0; $i<$info["count"]; $i++) {
echo "dn为:". $info[$i]["dn"] ."
";
echo "cn为:". $info[$i]["cn"][0] ."
"; //显示用户名
echo "email为:". $info[$i]["mail"][0] ."

"; //显示mail
echo "email为:". $info[$i][“userpassword"][0] ."

"; //显示加密后的密码
}
2.3 添加用户
$ds=ldap_connect("10.31.172.30:1000");
//首先连接上服务器
$r=ldap_bind($ds,"cn=domadmin,o=jite","password");
//系住一个管理员,有写的权限
// cn=domadmin,o=jite顺序不能变
$info["cn"]="aaa"; //必填
$info["userpassword"]="aaa";
$info["location"]="shanghai";
$info["objectclass"] = "person"; //必填person为个人,还有server…
ldap_add($ds, "cn=".$info["cn"].",o=jite", $info);
ldap_unbind($ds);
//取消绑定
ldap_close($ds);
//关闭连接
2.4 删除用户
$ds=ldap_connect("10.31.172.30:1000");
//首先连接上服务器
ldap_bind($ds,"cn=domadmin,o=jite","password");
//绑定管理员,有删除的权限
$dn="cn=dingxf,o=jite";
ldap_delete($ds, $dn);
//删除用户
ldap_unbind($ds);
//取消绑定
ldap_close($ds);
//关闭连接
2.5 修改用户资料
$ds=ldap_connect("10.31.172.30:1000");
//首先连接上服务器
ldap_bind($ds,"cn=domadmin,o=jite","password");
//绑定管理员,有修改的权限
$dn="cn=dingxf,o=jite";
//用户dn
$info["userpassword"]="aaa"; //要修改的信息,放在数组变量中
$info["location"]="shanghaisdaf";

ldap_modify($ds, $dn , $info);
//修改函数
ldap_unbind($ds);
//取消绑定
ldap_close($ds);
//关闭连接
2.6 用户登录验证
$ds=ldap_connect("10.31.172.30:1000");
//首先连接上服务器
if (ldap_bind($ds,"cn=dingxf,o=jite","dingxf")){
echo "验证通过";
}else{
echo "验证不通过";
}
ldap_unbind($ds);
//取消绑定
ldap_close($ds);
//关闭连接




注:此方法比较简单,实用,它也有不足之处,如果不通过,ldap_bind()提示它自带的提示语:”Warning: LDAP: Unable to bind to server: Inappropriate authentication in /home/htdocs/jldl.net/ldap/test.php3 on line 16”进入讨论组讨论。

mount -t vfat /dev/sda /mnt/u

先到硬件浏器看是哪个。。。。然后再挂载。。
挂载ISO镜像:
mount -t iso9660 -o loop /home/xiangdong2/CentOS-5.2-i386-bin-DVD.iso /mnt/iso

卸载:
umount /mnt/iso/


FreeBsd:

mdconfig -a -t vnode -f  /data0/Centos/CentOS-5.2-x86_64-bin-DVD.iso -u 1 mount_cd9660 /dev/md1 /mnt/iso

先插入我们的外接USB的DVD,后看下:
ls -lart /dev
就会看到多一个:dvd->sr0,于是用mount命令如下:

     本文将演示如何使用php连接一个ldap服务器。具体的例子是连接到一个公共的ldap服务器并且进行搜索。这个例子模拟的是netscape communicator 4.*,通过自己的地址本连接到ldap资源。
ldap介绍

  可能不少人已经听说过ldap,但是却不了解它具体是什么东东和如何工作。在这里我将不会很详细地介绍ldap,只是对该协议做一个简介。

  ldap是一个用来发布目录信息到许多不同资源的协议。通常它都作为一个集中的地址本使用,不过根据组织者的需要,它可以做得更加强大。

  ldap最基本的形式是一个连接数据库的标准方式。该数据库为读查询作了优化。因此它可以很快地得到查询结果,不过在其它方面,例如更新,就慢得多。要特别注意的是,ldap通常作为一个hierarchal数据库使用,而不是一个关系数据库。因此,它的结构用树来表示比用表格好。正因为这样,就不能用 sql语句了。

  简单说来,ldap是一个得到关于人或者资源的集中、静态数据的快速方式。

要求

   phpv.4(以前的版本也可以,不过没有经过测试),编译支持ladp,即使用编译时带--with-ldap公共的ldap目录。在例子中提供了两个。

例子概览

1.设置公共ldap服务器的信息
2.创建一个ldap查询
3.连接到ldap服务器
4.如果连接成功,处理查询
5.格式化输出
6.关闭连接
7.设计搜索界面的html表格
8.显示结果

设置公共ldap服务器的信息

  我们要做的第一件事情是定义所有欲搜索的ldap服务器的信息

"ldap_name" = 新的ldap项目的名字
"ldap_server" = 新的ldap项目的ip地址或者主机名
"ldap_root_dn" = 新的ldap项目的根的辨识名

<?php

$ldap_name[0] = "netscape net center";
$ldap_server[0] = "memberdir.netscape.com";
$ldap_root_dn[0] = "ou=member_directory,o=netcenter.com";

$ldap_name[1] = "bigfoot";
$ldap_server[1] = "ldap.bigfoot.com";
$ldap_root_dn[1] = "";



//如果没有选择服务器的话将它设置为0
if(!$server_id)
$server_id=0;

?>

建立ldap查询

  前面已经提到,ldap查询与sql查询是不一样的。因此,语句要受到一定的限制,以下是一个基本的例子。

//create query $ldap_query = "cn=$common";

  在我们的例子中,“cn”是我们要进行搜索的属性,而$common是由搜索的form中得到的字符串变量。ldap的查询语句语句可使用通配符‘*’。例如‘$stanley’将可以找出‘dan stanley’。

连接到ldap服务器

  以下的函数连接到一个ldap资源,并且将连接的识别号赋给一个变量,就好象连接到一个通常的数据库一样,例如mysql。

<?php

//连接到ldap
$connect_id = ldap_connect($ldap_server[$server_id]);

?>

  在我们的例子中,“$connect_id”是连接的识别号,$ldap_server是可能的ldap服务器数组,而$server_id是由搜索表格得到的ldap服务器变量。

如果连接成功,处理查询

   如果连接成功的话,我们将得到一个有效的ldap连接识别号,这样我们就可以处理查询。

<?php

if($connect_id)
{
//认证
$bind_id = ldap_bind($connect_id);

//执行搜索
$search_id = ldap_search($connect_id, $ldap_root_dn[$server_id], $ldap_query);

//将结果集合分配给一个数组
$result_array = ldap_get_entries($connect_id, $search_id);
}
else
{
//显示连接错误
echo "could not connect to ldap server: $ldap_server[$server_id]";
}

?>

  一旦我们与ldap服务器建立好连接,我们就必须进行认证。php在连接大多数的数据库时,都是通过发送用户名和密码来进行的。不过,在ldap中,认证是未知的,直到进行一个bind操作。在我们的例子中,“$bind_id”是绑定连接的标识符。我们是通过匿名绑定到公共的ldap服务器的。因此,在执行ldap_bind()时,只使用连接识别号就可以了,无需其它的参数。

  在经过认证后(这里是匿名的),我们就可以使用ldap_search()函数来执行查询,产生的$search_id是我们搜索的连接识别符。

  然后,我们使用ldap_get_entries()函数将结果集赋给$result_array变量。这样我们能够以逻辑的方式排列信息,以便显示。
格式化输出

  在执行完ldap搜索后,返回的数据是以查找的顺序排列的。不过我们在排序时没有sql这样方便,使用order by语句就可以了。通常多数公共的ldap目录都没有标准的大小规范。排序是基于字符的ascii值,我们必须将字符全部格式化为小写,以便按字母的顺序输出。

  要特别注意的是,返回的ldap结果集是一个多维的数组。因此,我们脚本中的$result_array的结构如下:

$result_array[0]["cn"] [0] = "dannie stanley"
["dn"] [0] = "uid=dannie,dc=spinweb.net"
["givenname"][0] = "dannie"
["sn"] [0] = "stanley"
["mail"] [0] = "danspam@spinweb.net"
$result_array[1]["cn"] [0] = "michael reynolds"
["dn"] [0] = "uid=michael,dc=spinweb.net"
["givenname"][0] = "michael"
["sn"] [0] = "reynolds"
["mail"] [0] = "michaelspam@spinweb.net"

  数据以这种格式存放的原因是每个属性都可能有超过一个值(象树的结构)。例如,如果我的名字是‘dannie’,我还可以在ldap中增加一些属性,例如:

$result_array[0]["cn"] [0] = "dannie stanley"
["dn"] [0] = "uid=dannie,dc=spinweb.net"
["givenname"][0] = "dannie"
["givenname"][0] = "dan"
["sn"] [0] = "stanley"
["mail"] [0] = "danspam@spinweb.net"

  在我们的搜索中,我们只关心每个属性的首个值,因此除了dn只有一个值外,其它我们只使用每个属性中序号为0的值。以下就是属性和它们含义的简单列表:

"cn" = common name
"dn" = distinguished name
"givenname" = first name
"sn" = last name
"mail" = email地址

<?php

//如果搜索成功,将结果排序
if($result_array)
{
for($i=0; $i {
$format_array[$i][0] = strtolower($result_array[$i]["cn"][0]);
$format_array[$i][1] = $result_array[$i]["dn"];
$format_array[$i][2] = strtolower($result_array[$i]["givenname"][0]);
$format_array[$i][3] = strtolower($result_array[$i]["sn"][0]);
$format_array[$i][4] = strtolower($result_array[$i]["mail"][0]);
}

//排序数组
sort($format_array, "sort_string");

for($i=0; $i {
$cn = $format_array[$i][0];
$dn = $format_array[$i][1];
$fname = ucwords($format_array[$i][2]);
$lname = ucwords($format_array[$i][3]);
$email = $format_array[$i][4];

if($dn && $fname && $lname && $email)
{
$result_list .= "$fname $lname";
$result_list .= " <$email>
";
}
elseif($dn && $cn && $email)
{
$result_list .= "<a href='/"ldap://$ldap_server[$server_id]/$dn/"'>$cn</a>";
$result_list .= " <a href='/"mailto:$email/"'>$email</a>
";
}
}
}
else
{
echo "result set empty for query: $ldap_query";
}

?>
  在我们的例子中,$format_array是我们建立的新数组,里面包括有查询的结果,并且被格式化用作输出。首先循环$result_array中的每个元素,并且将它分配给一个两维的数组用作排序。同时我们使用strtolower()函数将所有的值变为小写。

  接着,我们使用php自带的一个称为sort()的函数进行排序。首个参数是要排序的数组,另一个是要执行的排序类型,该类型是由php的文档定义的。由于我们根据字符串排序,我们使用“sort_string”。

  第三,我们循环已经格式化好的数组,并且将它分配给一个名字为$result_list的输出字符,该字符包含了html描述。要特别注意的是,在超链接中,我使用的是ldap的url格式。这个格式的例子类似:href="ldap://ldap.domain.net/uid=dannie,dc= domain.net"。

关闭连接

  现在我们所有的数据已经包含在$result_list中了,我们可以安全地关闭ldap的连接。

<?php

//关闭连接
ldap_close($connect_id);

定制搜索界面的html表格

  最后,我们要定制搜索用的html表格,它是用来给用户执行搜索的。

//定制表格
echo " <center><form action='"$php_self"' method='"get"'>";
echo "search in:<select name='"server_id"'>"; //循环以建立select选项 for($i=0; $i<count($ldap_name); <br $i++)> echo "<option selected value='"$i"'>".$ldap_name[$i]."</option>"; echo "</select>
";
echo "search for:<input name='"common"' type='"text"'>";
echo "<input name='"lookup"' type='"submit"' value='"go"'>
";
echo "(you can use * for wildcard searches, ex. * stanley will find all stanleys)
";
echo "</form></center>";

?>

  代码中的$php_self是一个全局的常量,代表的是脚本页面自身,其中的循环是用来通过我们的$ldap_name变量创建select选项。

显示结果

  现在所有的工作已经完成了,我们将打印出结果集。如果没有符合的结果,将会显示"no results"的信息。

<<?>php

//显示结果
if($result_list)
{
echo " <center><table border='"1"' cellpadding='"10"' cellspacing='"0"'
bgcolor="#ffffea" width="450"> <tbody><tr><td>$result_list</td></tr>
</tbody></table></center>";
}
else
echo "no results";

?>

源代码

  以下是完整的源代码,只要将它剪切并粘贴到一个html文档,就可以尝试一下了。

<?php

$ldap_name[0] = "netscape net center";
$ldap_server[0] = "memberdir.netscape.com";
$ldap_root_dn[0] = "ou=member_directory,o=netcenter.com";

$ldap_name[1] = "bigfoot";
$ldap_server[1] = "ldap.bigfoot.com";
$ldap_root_dn[1] = "";

//如果没有选择服务器的话将它设置为0
if(!$server_id)
$server_id=0;

//建立查询
$ldap_query = "cn=$common";

//连接到ldap
$connect_id = ldap_connect($ldap_server[$server_id]);

if($connect_id)
{
//认证
$bind_id = ldap_bind($connect_id);

//执行搜索
$search_id = ldap_search($connect_id, $ldap_root_dn[$server_id], $ldap_query);

//将结果集合分配给一个数组
$result_array = ldap_get_entries($connect_id, $search_id);
}
else
{
//显示连接错误
echo "could not connect to ldap server: $ldap_server[$server_id]";
}

//如果搜索成功,将结果排序
if($result_array)
{
for($i=0; $i {
$format_array[$i][0] = strtolower($result_array[$i]["cn"][0]);
$format_array[$i][1] = $result_array[$i]["dn"];
$format_array[$i][2] = strtolower($result_array[$i]["givenname"][0]);
$format_array[$i][3] = strtolower($result_array[$i]["sn"][0]);
$format_array[$i][4] = strtolower($result_array[$i]["mail"][0]);
}

//排序数组
sort($format_array, "sort_string");

for($i=0; $i {
$cn = $format_array[$i][0];
$dn = $format_array[$i][1];
$fname = ucwords($format_array[$i][2]);
$lname = ucwords($format_array[$i][3]);
$email = $format_array[$i][4];

if($dn && $fname && $lname && $email)
{
$result_list .= "<a href='/"ldap://$ldap_server[$server_id]/$dn/"'>$fname $lname</a>";
$result_list .= " <$email>
";
}
elseif($dn && $cn && $email)
{
$result_list .= "<a href='/"ldap://$ldap_server[$server_id]/$dn/"'>$cn</a>";
$result_list .= " <<a href='/"mailto:$email/"'>$email</a>
";
}
}
}
else
{
echo "result set empty for query: $ldap_query";
}

//关闭连接
ldap_close($connect_id);

//定制表格
echo " <center><form action='"$php_self"' method='"get"'>";
echo "search in:<select name='"server_id"'>"; //循环以建立select选项 for($i=0; $i echo "<option selected value='"$i"'>".$ldap_name[$i]."</option>"; echo "</select>
";
echo "search for:<input name='"common"' type='"text"'>";
echo "<input name='"lookup"' type='"submit"' value='"go"'>
";
echo "(you can use * for wildcard searches, ex. * stanley will find all stanleys)
";
echo "</form></center>";

//显示结果
if($result_list)
{
echo " <center><table border='"1"' cellpadding='"10"' cellspacing='"0"'
bgcolor="#ffffea" width="450"> <tbody><tr><td>$result_list</td></tr>
</tbody></table></center>";
}
else
echo "no results";
}

?>
对于刚刚接触Linux的人来说,一定会给Linux下一大堆各式各样的文件名给搞晕。别个不说,单单就压缩文件为例,我们知道在Windows下最常见的压缩文件就只有两种,一是,zip,另一个是.rap。可是Linux就不同了,它有.gz、.tar.gz、tgz、bz2、.Z、.tar等众多的压缩文件名,此外windows下的.zip和.rar也可以在Linux下使用,不过在Linux使用.zip和.rar的人就太少了。本文就来对这些常见的压缩文件进行一番小结,希望你下次遇到这些文件时不至于被搞晕:)

  在具体总结各类压缩文件之前呢,首先要 弄清两个概念:打包和压缩。打包是指将一大堆文件或目录什么的变成一个总的文件,压缩则是将一个大的文件通过一些压缩算法变成一个小文件。为什么要区分这两个概念呢?其实这源于Linux中的很多压缩程序只能针对一个文件进行压缩,这样当你想要压缩一大堆文件时,你就得先借助另它的工具将这一大堆文件先打成一个包,然后再就原来的压缩程序进行压缩。

  Linux下最常用的打包程序就是tar了,使用tar程序打出来的包我们常称为tar包,tar包文件的命令通常都是以.tar结尾的。生成tar包后,就可以用其它的程序来进行压缩了,所以首先就来讲讲tar命令的基本用法:

  tar命令的选项有很多(用man tar可以查看到),但常用的就那么几个选项,下面来举例说明一下:

  # tar -cf all.tar *.jpg
  这条命令是将所有.jpg的文件打成一个名为all.tar的包。-c是表示产生新的包,-f指定包的文件名。

  # tar -rf all.tar *.gif
  这条命令是将所有.gif的文件增加到all.tar的包里面去。-r是表示增加文件的意思。
# tar -uf all.tar logo.gif
  这条命令是更新原来tar包all.tar中logo.gif文件,-u是表示更新文件的意思。

  # tar -tf all.tar
  这条命令是列出all.tar包中所有文件,-t是列出文件的意思

  # tar -xf all.tar
  这条命令是解出all.tar包中所有文件,-t是解开的意思

  以上就是tar的最基本的用法。为了方便用户在打包解包的同时可以压缩或解压文件,tar提供了一种特殊的功能。这就是tar可以在打包或解包的同时调用其它的压缩程序,比如调用gzip、bzip2等。

  1) tar调用gzip

  gzip是GNU组织开发的一个压缩程序,.gz结尾的文件就是gzip压缩的结果。与gzip相对的解压程序是gunzip。tar中使用-z这个参数来调用gzip。下面来举例说明一下:

  # tar -czf all.tar.gz *.jpg
  这条命令是将所有.jpg的文件打成一个tar包,并且将其用gzip压缩,生成一个gzip压缩过的包,包名为all.tar.gz

  # tar -xzf all.tar.gz
  这条命令是将上面产生的包解开。

  2) tar调用bzip2

  bzip2是一个压缩能力更强的压缩程序,.bz2结尾的文件就是bzip2压缩的结果。与bzip2相对的解压程序是bunzip2。tar中使用-j这个参数来调用gzip。下面来举例说明一下:

  # tar -cjf all.tar.bz2 *.jpg
  这条命令是将所有.jpg的文件打成一个tar包,并且将其用bzip2压缩,生成一个bzip2压缩过的包,包名为all.tar.bz2

  # tar -xjf all.tar.bz2
  这条命令是将上面产生的包解开。
3)tar调用compress

  compress也是一个压缩程序,但是好象使用compress的人不如gzip和bzip2的人多。.Z结尾的文件就是bzip2压缩的结果。与compress相对的解压程序是uncompress。tar中使用-Z这个参数来调用gzip。下面来举例说明一下:

  # tar -cZf all.tar.Z *.jpg
  这条命令是将所有.jpg的文件打成一个tar包,并且将其用compress压缩,生成一个uncompress压缩过的包,包名为all.tar.Z

  # tar -xZf all.tar.Z
  这条命令是将上面产生的包解开

  有了上面的知识,你应该可以解开多种压缩文件了,下面对于tar系列的压缩文件作一个小结:

  1)对于.tar结尾的文件

  tar -xf all.tar

  2)对于.gz结尾的文件

  gzip -d all.gz
  gunzip all.gz

  3)对于.tgz或.tar.gz结尾的文件

  tar -xzf all.tar.gz
  tar -xzf all.tgz

  4)对于.bz2结尾的文件

  bzip2 -d all.bz2
  bunzip2 all.bz2

  5)对于tar.bz2结尾的文件

  tar -xjf all.tar.bz2

  6)对于.Z结尾的文件

  uncompress all.Z

  7)对于.tar.Z结尾的文件

  tar -xZf all.tar.z

  另外对于Window下的常见压缩文件.zip和.rar,Linux也有相应的方法来解压它们:

  1)对于.zip

  linux下提供了zip和unzip程序,zip是压缩程序,unzip是解压程序。它们的参数选项很多,这里只做简单介绍,依旧举例说明一下其用法:

  # zip all.zip *.jpg
  这条命令是将所有.jpg的文件压缩成一个zip包
# unzip all.zip
  这条命令是将all.zip中的所有文件解压出来

  2)对于.rar

  要在linux下处理.rar文件,需要安装RAR for Linux,可以从网上下载,但要记住,RAR for Linux
不是免费的;可从http://www.rarsoft.com/download.htm下载RAR for Linux 3.2.0,然后安装:

  # tar -xzpvf rarlinux-3.2.0.tar.gz
  # cd rar
  # make

mkdir -p /usr/local/bin
mkdir -p /usr/local/lib
cp rar unrar /usr/local/bin
cp rarfiles.lst /etc
cp default.sfx /usr/local/lib


  这样就安装好了,安装后就有了rar和unrar这两个程序,rar是压缩程序,unrar是解压程序。它们的参数选项很多,这里只做简单介绍,依旧举例说明一下其用法:

  # rar a all *.jpg
  这条命令是将所有.jpg的文件压缩成一个rar包,名为all.rar,该程序会将.rar 扩展名将自动附加到包名后。

  # unrar e all.rar
  这条命令是将all.rar中的所有文件解压出来

  到此为至,我们已经介绍过linux下的tar、gzip、gunzip、bzip2、bunzip2、compress、 uncompress、zip、unzip、rar、unrar等程式,你应该已经能够使用它们对.tar、.gz、.tar.gz、.tgz、. bz2、.tar.bz2、.Z、.tar.Z、.zip、.rar这10种压缩文件进行解压了,以后应该不需要为下载了一个软件而不知道如何在 Linux下解开而烦恼了。而且以上方法对于Unix也基本有效。

  本文介绍了linux下的压缩程式tar、gzip、gunzip、bzip2、bunzip2、compress、uncompress、 zip、unzip、rar、unrar等程式,以及如何使用它们对.tar、.gz、.tar.gz、.tgz、.bz2、.tar.bz2、.Z、. tar.Z、.zip、.rar这10种压缩文件进行操作。

PHP5中的cookie和session详解

1. PHP的COOKIE

cookie 是一种在远程浏览器端储存数据并以此来跟踪和识别用户的机制。
PHP在http协议的头信息里发送cookie, 因此 setcookie() 函数必须在其它信息被输出到浏览器前调用,这和对 header() 函数的限制类似。

1.1 设置cookie:
   可以用 setcookie() 或 setrawcookie() 函数来设置 cookie。也可以通过向客户端直接发送http头来设置.
1.1.1 使用setcookie()函数设置cookie:
bool setcookie ( string name [, string value [, int expire [, string path [, string domain [, bool secure [, bool httponly]]]]]] )
    name:   cookie变量名
    value:   cookie变量的值
    expire:  有效期结束的时间,
    path:    有效目录,
    domain: 有效域名,顶级域唯一
    secure:  如果值为1,则cookie只能在https连接上有效,如果为默认值0,则http和https都可以.
例子:
$value = 'something from somewhere';

setcookie("TestCookie", $value); /* 简单cookie设置 */
setcookie("TestCookie", $value, time()+3600); /* 有效期1个小时 */
setcookie("TestCookie", $value, time()+3600, "/~rasmus/", ".example.com", 1); /* 有效目录 /~rasmus,有效域名example.com及其所有子域名 */
?>

设置多个cookie变量: setcookie('var[a]','value');用数组来表示变量,但他的下标不用引号.这样就可以用$_COOKIE[‘var’][‘a’]来读取该COOKIE变量.

1.1.2. 使用header()设置cookie;
header("Set-Cookie: name=$value[;path=$path[;domain=xxx.com[;...]]");
后面的参数和上面列出setcookie函数的参数一样.
比如:

$value = 'something from somewhere';
header("Set-Cookie:name=$value");


1.2 Cookie的读取:

直接用php内置超级全局变量 $_COOKIE就可以读取浏览器端的cookie.
上面例子中设置了cookie"TestCookie",现在我们来读取:

print $_COOKIE['TestCookie'];

COOKIE是不是被输出了?!


1.3 删除cookie
只需把有效时间设为小于当前时间, 和把值设置为空.例如:
setcookie("name","",time()-1);
用header()类似.

1.4 常见问题解决:

1) 用setcookie()时有错误提示,可能是因为调用setcookie()前面有输出或空格.也可能你的文档使从其他字符集转换过来,文档后面可能带有BOM签名(就是在文件内容添加一些隐藏的BOM字符).解决的办法就是使你的文档不出现这种情况.还有通过使用ob_start()函数有也能处理一点.
2) $_COOKIE受magic_quotes_gpc影响,可能自动转义
3) 使用的时候,有必要测试用户是否支持cookie



1.5 cookie工作机理:


有些学习者比较冲动,没心思把原理研究,所以我把它放后面.
a) 服务器通过随着响应发送一个http的Set-Cookie头,在客户机中设置一个cookie(多个cookie要多个头).
b) 客户端自动向服务器端发送一个http的cookie头,服务器接收读取.


HTTP/1.x 200 OK
X-Powered-By: PHP/5.2.1
Set-Cookie: TestCookie=something from somewhere; path=/
Expires: Thu, 19 Nov 2007 18:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Content-type: text/html


这一行实现了cookie功能,收到这行后
Set-Cookie: TestCookie=something from somewhere; path=/
浏览器将在客户端的磁盘上创建一个cookie文件,并在里面写入:

TestCookie=something from somewhere;
/

这一行就是我们用setcookie('TestCookie','something from somewhere','/');的结果.也就是用header('Set-Cookie: TestCookie=something from somewhere; path=/');的结果.




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



2. PHP的Session

session使用过期时间设为0的cookie,并且将一个称为session ID的唯一标识符(一长串字符串),在服务器端同步生成一些session文件(可以自己定义session的保存类型),与用户机关联起来.web应用程序存贮与这些session相关的数据,并且让数据随着用户在页面之间传递.

访问网站的来客会被分配一个唯一的标识符,即所谓的会话 ID。它要么存放在客户端的 cookie,要么经由 URL 传递。

会话支持允许用户注册任意数目的变量并保留给各个请求使用。当来客访问网站时,PHP 会自动(如果 session.auto_start 被设为 1)或在用户请求时(由 session_start() 明确调用或 session_register() 暗中调用)检查请求中是否发送了特定的会话 ID。如果是,则之前保存的环境就被重建。

2.1 sessionID的传送

2.1.1 通过cookie传送sessin ID

    使用session_start()调用session,服务器端在生成session文件的同时,生成session ID哈希值和默认值为PHPSESSID的session name,并向客户端发送变量为(默认的是)PHPSESSID(session name),值为一个128位的哈希值.服务器端将通过该cookie与客户端进行交互.
  session变量的值经php内部系列化后保存在服务器机器上的文本文件中,和客户端的变量名默认情况下为PHPSESSID的coolie进行对应交互.
    即服务器自动发送了http头:header('Set-Cookie: session_name()=session_id(); path=/');
即setcookie(session_name(),session_id());
   当从该页跳转到的新页面并调用session_start()后,PHP将检查与给定ID相关联的服务器端存贮的session数据,如果没找到,则新建一个数据集.

2.1.2 通过URL传送session ID
只有在用户禁止使用cookie的时候才用这种方法,因为浏览器cookie已经通用,为安全起见,可不用该方法.
xxx,也可以通过POST来传递session值.

2.2 session基本用法实例

// page1.php
session_start();
echo 'Welcome to page #1';
/* 创建session变量并给session变量赋值 */
$_SESSION['favcolor'] = 'green';
$_SESSION['animal'] = 'cat';
$_SESSION['time'] = time();

// 如果客户端使用cookie,可直接传递session到page2.php
echo '
page 2';

// 如果客户端禁用cookie
echo '
page 2';
/*
默认php5.2.1下,SID只有在cookie被写入的同时才会有值,如果该session
对应的cookie已经存在,那么SID将为(未定义)空
*/
?>

// page2.php
session_start();
print $_SESSION['animal']; // 打印出单个session
var_dump($_SESSION); // 打印出page1.php传过来的session值
?>




2.3 使用session函数控制页面缓存.
   很多情况下,我们要确定我们的网页是否在客户端缓存,或要设置缓存的有效时间,比如我们的网页上有些敏感内容并且要登录才能查看,如果缓存到本地了,可以直接打开本地的缓存就可以不登录而浏览到网页了.

   使用session_cache_limiter('private');可以控制页面客户端缓存,必须在session_start()之前调用.
更多参数见http://blog.chinaunix.net/u/27731/showart.php?id=258087的客户端缓存控制.

    控制客户端缓存时间用 session_cache_expire(int);单位(s).也要在session_start()前调用.

   这只是使用session的情况下控制缓存的方法,我们还可以在header()中控制控制页面的缓存.

2.4 删除session

要三步实现.
session_destroy();                                      // 第一步: 删除服务器端session文件,这使用
setcookie(session_name(),'',time()-3600);  // 第二步: 删除实际的session:
$_SESSION = array();                                  // 第三步: 删除$_SESSION全局变量数组
?>

2.5 session在PHP大型web应用中的使用

对于访问量大的站点,用默认的session存贮方式并不适合,目前最优的方法是用数据库存取session.这时,函数bool session_set_save_handler ( callback open, callback close, callback read, callback write, callback destroy, callback gc )就是提供给我们解决这个问题的方案.
该函数使用的6个函数如下:


1.   bool open() 用来打开会话存储机制,

2.   bool close() 关闭会话存储操作.


3.  mixde read() 从存储中装在session数据时使用这个函数


4.   bool write() 将给定session ID的所有数据写到存储中


5.   bool destroy() 破坏与指定的会话ID相关联的数据


6.   bool gc()  对存储系统中的数据进行垃圾收集


例子见php手册session_set_save_handler() 函数.
如果用类来处理,用
session_set_save_handler(
   array('className','open'),
   array('className','close'),
   array('className','read'),
   array('className','write'),
   array('className','destroy'),
   array('className','gc'),
)
调用className类中的6个静态方法.className可以换对象就不用调用静态方法,但是用静态成员不用生成对象,性能更好.

2.6 常用session函数:

bool   session_start(void); 初始化session
bool   session_destroy(void): 删除服务器端session关联文件。
string session_id() 当前session的id
string session_name() 当前存取的session名称,也就是客户端保存session ID的cookie名称.默认PHPSESSID。
array  session_get_cookie_params() 与这个session相关联的session的细节.
string session_cache_limiter() 控制使用session的页面的客户端缓存
ini    session_cache_expire() 控制客户端缓存时间
bool   session_destroy()     删除服务器端保存session信息的文件
void   session_set_cookie_params ( int lifetime [, string path [, string domain [, bool secure [, bool httponly]]]] )设置与这个session相关联的session的细节
bool session_set_save_handler ( callback open, callback close, callback read, callback write, callback destroy, callback gc )定义处理session的函数,(不是使用默认的方式)
bool session_regenerate_id([bool delete_old_session]) 分配新的session id


2.7 session安全问题
攻击者通过投入很大的精力尝试获得现有用户的有效会话ID,有了会话id,他们就有可能能够在系统中拥有与此用户相同的能力.
因此,我们主要解决的思路是效验session ID的有效性.


if(!isset($_SESSION['user_agent'])){
   $_SESSION['user_agent'] = $_SERVER['REMOTE_ADDR'].$_SERVER['HTTP_USER_AGENT'];
}

/* 如果用户session ID是伪造 */
elseif ($_SESSION['user_agent'] != $_SERVER['REMOTE_ADDR'] . $_SERVER['HTTP_USER_AGENT']) {
   session_regenerate_id();
}
?>


2.8 Session通过cookie传递和通过SID传递的不同:
在php5.2.1的session的默认配置的情况下,当生成session的同时,服务器端将在发送header set-cookie同时生成预定义超级全局变量SID(也就是说,写入cookie和抛出SID是等价的.),当$_COOKIE['PHPSESSID']存在以后,将不再写入cookie,也不再生成超级全局变量SID,此时,SID将是空的.



2.9 session使用实例

/**
* 效验session的合法性
*
*/
function sessionVerify() {
   if(!isset($_SESSION['user_agent'])){
       $_SESSION['user_agent'] = MD5($_SERVER['REMOTE_ADDR']
       .$_SERVER['HTTP_USER_AGENT']);
   }
   /* 如果用户session ID是伪造,则重新分配session ID */
   elseif ($_SESSION['user_agent'] != MD5($_SERVER['REMOTE_ADDR']
   . $_SERVER['HTTP_USER_AGENT'])) {
       session_regenerate_id();
   }
}

/**
* 销毁session
* 三步完美实现,不可漏
*
*/
function sessionDestroy() {
   session_destroy();
   setcookie(session_name(),'',time()-3600);
   $_SESSION = array();
}
?>




注明:


   session 出现头信息已经发出的原因与cookie一样.
   在php5中,所有php session 的注册表配置选项都是编程时可配置的,一般情况下,我们是不用修改其配置的.要了解php的session注册表配置选项,请参考手册的Session 会话处理函数处.
php的substr函数截取字符串最后一位:




具体的使用可以看PHP的Manual中的function.substr.html。[/p]
yum是什么

   * yum = Yellow dog Updater, Modified
   * 主要功能是更方便的添加/删除/更新RPM包.
   * 它能自动解决包的倚赖性问题.
   * 它能便于管理大量系统的更新问题

[编辑]
yum特点

   * 可以同时配置多个资源库(Repository)
   * 简洁的配置文件(/etc/yum.conf
   * 自动解决增加或删除rpm包时遇到的倚赖性问题
   * 使用方便
   * 保持与RPM数据库的一致性

[编辑]
yum安装

   * CentOS自带(yum-*.noarch.rpm)

#rpm -ivh yum-*.noarch.rpm

   * 在第一次启用yum之前首先需要导入系统的RPM-GPG-KEY:

#rpm --import /usr/share/doc/centos-release-3(4)/RPM-GPG-KEY-CentOS-3(4)

[编辑]
yum指令

   * 注:当第一次使用yum或yum资源库有更新时,yum会自动下载所有所需的headers放置于/var/cache/yum目录下,所需时间可能较长.

[编辑]
rpm包的更新

   * 检查可更新的rpm包

#yum check-update

   * 更新所有的rpm包

#yum update

   * 更新指定的rpm包,如更新kernel和kernel source

#yum update kernel kernel-source

   * 大规模的版本升级,与yum update不同的是,连旧的淘汰的包也升级

#yum upgrade


[编辑]
rpm包的安装和删除

   * 安装rpm包,如xmms-mp3

#yum install xmms-mp3

   * 删除rpm包,包括与该包有倚赖性的包

#yum remove licq

   * 注:同时会提示删除licq-gnome,licq-qt,licq-text

[编辑]
yum暂存(/var/cache/yum/)的相关参数

   * 清除暂存中rpm包文件

#yum clean packages

   * 清除暂存中rpm头文件

#yum clearn headers

   * 清除暂存中旧的rpm头文件

#yum clean oldheaders

   * 清除暂存中旧的rpm头文件和包文件

#yum clearn 或#yum clearn all

   * 注:相当于yum clean packages + yum clean oldheaders


[编辑]
包列表

   * 列出资源库中所有可以安装或更新的rpm包

#yum list

   * 列出资源库中特定的可以安装或更新以及已经安装的rpm包

#yum list mozilla
#yum list mozilla*

   * 注:可以在rpm包名中使用匹配符,如列出所有以mozilla开头的rpm包

   * 列出资源库中所有可以更新的rpm包

#yum list updates

   * 列出已经安装的所有的rpm包

#yum list installed

   * 列出已经安装的但是不包含在资源库中的rpm包

#yum list extras

   * 注:通过其它网站下载安装的rpm包

[编辑]
rpm包信息显示(info参数同list)

   * 列出资源库中所有可以安装或更新的rpm包的信息

#yum info

   * 列出资源库中特定的可以安装或更新以及已经安装的rpm包的信息

#yum info mozilla
#yum info mozilla*

   * 注:可以在rpm包名中使用匹配符,如列出所有以mozilla开头的rpm包的信息

   * 列出资源库中所有可以更新的rpm包的信息

#yum info updates

   * 列出已经安装的所有的rpm包的信息

#yum info installed

   * 列出已经安装的但是不包含在资源库中的rpm包的信息

#yum info extras

   * 注:通过其它网站下载安装的rpm包的信息

[编辑]
搜索rpm包

   * 搜索匹配特定字符的rpm包

#yum search mozilla

   * 注:在rpm包名,包描述等中搜索

   * 搜索有包含特定文件名的rpm包

#yum provides realplay

[编辑]
增加资源库

   * 例如:增加rpm.livna.org作为资源库

   * 安装Livna.org rpms GPG key

#rpm --import http://rpm.livna.org/RPM-LIVNA-GPG-KEY

   * 检查GPG Key

# rpm -qa gpg-pubkey*

   * 显示Key信息

#rpm -qi gpg-pubkey-a109b1ec-3f6e28d5

   * (注:如果要删除Key,使用#rpm -e gpg-pubkey-a109b1ec-3f6e28d5)

http://fedora.linuxsir.org/main/?q=node/132

[quote]关于Fedora Core 5.0 通过Yum在线升级说明

作者:北南南北
来自:LinuxSir.Org
摘要:Yum 是Fedora 常用的在线升级工具,也是软件包管理工具之一;在以前我们有介绍软件包管理工具中有介绍过Yum的用法。现在把Fedora Core 5.0的一些Yum 源整理出来,供初学者参考;


目录

     1、Yum 的简单使用;
     2、Yum的图形前端yumex;
     3、Fedora Core 5.0 在线升级Yum源整理篇;
           3.1 Freshrpms.net 上的Yum 源;
           3.2 Atrpms.net 上的Yum 源;
           3.3 rpm.livna.org 上的Yum源;
           3.4 Dries.ulyssis.org 上的Yum 源;


++++++++++++++++++++++++++++++++
正文
++++++++++++++++++++++++++++++++


1、Yum 的简单使用;

请参考《Fedora/Redhat 在线安装更新软件包,yum 篇 》


2、Yum的图形前端yumex;

您可以在线安装它,当然您要先用su切换到root身份执行;

[root@localhost beinan]# yum install yumex

然后运行yumex就可以点鼠标完成升级工作了。不过您得先设置好Yum的源;


3、Fedora Core 5.0 在线升级Yum源整理篇;


3.1 Freshrpms.net 上的Yum 源;

Freshrpms.net 是比较好的一个Yum 和apt源;我们在这里只说Yum的源吧;您可能在线安装;


[root@localhost beinan]# rpm -ivh http://ftp.freshrpms.net/pub/fre ... 1.1-1.fc.noarch.rpm

接着我们导入Freshrpms.net 的签名;

[root@localhost beinan]# rpm --import http://freshrpms.net/RPM-GPG-KEY-freshrpms




3.2 Atrpms.net 上的Yum 源;

首先,我们要改一下/etc/yum.repos.d目录中的 fedora-extras.repo 文件,加入下面一段;

[atrpms]
name=Fedora Core 5 - i386 - ATrpms
baseurl=http://dl.atrpms.net/fc5-i386/atrpms/stable

然后导入 Atrpms.net 的软件包签名;

[root@localhost beinan]# rpm --import http://ATrpms.net/RPM-GPG-KEY.atrpms

3.3 rpm.livna.org 上的Yum源;

[root@localhost beinan]# rpm -ivh http://rpm.livna.org/livna-release-5.rpm


3.4 Dries.ulyssis.org 上的Yum 源;

应该把下面的一段加在fedora-extras.repo文件中;
[dries]
name=Extra Fedora rpms dries - $releasever - $basearch
baseurl=http://ftp.belnet.be/packages/dries.ulyssis.org/fedora/fc5/$basearch/dries/RPMS/

如果您想下载安装 Dries.ulyssis.org上的RPM包,请直接访问;

http://ftp.belnet.be/packages/dries.ulyssis.org/fedora/fc5
By 北南南北 at 2006/03/26 - 21:44 | Fedora | Apt Yum Rpm | 基础入门 | 参与评论 | 24503 阅读
我一般不导入签名

把验证签名禁用了就可以了
By Anonymous at 周一, 2006/11/06 - 17:11 | 回复
怎么禁用啊?

怎么禁用啊?
By Anonymous at 周六, 2006/12/16 - 20:16 | 回复
写的很好啊,不过dries的签名文件忘记说了吧 ?
Debian How to 编译安装Apache
wget http://mirror.vmmatrix.net/apache/httpd/apache_1.3.34.tar.gztar apache_1.3.34.tar.gzcd apache_1.3.34
修改src/include/httpd.h 增大最大线程数

#define HARD_SERVER_LIMIT 1024

改成

#define HARD_SERVER_LIMIT 2560

保存退出编译apache

./configure \--prefix=/usr/local/share/vmail/apache \--enable-module=so \--enable-module=rewrite \--enable-shared=max \--htdocsdir=/usr/local/share/vmail/www \--server-uid=vmail \--server-gid=vmail &&make &&make install
启动服务

/usr/local/share/vmail/apache/bin/apachectl start
浏览:http://server-ip/

日志:/usr/local/share/vmail/apache/logs/error_log
CentOS 4.4 编译安装 apache 2.2.4(mod_ssl)+php 5.2.1 with Suhosin-Patch+mysql 5.0.33+Zend Optimizer v3.2.2+eaccelerator-0.9.5+phpmyadmin 2.10笔记 v1.2

v1.2 2007年2月12日 apache 更新为2.2.4版本,增加mod_ssl和openssl支持,增加apr和apr-util的编译, php更新为5.2.1,增加集成Suhosin补丁,mysql 更新为5.0.33, Zend Optimizer 更新为3.2.2,增加phpmyadmin.修改一些文字错误。

v1.0 2007年1月11日

先声明,我绝对是个Linux的菜鸟,以下的这些文字个人的安装笔记,是参考了网上许多高手的成功经验组合而成的,说实话我自己的东西不多 :)我想把这些经验写下来,既可以对其他跟我一样摸索的兄弟一个经验,也可以防止以后自己都忘记了,嘿嘿。

所以如果某个大虾看到我借用了你的资源,请你不要生气。也欢迎大家进行指点。

1.下载centos 4.4
我是下载的DVD版本,大家也可以下载服务器CD安装版本,其实都差不多。大家可以到这儿下载,速度很快的。
http://ftp.iasi.roedu.net/mirrors/centos.org/4.4/isos/i386/

下载后当然就刻录成光盘。我建议你刻录DVD啦,如果是菜鸟,也可以在图形界面进行学习,不会这么抓不住头脑。

2.1 安装CentOS4.4
作为服务器,不安装不需要的组件,所以在选择组件的时候,除了选择FTP SERVER外取消所有组件的选择。也不要选web服务器。因为我们后面要手动编译安装。

系统约定RPM包和源码包存放位置

RPM包和源码包存放位置 /usr/local/src
源码包编译安装位置(prefix) /usr/local/xxx
脚本以及维护程序存放位置 /usr/local/sbin
MySQL 数据库位置 /var/lib/mysql
Apache 网站根目录 /home/www
Apache 虚拟主机日志根目录 /data/logs/www
yum RPM包信息文件 /etc/yum.list

2.2 更新系统,此处我们使用up2date,先修改up2date镜像。

vi /etc/sysconfig/rhn/sources
我把源修改成这样了:

yum centos4-Base http://mirror.be10.com/centos/4/os/$ARCH/
yum centos4-Updates http://mirror.be10.com/centos/4/updates/$ARCH/
yum centos4-extras http://mirror.be10.com/centos/4/extras/$ARCH/
yum centos4-contrib http://mirror.be10.com/centos/4/contrib/$ARCH/
yum centos4-addons http://mirror.be10.com/centos/4/addons/$ARCH/
yum centos4-centosplus http://mirror.be10.com/centos/4/centosplus/$ARCH/
然后执行:

# up2date -l //列出更新
# up2date -uf //更新包括版本的所有程序。如果不包括内核,则用up2date -u
3、系统环境部署及调整

(1). 检查系统是否正常

# more /var/log/messages //检查有无系统内核级错误信息
# demesg //检查硬件设备是否有错误信息
# ifconfig //检查网卡设置是否正确
# ping www.163.com // 检查网络是否正常
(2). 关闭不需要的服务

# export LANG='en_US' //设置语言
# setup //选择启动的服务
进入system service 选项。
以space 键选定所需服务。
以下仅列出需要启动的服务,未列出的服务一律关闭:

crond
irqbalance 仅当服务器CPU为S.M.P架构或支持双核心、HT技术时,才需开启,否则关闭。
microcode_ctl
network
vsftpd
sshd
syslog

(3)、修改/etc/yum.repos.d/CentOS-Base.repo,将镜象站点地址改为在中国的镜象站点地址。不然我们通过yum安装软件速度会极慢。修改如下:

# CentOS-Base.repo
#
# This file uses a new mirrorlist system developed by Lance Davis for CentOS.
# The mirror system uses the connecting IP address of the client and the
# update status of each mirror to pick mirrors that are updated to and
# geographically close to the client. You should use this for CentOS updates
# unless you are manually picking other mirrors.
#
# If the mirrorlist= does not work for you, as a fall back you can try the
# remarked out baseurl= line instead.
#
#

[base]
name=CentOS-$releasever - Base
baseurl=http://mirror.vmmatrix.net/CentOS/$releasever/os/$basearch/
http://mirror.be10.com/centos/$releasever/os/$basearch/
http://centos.hostlink.com.hk/$releasever/os/$basearch/
http://ftp.hostrino.com/pub/centos/
gpgcheck=1
gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-centos4

#released updates
[update]
name=CentOS-$releasever - Updates
baseurl=http://mirror.vmmatrix.net/CentOS/$releasever/os/$basearch/
http://mirror.be10.com/centos/$releasever/os/$basearch/
http://centos.hostlink.com.hk/$releasever/os/$basearch/
http://ftp.hostrino.com/pub/centos/
gpgcheck=1
gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-centos4

#packages used/produced in the build but not released
[addons]
name=CentOS-$releasever - Addons
baseurl=http://mirror.vmmatrix.net/CentOS/$releasever/os/$basearch/
http://mirror.be10.com/centos/$releasever/os/$basearch/
http://centos.hostlink.com.hk/$releasever/os/$basearch/
http://ftp.hostrino.com/pub/centos/
gpgcheck=1
gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-centos4

#additional packages that may be useful
[extras]
name=CentOS-$releasever - Extras
baseurl=http://mirror.vmmatrix.net/CentOS/$releasever/os/$basearch/
http://mirror.be10.com/centos/$releasever/os/$basearch/
http://centos.hostlink.com.hk/$releasever/os/$basearch/
http://ftp.hostrino.com/pub/centos/
gpgcheck=1
gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-centos4

#additional packages that extend functionality of existing packages
[centosplus]
name=CentOS-$releasever - Plus
baseurl=http://mirror.centos.org/centos/$releasever/centosplus/$basearch/
gpgcheck=1
enabled=0
gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-centos4

#contrib - packages by Centos Users
[contrib]
name=CentOS-$releasever - Contrib
baseurl=http://mirror.centos.org/centos/$releasever/contrib/$basearch/
gpgcheck=1
enabled=0
gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-centos4
保存。

然后导入key升级相应yum数据

# rpm --import /usr/share/doc/centos-release-4/RPM-GPG-KEY-centos4
# yum list tee /etc/yum.list //读取yum list 数据,将其输出到 /etc/yum.list。
(4)、定时校正服务器时间

# yum install ntp
# crontab -e
0 23 * * * root /usr/sbin/ntpdate 210.72.145.44 > /dev/null 2>&1
以上命令设置好后存盘。您的机器将在每天的23:00根据中国国家授时中心的NTP服务器时间自动校准时间。

(5). 对TCP/IP网络参数进行调整,加强抗SYN Flood能力

# echo 'net.ipv4.tcp_syncookies = 1' >> /etc/sysctl.conf //将net.ipv4.tcp_syncookies = 1写入sysctl.conf 文件
# sysctl -p //查看
(6)、FTP服务器的配置

vi /etc/vsftpd/vsftpd.conf
把anonymous_enable=YES注释掉不允许匿名登录。
把chroot_list_enable=YES
chroot_list_file=/etc/vsftpd.chroot_list
前的注释去掉。
把ftpd_banner=*前的注释去掉。后面改成你的欢迎信息(这样设置可以避免显示ftp服务器的版本信息)
然后保存,service vsftpd start就可以了。

这时应当添加用户,因为root默认不能通过FTP方式登录。

# adduser username
# passwd userpassword
这样对于我们上传一些文件到系统中很方便。

4. 重新启动系统

# init 6
5. 使用 yum 程序安装所需开发包(以下为标准的 RPM 包名称)

# yum install gcc gcc-c++ gcc-g77 flex bison autoconf automake bzip2-devel zlib-devel ncurses-devel libjpeg-devel libpng-devel libtiff-devel freetype-devel pam-devel
# 这里我们将编译GD所必须的一些小软件比如libpng,libtiff,freetype,libjpeg等先用RPM的方式一并安装好,避免手动编译浪费时间,同时也能避免很多错误,这几个小软件的编译很麻烦。这几个小软件编译错误了,GD当然安装不了,php5的编译当然也没戏了。所以我们抓大放小,对这些小牛鬼蛇神采取快速简洁的方式进行安装。并且对服务器的性能也不能产生什么影响。

6. 源码编译安装所需包 (Source)
(1) GD2

# cd /usr/local/src
# wget http://www.boutell.com/gd/http/gd-2.0.33.tar.gz
# tar xzvf gd-2.0.33.tar.gz
# cd gd-2.0.33
# ./configure --prefix=/usr/local/gd2 --mandir=/usr/share/man //./configure 配置。
# make //make 是用来编译的,它从 Makefile 中读取指令,然后编译。
# make install //make install 是用来安装的,它也从 Makefile 中读取指令,安装到指定的位置。
(2) Apache 日志截断程序

# cd /usr/local/src
# wget http://cronolog.org/download/cronolog-1.6.2.tar.gz
# tar xzvf cronolog-1.6.2.tar.gz
# cd cronolog-1.6.2
# ./configure --prefix=/usr/local/cronolog
# make
# make install
(3) libxml 库程序

# cd /usr/local/src
# wget http://ftp.gnome.org/pub/gnome/sources/libxml2/2.6/libxml2-2.6.26.tar.gz
# tar zxvf libxml2-2.6.26.tar.gz
# cd libxml2-2.6.26
# ./configure --prefix=/usr/local/libxml2
# make
# make install
7、编译mysql 5.0.33

cd /usr/local/src
# wget http://mysql.oss.eznetsols.org/Downloads/MySQL-5.0/mysql-5.0.33.tar.gz
# tar xzvf mysql-5.0.33.tar.gz
# cd mysql-5.0.33
修改mysql 客户端最大连接数, 默认的只有100,远远达不到我们的要求。

# vi sql/mysqld.cc
搜索找到下面一行:

{"max_connections", OPT_MAX_CONNECTIONS,
"The number of simultaneous clients allowed.", (gptr*) &max_connections,
(gptr*) &max_connections, 0, GET_ULONG, REQUIRED_ARG, 100, 1, 16384, 0, 1,
0},
将其中的100改为1500, 当然小点也可以,根据你的需要来,不建议改的太大。

{"max_connections", OPT_MAX_CONNECTIONS,
"The number of simultaneous clients allowed.", (gptr*) &max_connections,
(gptr*) &max_connections, 0, GET_ULONG, REQUIRED_ARG, 1500, 1, 16384, 0, 1,
0},
保存。

# CHOST="i686-pc-linux-gnu" CFLAGS="-O3 -msse2 -mmmx -mfpmath=sse -mcpu=pentium4 -march=pentium4 -pipe -fomit-frame-pointer" CXXFLAGS="-O3 -msse2 -mmmx -mfpmath=sse -funroll-loops -mcpu=pentium4 -march=pentium4 -pipe -fomit-frame-pointer" ./configure --prefix=/usr/local/mysql --localstatedir=/var/lib/mysql --with-comment=Source --with-server-suffix=-Community-Server --with-mysqld-user=mysql --without-debug --with-big-tables --with-charset=latin1 --with-collation=latin1_swedish_ci --with-extra-charsets=all --with-pthread --enable-static --enable-thread-safe-client --with-client-ldflags=-all-static --with-mysqld-ldflags=-all-static --enable-assembler --without-innodb --without-ndb-debug --without-isam
配置成功会提示:

MySQL has a Web site at http://www.mysql.com/ which carries details on the
latest release, upcoming features, and other information to make your
work or play with MySQL more productive. There you can also find
information about mailing lists for MySQL discussion.

Remember to check the platform specific part of the reference manual for
hints about installing MySQL on your platform. Also have a look at the
files in the Docs directory.

Thank you for choosing MySQL!

// 注意 ,CHOST=”i686-pc-linux-gnu” CFLAGS=”-O3 -msse2 -mmmx -mfpmath=sse -mcpu=pentium4 -march=pentium4 -pipe -fomit-frame-pointer” CXXFLAGS=”-O3 -msse2 -mmmx -mfpmath=sse -funroll-loops -mcpu=pentium4 -march=pentium4 -pipe -fomit-frame-pointer” 这个环境参数只针对intel P4 芯片,如果你的CPU是AMD的,注意不能使用。请查看相应的编译优化参数。否则程序会无法编译,即使编译成功也无法运行,嘿嘿。

# make
编译的时间可能会比较长,毕竟优化的比较厉害。

# make install
编译安装完成后执行后续操作:

# useradd mysql //添加 mysql 用户
# cd /usr/local/mysql
# bin/mysql_install_db --user=mysql
# chown -R root:mysql . //设置权限,注意后面有一个 "."
# chown -R mysql /var/lib/mysql //设置 mysql 目录权限
# chgrp -R mysql . //注意后面有一个 "."
# cp share/mysql/my-medium.cnf /etc/my.cnf
# cp share/mysql/mysql.server /etc/rc.d/init.d/mysqld //开机自动启动 mysql。
# chmod 755 /etc/rc.d/init.d/mysqld
# chkconfig --add mysqld
# /etc/rc.d/init.d/mysqld start //启动 MySQL
# bin/mysqladmin -u root password "password_for_root"
# service mysqld stop //关闭 MySQL
8. 编译安装 Apache

# cd /usr/local/src
# wget http://www.ip97.com/apache.org/httpd/httpd-2.2.4.tar.gz
# tar zxvf httpd-2.2.4.tar.gz
# cd httpd-2.2.4
依次安装apr和apr-util

# cd srclib/apr
# ./configure --prefix=/usr/local/apr --enable-threads --enable-other-child USE=ipv6
# make && make install

# cd ../apr-util
# ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr/ --with-mysql=/usr/local/mysql
# make && make install

cd /usr/local/src/httpd-2.2.4
# CHOST="i686-pc-linux-gnu" CFLAGS="-O3 -msse2 -mmmx -mfpmath=sse -funroll-loops -mcpu=pentium4 -march=pentium4 -pipe -fomit-frame-pointer" ./configure --prefix=/usr/local/apache2 --enable-mods-shared=all --enable-deflate=shared --with-mysql=/usr/local/mysql --enable-cache --enable-file-cache --enable-mem-cache --enable-disk-cache --enable-static-support --enable-static-htpasswd --enable-static-htdigest --enable-static-rotatelogs --enable-static-logresolve --enable-static-htdbm --enable-static-ab --enable-static-checkgid --disable-cgid --disable-cgi --with-mpm=worker --with-apr=/usr/local/apr/ --with-apr-util=/usr/local/apr-util/ --enable-ssl --with-ssl=/usr/include/openssl

# make
# make install
# echo '/usr/local/apache2/bin/apachectl start ' >> /etc/rc.local //将 apachectl 的调用加入到你的系统启动文件中。
注解:
./configure //配置源代码树
–prefix=/usr/local/apache2 //体系无关文件的顶级安装目录PREFIX ,也就Apache的安装目录。
–enable-module=so //打开 so 模块,so 模块是用来提 DSO 支持的 apache 核心模块
–enable-mods-shared=all //编译全部的模板,对于不需要我们可以在httpd.conf去掉。
–enable-cache //支持缓存
–enable-file-cache //支持文件缓存
–enable-mem-cache //支持记忆缓存
–enable-disk-cache //支持磁盘缓存
–enable-static-support //支持静态连接(默认为动态连接)
–enable-static-htpasswd //使用静态连接编译 htpasswd - 管理用于基本认证的用户文件
–enable-static-htdigest //使用静态连接编译 htdigest - 管理用于摘要认证的用户文件
–enable-static-rotatelogs //使用静态连接编译 rotatelogs - 滚动 Apache 日志的管道日志程序
–enable-static-logresolve //使用静态连接编译 logresolve - 解析 Apache 日志中的IP地址为主机名
–enable-static-htdbm //使用静态连接编译 htdbm - 操作 DBM 密码数据库
–enable-static-ab //使用静态连接编译 ab - Apache HTTP 服务器性能测试工具
–enable-static-checkgid //使用静态连接编译 checkgid
–disable-cgid //禁止用一个外部 CGI 守护进程执行CGI脚本
–disable-cgi //禁止编译 CGI 版本的 PHP
–with-mpm=worker // 让apache以worker方式运行
–enable-ssl // 编译 ssl模块。

将apache设置成开机自启动:

在/etc/rc.d/rc.local文件中加入一行

/usr/local/apache2/bin/apachectl start
这样每次重新启动系统以后,apache也会随系统一起启动.

或者

# cp /usr/local/apache2/bin/apachectl /etc/rc.d/init.d/httpd
然后 vi /etc/rc.d/init.d/httpd 添加(#!/bin/sh下面)
# chkconfig: 2345 10 90
# description: Activates/Deactivates Apache Web Server
最后,运行chkconfig把Apache添加到系统的启动服务组里面:
# chkconfig --add httpd
# chkconfig httpd on
9、编译php 5.2.1并打上Suhosin Patch。
Suhosin 是php增强型安全补丁,可以编译到静态内核中,也可以编译成php动态扩展。我个人强烈你建议安装成静态内核。Suhosin已经进入freebsd和 gentoo的ports。下面的以下先说静态安装步骤。当然你也可以在安装php后将它编译成php的动态扩展。

# cd /usr/local/src
# wget http://cn.php.net/get/php-5.2.1.tar.gz/from/this/mirror
wget http://www.hardened-php.net/suhosin/_media/suhosin-patch-5.2.1-0.9.6.2.patch.gz
# tar zxvf php-5.2.1.tar.gz
# gunzip suhosin-patch-5.2.1-0.9.6.2.patch.gz
# cd php-5.2.1
patch -p 1 -i ../suhosin-patch-5.2.1-0.9.6.2.patch

#./buildconf --force

# CHOST="i686-pc-linux-gnu" CFLAGS="-O3 -msse2 -mmmx -mfpmath=sse -mcpu=pentium4 -march=pentium4 -pipe -fomit-frame-pointer" CXXFLAGS="-O3 -msse2 -mmmx -mfpmath=sse -funroll-loops -mcpu=pentium4 -march=pentium4 -pipe -fomit-frame-pointer" ./configure --prefix=/usr/local/php --with-apxs2=/usr/local/apache2/bin/apxs --with-zlib-dir --with-bz2 --with-tiff-dir --with-libxml-dir=/usr/local/libxml2 --with-gd=/usr/local/gd2 --with-freetype-dir --with-jpeg-dir --with-png-dir --with-ttf --enable-mbstring --with-mysql=/usr/local/mysql --with-mysqli=/usr/local/mysql/bin/mysql_config --with-config-file-path=/etc --with-iconv --disable-ipv6 --enable-static --enable-maintainer-zts --enable-memory-limit --enable-zend-multibyte --enable-inline-optimization --enable-zend-multibyte --enable-sockets --enable-soap --enable-suhosin --with-openssl

# make

# make install

# cp php.ini-recommended /etc/php.ini
在这里也顺便说一下将suhosin安装成为php的动态扩展的方法。毕竟网上根本不见它的中文安装教程。

虽然我个人不推荐这种方式。

wget http://www.hardened-php.net/suhosin/_media/suhosin-0.9.16.tgz
tar zxvf suhosin-0.9.16.tgz
cd suhosin-0.9.16
./configure --with-php-config=/usr/local/php/bin/php-config
make
make install
会提示编译的模块存在的目录,记住它。

Installing shared extensions: /usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/
然后在php.ini中增加一行下列语句。

extension=/usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/suhosin.so
10 、整合apache 与php

# vi /usr/local/apache2/conf/httpd.conf
在最后一行加上:

AddType application/x-httpd-php .php
查找:(设置 WEB 默认文件)

DirectoryIndex index.html
替换为:

DirectoryIndex index.php index.html index.htm //在 WEB 目录不到默认文件,httpd 就会执行 /var/www/error/noindex.html
找到这一段:

# AllowOverride controls what directives may be placed in .htaccess files.
# It can be "All", "None", or any combination of the keywords:
# Options FileInfo AuthConfig Limit
#
AllowOverride none
更改为

AllowOverride all
允许apache rewrite

# 监听443端口,支持https连接
取消注释 httpd.conf 中的

Include conf/extra/httpd-ssl.conf
保存httpd.conf,退出。

# /usr/local/apache2/bin/apachectl restart //重启 Apache
11. 查看确认 L.A.M.P 环境信息

vi /usr/local/apache2/htdocs/phpinfo.php
增加下面一行,并保存。

# chmod 755 /usr/local/apache2/htdocs/phpinfo.php
用浏览器打开 http://127.0.0.1/phpinfo.php

# echo ' ' > /usr/local/apache2/htdocs/testdb.php
# chmod 755 /usr/local/apache2/htdocs/testdb.php
# service mysqld start
用浏览器打开 http://127.0.0.1/testdb.php
检查 phpinfo 中的各项信息是否正确。

12、设置SSL并创建自己的CA

# cd /usr/share/ssl/misc
# ./CA -newca
屏幕上出现如下的提示:CA certificate filename (or enter to create)

这是要求输入要创建的CA的证书文件名, 可以直接回车或输入证书文件名。

Making CA certificate …
Generating a 1024 bit RSA private key
………++++++
…………………………..++++++
writing new private key to ‘./demoCA/private/./cakey.pem’
Enter PEM pass phrase:

Verifying password - Enter PEM pass phrase:-

此时要求输入和验证CA的私钥口令、国家代码(中国是CN)、省份、城市或地区、组织或企业名称、部门名称、CA的名称或服务器的主机名称、管理员电子邮件地址。

至此,在当前目录下生成了demoCA的目录,CA的证书就在该目录下,文件名为cacert.pem

生成服务器的证书请求

# ./CA -newreq
屏幕上出现如下的提示:

Generating a 1024 bit RSA private key
……………………………………………..++++++
…..++++++
writing new private key to ‘newreq.pem’
Enter PEM pass phrase:
Verifying password - Enter PEM pass phrase:

此时要求输入和验证服务器的私钥口令、国家代码(中国是CN)、省份、城市或地区、组织或企业名称、部门名称、CA的名称或服务器的主机名称、管理员电子邮件地址。

Please enter the following ‘extra’ attributes

to be sent with your certificaterequest

A challenge password []:

An optional company name []:

.Request (and private key) is in newreq.pem

这是要求输入服务器的相关信息。

此时,在当前目录下生成了一个名为newreq.pem的文件,包含了要生成服务器数字证书的请求。

签署证书

# ./CA -sign
屏幕上出现如下的提示:

Using configuration from /usr/share/ssl/openssl.cnf

Enter PEM pass phrase:

此时一样需要输入CA的私钥口令、国家代码(中国是CN)、省份、城市或地区、组织或企业名称、部门名称、CA的名称或服务器的主机名称、管理员电子邮件地址。

Certificate is to be certified until Nov 19 13:46:19 2002 GMT (365 days)

Sign the certificate? [y/n]:y

这时显示证书请求文件中的各项信息,并询问是否要签署证书,回答y,进行签署。

1 out of 1 certificate requests certified, commit? [y/n]y

回答y,会显示已经签署的证书的信息,并在当前目录下生成服务器的证书文件newcert.pem。

# mkdir /usr/local/apache2/conf/ssl.crt/
# mkdir /usr/local/apache2/conf/ssl.key/
# cp newcert.pem /usr/local/apache2/conf/ssl.crt/server.pem
# cp newreq.pem /usr/local/apache2/conf/ssl.key/server.pem
更改服务器的证书文件的相关配置

# vi /usr/local/apache2/conf/extra/httpd-ssl.conf
查找并修改

# Server Certificate:
# Point SSLCertificateFile at a PEM encoded certificate. If
# the certificate is encrypted, then you will be prompted for a
# pass phrase. Note that a kill -HUP will prompt again. Keep
# in mind that if you have both an RSA and a DSA certificate you
# can configure both in parallel (to also allow the use of DSA
# ciphers, etc.)
SSLCertificateFile /usr/local/apache2/conf/ssl.crt/server.pem
#SSLCertificateFile /usr/local/apache2/conf/server-dsa.crt

# Server Private Key:
# If the key is not combined with the certificate, use this
# directive to point at the key file. Keep in mind that if
# you've both a RSA and a DSA private key you can configure
# both in parallel (to also allow the use of DSA ciphers, etc.)
SSLCertificateKeyFile /usr/local/apache2/conf/ssl.key/server.pem
#SSLCertificateKeyFile /usr/local/apache2/conf/server-dsa.key
示例文件

在SSL的根目录中生成一个index.html,它是如下所示:

<html>

这是SSL示例!

</html>
测试

假如Web服务器的DNS名称是www.cnprint.org.

在浏览器的URL地址栏里输入 http://www.cnprint.org/,浏览器便会显示APACHE安装时确省的Test Page.

在浏览器的URL地址栏里输入 https://www.cnprint.org/,注意:是 https 而不是http !

浏览器会提示站点已经采用了SSL进行数据的加密传输.由于我们的CA证书不是浏览器缺省的信任的根证书,所以,浏览器会说无法确认服务器的证书可信。暂时不管,一直NEXT,最后,浏览器会显示:这是SSL示例!

可以把CA的证书放在非SSL的站点上,让浏览器下载并安装CA证书,并将其设置成可信任的根证书,便可解决上面的问题.8 解除HTTPD起动时的口令输入。

由于安全的原因,Web服务器的私钥是口令加密了的,每次重新起动HTTPD或Linux时,都会要求输入Web服务器的私钥的口令。

如果要解除HTTPD起动时的口令输入,可以这样:

# cd /usr/local/apache2/conf/ssl.key/
# cp server.pem server.pem.org
# openssl rsa -in server.pem.org -out server.pem
# chmod 400 server.pem
另外在网上看到一个方法,我没有试。有兴趣的可以试下。

创建SSL密码自动应答文件,否则每次Apache启动的时候,都会要求你输入SSL的密码.
创建 /usr/local/apache2/conf/ssl.key/sendsslpwd ,内容如下.

#!/bin/bash
SSLpasswd="YOUR PASSPHRASE"
echo $SSLpasswd
chmod 755 /usr/local/apache2/conf/ssl.key/sendsslpwd
此时,Web服务器的私钥已经没有口令加密,一定要确保server.pem文件除root外,任何用户均无权读取它。

13、安装 Zend Optimizer

# cd /usr/local/src
# wget http://downloads.zend.com/optimizer/3.2.2/ZendOptimizer-3.2.2-linux-glibc21-i386.tar.gz
# tar xzvf ZendOptimizer-3.2.2-linux-glibc21-i386.tar.gz
# ./ZendOptimizer-3.2.2-linux-glibc21-i386/install.sh
按照它的提示一步步进行就行了。

14、安装eaccelerator
eaccelerator是php的加速软件,使用后php的执行效率会有较大幅度的提升。目前eaccelerator 0.9.5已经和ZendOptimizer-3.2.2能够很好兼容啦。不过我个人觉得,ZendOptimizer-3.2.2没有加速的功能,只是起到了运行zend加密文件的作用而已。闲话不多说了,大家有兴趣的,可以去google下。

# cd /usr/local/src
# wget http://bart.eaccelerator.net/source/0.9.5/eaccelerator-0.9.5.tar.bz2
# tar -jxvf eaccelerator-0.9.5.tar.bz2
# cd eaccelerator-0.9.5

export PHP_PREFIX="/usr/local/php"
$PHP_PREFIX/bin/phpize //指定一下php的目录

# ./configure --enable-eaccelerator=shared --with-php-config=$PHP_PREFIX/bin/php-config // 设置

# make & make install
编译安装后我们会看到屏幕提示的eaccelerator.so所在的目录,比如我得到的是/usr/local/php/lib/php/extensions/no-debug-zts-20060613/eaccelerator.so,记住这个路径,待会要用到。

修改php.ini(安装完zend之后,php.ini存放于/usr/local/Zend/etc)
在文件最后,zend之前,注意,这部分内容务必放在zend之前,不然可能会出现不可预期的服务器问题。添加下列信息:

[eaccelerator]
extension="/usr/local/php/lib/php/extensions/no-debug-zts-20060613/eaccelerator.so"
eaccelerator.shm_size="32"
eaccelerator.cache_dir="/tmp/eaccelerator"
eaccelerator.enable="1"
eaccelerator.optimizer="1"
eaccelerator.check_mtime="1"
eaccelerator.debug="0"
eaccelerator.filter=""
eaccelerator.shm_max="0"
eaccelerator.shm_ttl="0"
eaccelerator.shm_prune_period="0"
eaccelerator.shm_only="0"
eaccelerator.compress="1"
eaccelerator.compress_level="9"
解释:
zend_extension 是安装完程序自动指示给我们的
eaccelerator.shm_size=”32″ 缓存大小单位MB
eaccelerator.cache_dir=”/tmp/eaccelerator” 缓存路径

# mkdir /tmp/eaccelerator // 建立目录
# chmod 0777 /tmp/eaccelerator // 修改目录属性
最后重新启动apachectl

抄一个eaccelerator.so配置备案:【2013-06-05】



重启apache,phpinfo显示:

This program makes use of the Zend Scripting Language Engine:
Zend Engine v2.2.0, Copyright (c) 1998-2006 Zend Technologies
with eAccelerator v0.9.5, Copyright (c) 2004-2006 eAccelerator, by eAccelerator
with Zend Extension Manager v1.0.11, Copyright (c) 2003-2006, by Zend Technologies
with Zend Optimizer v3.2.2, Copyright (c) 1998-2006, by Zend Technologies

也会有eAccelerator的具体信息。

15、安装phpmyadmin,管理mysql数据库

# cd /usr/local/apache2/htdocs/
# wget http://jaist.dl.sourceforge.net/sourceforge/phpmyadmin/phpMyAdmin-2.10.0-beta1-all-languages.tar.bz2

# tar jxvf phpMyAdmin-2.10.0-beta1-all-languages.tar.bz2
# mv phpMyAdmin-2.10.0-beta1-all-languages phpmyadmin

# cd phpmyadmin/libraries
修改配置文件

# vi config.default.php
找到这几行进行修改:

$cfg['Servers'][$i]['auth_type'] = 'http'; // Authentication method (valid choices: config, http, HTTP, signon or cookie)
$cfg['Servers'][$i]['user'] = 'root'; // MySQL user
$cfg['Servers'][$i]['password'] = 'PASSWORD'; // MySQL password (only needed
经过这几个步骤,我们一个比较安全的LAMP服务器就环境基本建立成功啦。感觉上也不是很难,是吧?
当然对于打造基于动态IP的网站,以上的信息还不够,还有建立ADSL拨号,NAT,动态域名更新,防火墙,安装论坛程序等一系列的工作,我会慢慢地写出自己的心得与大家分享。毕竟这对我来说,也是个学习的过程。
采用 10 个能够提高您的 UNIX® 命令行效率的好习惯——并在此过程中摆脱不良的使用模式。本文循序渐进地指导您学习几项用于命令行操作的技术,这些技术非常好,但是通常被忽略。了解常见 错误和克服它们的方法,以便您能够确切了解为何值得采用这些 UNIX 习惯。
引言

当您经常使用某个系统时,往往会陷入某种固定的使用模式。有时,您没有养成以尽可能最好的方式做事的习惯。有时,您的不良习惯甚至会导致出现混乱。 纠正此类缺点的最佳方法之一,就是有意识地采用抵制这些坏习惯的好习惯。本文提出了 10 个值得采用的 UNIX 命令行习惯——帮助您克服许多常见使用怪癖,并在该过程中提高命令行工作效率的好习惯。下面列出了这 10 个好习惯,之后对进行了更详细的描述。

采用 10 个好习惯

要采用的十个好习惯为:

在单个命令中创建目录树。
更改路径;不要移动存档。
将命令与控制操作符组合使用。
谨慎引用变量。
使用转义序列来管理较长的输入。
在列表中对命令分组。
在 find 之外使用 xargs。
了解何时 grep 应该执行计数——何时应该绕过。
匹配输出中的某些字段,而不只是对行进行匹配。
停止对 cat 使用管道。
在单个命令中创建目录树

清单 1 演示了最常见的 UNIX 坏习惯之一:一次定义一个目录树。


清单 1. 坏习惯 1 的示例:单独定义每个目录树
~ $ mkdir tmp~ $ cd tmp~/tmp $ mkdir a~/tmp $ cd a~/tmp/a $ mkdir b~/tmp/a $ cd b~/tmp/a/b/ $ mkdir c~/tmp/a/b/ $ cd c~/tmp/a/b/c $



使用 mkdir 的 -p 选项并在单个命令中创建所有父目录及其子目录要容易得多。但是即使对于知道此选项的管理员,他们在命令行上创建子目录时也仍然束缚于逐步创建每级子目录。花时间有意识地养成这个好习惯是值得的:


清单 2. 好习惯 1 的示例:使用一个命令来定义目录树
~ $ mkdir -p tmp/a/b/c



您可以使用此选项来创建整个复杂的目录树(在脚本中使用是非常理想的),而不只是创建简单的层次结构。例如:


清单 3. 好习惯 1 的另一个示例:使用一个命令来定义复杂的目录树
~ $ mkdir -p project/{lib/ext,bin,src,doc/{html,info,pdf},demo/stat/a}



过去,单独定义目录的唯一借口是您的 mkdir 实现不支持此选项,但是在大多数系统上不再是这样了。IBM、AIX®、mkdir、GNU mkdir 和其他遵守单一 UNIX 规范 (Single UNIX Specification) 的系统现在都具有此选项。

对于仍然缺乏该功能的少数系统,您可以使用 mkdirhier 脚本(请参见参考资料),此脚本是执行相同功能的 mkdir 的包装:

~ $ mkdirhier project/{lib/ext,bin,src,doc/{html,info,pdf},demo/stat/a}



更改路径;不要移动存档

另一个不良的使用模式是将 .tar 存档文件移动到某个目录,因为该目录恰好是您希望在其中提取 .tar 文件的目录。其实您根本不需要这样做。您可以随心所欲地将任何 .tar 存档文件解压缩到任何目录——这就是 -C 选项的用途。在解压缩某个存档文件时,使用 -C 选项来指定要在其中解压缩该文件的目录:


清单 4. 好习惯 2 的示例:使用选项 -C 来解压缩 .tar 存档文件
~ $ tar xvf -C tmp/a/b/c newarc.tar.gz



相对于将存档文件移动到您希望在其中解压缩它的位置,切换到该目录,然后才解压缩它,养成使用 -C 的习惯则更加可取——当存档文件位于其他某个位置时尤其如此。

将命令与控制操作符组合使用

您可能已经知道,在大多数 Shell 中,您可以在单个命令行上通过在命令之间放置一个分号 (;) 来组合命令。该分号是 Shell 控制操作符, 虽然它对于在单个命令行上将离散的命令串联起来很有用,但它并不适用于所有情况。例如,假设您使用分号来组合两个命令,其中第二个命令的正确执行完全依赖 于第一个命令的成功完成。如果第一个命令未按您预期的那样退出,第二个命令仍然会运行——结果会导致失败。相反,应该使用更适当的控制操作符(本文将描述 其中的部分操作符)。只要您的 Shell 支持它们,就值得养成使用它们的习惯。

仅当另一个命令返回零退出状态时才运行某个命令

使用 && 控制操作符来组合两个命令,以便仅当 第一个命令返回零退出状态时才运行第二个命令。换句话说,如果第一个命令运行成功,则第二个命令将运行。如果第一个命令失败,则第二个命令根本就不运行。例如:


清单 5. 好习惯 3 的示例:将命令与控制操作符组合使用


~ $ cd tmp/a/b/c && tar xvf ~/archive.tar



在此例中,存档的内容将提取到 ~/tmp/a/b/c 目录中,除非该目录不存在。如果该目录不存在,则 tar 命令不会运行,因此不会提取任何内容。

仅当另一个命令返回非零退出状态时才运行某个命令

类似地,|| 控制操作符分隔两个命令,并且仅当第一个命令返回非零退出状态时才运行第二个命令。换句话说,如果第一个命令成功,则第二个命令不会运行。如果第一个命令失败,则第二个命令才会 运行。在测试某个给定目录是否存在时,通常使用此操作符,如果该目录不存在,则创建它:


清单 6. 好习惯 3 的另一个示例:将命令与控制操作符组合使用


~ $ cd tmp/a/b/c || mkdir -p tmp/a/b/c



您还可以组合使用本部分中描述的控制操作符。每个操作符都影响最后的命令运行:


清单 7. 好习惯 3 的组合示例:将命令与控制操作符组合使用


~ $ cd tmp/a/b/c || mkdir -p tmp/a/b/c && tar xvf -C tmp/a/b/c ~/archive.tar



谨慎引用变量

始终要谨慎使用 Shell 扩展和变量名称。一般最好将变量调用包括在双引号中,除非您有不这样做的足够理由。类似地,如果您直接在字母数字文本后面使用变量名称,则还要确保将该变 量名称包括在方括号 ([]) 中,以使其与周围的文本区分开来。否则,Shell 将把尾随文本解释为变量名称的一部分——并且很可能返回一个空值。清单 8 提供了变量的各种引用和非引用及其影响的示例。


清单 8. 好习惯 4 的示例:引用(和非引用)变量


~ $ ls tmp/a b~ $ VAR="tmp/*"~ $ echo $VARtmp/a tmp/b~ $ echo "$VAR"tmp/*~ $ echo $VARa~ $ echo "$VARa"~ $ echo "${VAR}a"tmp/*a~ $ echo ${VAR}atmp/a~ $


使用转义序列来管理较长的输入

您或许看到过使用反斜杠 (\) 来将较长的行延续到下一行的代码示例,并且您知道大多数 Shell 都将您通过反斜杠联接的后续行上键入的内容视为单个长行。然而,您可能没有在命令行中像通常那样利用此功能。如果您的终端无法正确处理多行回绕,或者您的 命令行比通常小(例如在提示符下有长路经的时候),反斜杠就特别有用。反斜杠对于了解键入的长输入行的含义也非常有用,如以下示例所示:


清单 9. 好习惯 5 的示例:将反斜杠用于长输入


~ $ cd tmp/a/b/c || \> mkdir -p tmp/a/b/c && \> tar xvf -C tmp/a/b/c ~/archive.tar



或者,也可以使用以下配置:


清单 10. 好习惯 5 的替代示例:将反斜杠用于长输入


~ $ cd tmp/a/b/c \>                 || \> mkdir -p tmp/a/b/c \>                    && \> tar xvf -C tmp/a/b/c ~/archive.tar



然而,当您将输入行划分到多行上时,Shell 始终将其视为单个连续的行,因为它总是删除所有反斜杠和额外的空格。

注意:在大多数 Shell 中,当您按向上箭头键时,整个多行输入将重绘到单个长输入行上。

在列表中对命令分组

大多数 Shell 都具有在列表中对命令分组的方法,以便您能将它们的合计输出向下传递到某个管道,或者将其任何部分或全部流重定向到相同的地方。您一般可以通过在某个 Subshell 中运行一个命令列表或通过在当前 Shell 中运行一个命令列表来实现此目的。

在 Subshell 中运行命令列表

使用括号将命令列表包括在单个组中。这样做将在一个新的 Subshell 中运行命令,并允许您重定向或收集整组命令的输出,如以下示例所示:


清单 11. 好习惯 6 的示例:在 Subshell 中运行命令列表


~ $ ( cd tmp/a/b/c/ || mkdir -p tmp/a/b/c && \> VAR=$PWD; cd ~; tar xvf -C $VAR archive.tar ) \> | mailx admin -S "Archive contents"



在此示例中,该存档的内容将提取到 tmp/a/b/c/ 目录中,同时将分组命令的输出(包括所提取文件的列表)通过邮件发送到地址 admin。

当您在命令列表中重新定义环境变量,并且您不希望将那些定义应用于当前 Shell 时,使用 Subshell 更可取。

在当前 Shell 中运行命令列表

将命令列表用大括号 ({}) 括起来,以在当前 Shell 中运行。确保在括号与实际命令之间包括空格,否则 Shell 可能无法正确解释括号。此外,还要确保列表中的最后一个命令以分号结尾,如以下示例所示:


清单 12. 好习惯 6 的另一个示例:在当前 Shell 中运行命令列表


~ $ { cp ${VAR}a . && chown -R guest.guest a && \> tar cvf newarchive.tar a; } | mailx admin -S "New archive"


在 find 之外使用 xargs

使用 xargs 工具作为筛选器,以充分利用从 find 命令挑选的输出。find 运行通常提供与某些条件匹配的文件列表。此列表被传递到 xargs 上,后者然后使用该文件列表作为参数来运行其他某些有用的命令,如以下示例所示:


清单 13. xargs 工具的经典用法示例


~ $ find some-file-criteria some-file-path | \> xargs some-great-command-that-needs-filename-arguments



然而,不要将 xargs 仅看作是 find 的辅助工具;它是一个未得到充分利用的工具之一,当您养成使用它的习惯时,将会希望进行所有试验,包括以下用法。

传递空格分隔的列表

在最简单的调用形式中,xargs 就像一个筛选器,它接受一个列表(每个成员分别在单独的行上)作为输入。该工具将那些成员放置在单个空格分隔的行上:


清单 14. xargs 工具产生的输出示例


~ $ xargsabcControl-Da b c~ $



您可以发送通过 xargs 来输出文件名的任何工具的输出,以便为其他某些接受文件名作为参数的工具获得参数列表,如以下示例所示:


清单 15. xargs 工具的使用示例


~/tmp $ ls -1 | xargsDecember_Report.pdf README a archive.tar mkdirhier.sh~/tmp $ ls -1 | xargs fileDecember_Report.pdf: PDF document, version 1.3README: ASCII texta: directoryarchive.tar: POSIX tar archivemkdirhier.sh: Bourne shell script text executable~/tmp $



xargs 命令不只用于传递文件名。您还可以在需要将文本筛选到单个行中的任何时候使用它:


清单 16. 好习惯 7 的示例:使用 xargs 工具来将文本筛选到单个行中


~/tmp $ ls -l | xargs-rw-r--r-- 7 joe joe 12043 Jan 27 20:36 December_Report.pdf -rw-r--r-- 1 \root root 238 Dec 03 08:19 README drwxr-xr-x 38 joe joe 354082 Nov 02 \16:07 a -rw-r--r-- 3 joe joe 5096 Dec 14 14:26 archive.tar -rwxr-xr-x 1 \joe joe 3239 Sep 30 12:40 mkdirhier.sh~/tmp $



谨慎使用 xargs

从技术上讲,使用 xargs 很少遇到麻烦。缺省情况下,文件结束字符串是下划线 (_);如果将该字符作为单个输入参数来发送,则它之后的所有内容将被忽略。为了防止这种情况发生,可以使用 -e 标志,它在不带参数的情况下完全禁用结束字符串。

了解何时 grep 应该执行计数——何时应该绕过

避免通过管道将 grep 发送到 wc -l 来对输出行数计数。grep 的 -c 选项提供了对与特定模式匹配的行的计数,并且一般要比通过管道发送到 wc 更快,如以下示例所示:


清单 17. 好习惯 8 的示例:使用和不使用 grep 的行计数


~ $ time grep and tmp/a/longfile.txt | wc -l2811real    0m0.097suser    0m0.006ssys     0m0.032s~ $ time grep -c and tmp/a/longfile.txt2811real    0m0.013suser    0m0.006ssys     0m0.005s~ $



除了速度因素外,-c 选项还是执行计数的好方法。对于多个文件,带 -c 选项的 grep 返回每个文件的单独计数,每行一个计数,而针对 wc 的管道则提供所有文件的组合总计数。

然而,不管是否考虑速度,此示例都表明了另一个要避免地常见错误。这些计数方法仅提供包含匹配模式的行数——如果那就是您要查找的结果,这没什么问题。但是在行中具有某个特定模式的多个实例的情况下,这些方法无法为您提供实际匹配实例数量 的真实计数。归根结底,若要对实例计数,您还是要使用 wc 来计数。首先,使用 -o 选项(如果您的版本支持它的话)来运行 grep 命令。此选项仅 输出匹配的模式,每行一个模式,而不输出行本身。但是您不能将它与 -c 选项结合使用,因此要使用 wc -l 来对行计数,如以下示例所示:


清单 18. 好习惯 8 的示例:使用 grep 对模式实例计数


~ $ grep -o and tmp/a/longfile.txt | wc -l3402~ $



在此例中,调用 wc 要比第二次调用 grep 并插入一个虚拟模式(例如 grep -c)来对行进行匹配和计数稍快一点。

匹配输出中的某些字段,而不只是对行进行匹配

当您只希望匹配输出行中特定字段 中的模式时,诸如 awk 等工具要优于 grep。

下面经过简化的示例演示了如何仅列出 12 月修改过的文件。


清单 19. 坏习惯 9 的示例:使用 grep 来查找特定字段中的模式


~/tmp $ ls -l /tmp/a/b/c | grep Dec-rw-r--r--  7 joe joe  12043 Jan 27 20:36 December_Report.pdf-rw-r--r--  1 root root  238 Dec 03 08:19 README-rw-r--r--  3 joe joe   5096 Dec 14 14:26 archive.tar~/tmp $



在此示例中,grep 对行进行筛选,并输出其修改日期和名称中带 Dec 的所有文件。因此,诸如 December_Report.pdf 等文件是匹配的,即使它自从一月份以来还未修改过。这可能不是您希望的结果。为了匹配特定字段中的模式,最好使用 awk,其中的一个关系运算符对确切的字段进行匹配,如以下示例所示:


清单 20. 好习惯 9 的示例:使用 awk 来查找特定字段中的模式


~/tmp $ ls -l | awk '$6 == "Dec"'-rw-r--r--  3 joe joe   5096 Dec 14 14:26 archive.tar-rw-r--r--  1 root root  238 Dec 03 08:19 README~/tmp $



有关如何使用 awk 的更多详细信息,请参见参考资料。

停止对 cat 使用管道

grep 的一个常见的基本用法错误是通过管道将 cat 的输出发送到 grep 以搜索单个文件的内容。这绝对是不必要的,纯粹是浪费时间,因为诸如 grep 这样的工具接受文件名作为参数。您根本不需要在这种情况下使用 cat,如以下示例所示:


清单 21. 好习惯和坏习惯 10 的示例:使用带和不带 cat 的 grep


~ $ time cat tmp/a/longfile.txt | grep and2811real    0m0.015suser    0m0.003ssys     0m0.013s~ $ time grep and tmp/a/longfile.txt2811real    0m0.010suser    0m0.006ssys     0m0.004s~ $



此错误存在于许多工具中。由于大多数工具都接受使用连字符 (-) 的标准输入作为一个参数,因此即使使用 cat 来分散 stdin 中的多个文件,参数也通常是无效的。仅当您使用带多个筛选选项之一的 cat 时,才真正有必要在管道前首先执行连接。

结束语:养成好习惯

最好检查一下您的命令行习惯中的任何不良的使用模式。不良的使用模式会降低您的速度,并且通常会导致意外错误。本文介绍了 10 个新习惯,它们可以帮助您摆脱许多最常见的使用错误。养成这些好习惯是加强您的 UNIX 命令行技能的积极步骤。

原文地址 http://linux.chinaunix.net/docs/2007-03-08/3956.shtml
分页: 260/272 第一页 上页 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 下页 最后页 [ 显示模式: 摘要 | 列表 ]