台阶边的佛甲草。它是柔弱的,多汁的茎叶经不起践踏。但它可以是灿烂的,
蜂蝶穿梭其间,不会错过生命的美丽。它也经常长在屋瓦上,显得颇有高度。
写完这封信,我要感谢香榧老师。你见过我曾经的焦虑。正是与你的交流,
让我借别人的眼,看清了一点自己,慢慢摆脱了焦虑。
不妨让自己再软弱一些
------答XX信
陈老师:
我想每个人的生命过程中都会有低谷和困境的时候,每个人都有黑暗的一面,我现在最痛苦的是总是不由自主地走入黑暗之中,无法掌控自己。您是一个那么有力量的人,您是如何做到的呢?能分享一点给我指点迷津吗?谢谢。
XX君:
谢谢来信,谢谢你给我一个思考的机会。对陌生人提出这样的问题,是信任。这样的问题,也是我曾经面对、还将不断面对的问题。
请不要称我“老师”,直呼其名即可;或者叫“同学”,更妥贴。
我并不强大,并不那么有力量。
若干年以前,我曾经“强大”过。我以为自己聪明,以为自己有才,总觉得生活在欺负我,龙困浅滩,虎落平阳。我以苛刻的标准要求自己,必须这样,必须那样,力求完美。当愿望和目标无法迅速达成的时候,焦躁不安,怨天尤人;也痛恨自己,为何不能做得更好。
是的,每个人的生命过程中,都会有低谷和困境。“强大”的人更容易遭遇,因为他习惯让自己行走于巅峰,而把常人眼中的坦途,都视作沟壑。
“强大”的我如何面对低谷和困境?
我没有和家人和密友分担。在他们眼中的我,是一个事业成功的人。我在乎他们,在乎他们眼中的我,说到底是在乎自己。我靠高强度的体锻让自己咬牙度过难关。一天长跑六公里,接着游泳2000-3000米。
如果老板问:“你还有什么理由留在这家公司?”你会如何回答?而提问的老板,是几年前想尽办法,用甜言蜜语,各种许诺,把你从千里之外挖来的人,你又作何感想?为了这个千里之行,你几乎放弃了曾经拥有的一切,让旁人艳羡的一切,你又如何自处?在这样的时刻,你会不会后悔,会不会怨恨,会不会放弃?
都来不及。我选择的是“坚持”。
我对老板回答说:因为我的性格。我愿意在鲜花和掌声中谢幕,不愿在演出中途黯然退场。我想到的是一个同事,刚刚被排挤出公司,又突遇车祸,死于非命。
我坚持下来了。虽然我不想让亲人分担压力,但他们当然也分担了压力:不得不接受一个封闭、忧郁、暴躁、自私的我,一个不懂得去关心别人的我。
坚持下来就说明我强大吗?真的不是这样。
多年以后,我明白了:人不需要强大。不妨让自己更软弱一些。人更需要的是能心安理得,能接受自我。
何为有力和无力?何为强,何为弱?那个曾令山河变色、挥手之间左右万千臣民生死的“伟大领袖”,也有这样的时候:他在孤寂的夜里流泪,拉着卫士的手,求卫士多陪伴自己一刻。
所谓强,所谓弱,只是社会、他人、我们给自已设定的标准,是我们内心欲望的投射。当我们不了解自我的时候,就只能在这样的框框中苟活。
我们了解自己吗?我们有没有倾听自己内心的声音,触摸到自己真实的面容?为何要掌控自己,按照什么样的标准来掌控?
身处大自然的时候,觉得人类真是渺小。随处可见的一棵树,见识的风雨都多过我们;普普通通的一块石,就诞生于人类出现之前。骄妄的人们,误以为能把大自然随意改变,却不明白世界能让我们掌控的部分,其实很小很少。我们何不只做自己力所能及的事?为何不过能让自己心安理得的生活?
有个现代舞团,叫云门舞集,是台湾的文化传奇。创始人林怀民坚持理想的过程,并不总是风和日丽,其间云门一度解散。忆及往事,他云淡风轻:“年轻时我只知执着。后来我更明白自在。”
有坚持的勇气,有放弃的胸襟,有区分什么该坚持、什么该放弃、何时该坚持、何时该放弃、如何去坚持、如何去放弃的智慧,这样的智慧,只能从我们自身的内心获取。
我可以和你分享问题,但给不到你答案,也指点不了你的迷津。他人的经验,甚至你自己的经验,都不能成为依赖。你只能面对问题本身,了解它,了解自我,没有别的捷径。
取舍之间,当你更明白“舍”的时候,反而获取更多;
强弱之间,当你真正明白自己软弱的时候,反而更显“强大”。
生活经常给我们这样的悖论。
我自己做得还远远不够。我是一个软弱的人,一个平凡的人,甚至是一个愚蠢的人。因而时时警醒自己,做小事,把小事做好。我可以飞,但我必须落地栖枝。我不一定做大树,我可以做小草。尽量不违背自己的内心,真实地生活。
当我了解自己内心更多,未来的日子,也许我可以更自由。我相信:能“舍得”一切的时候,就是我最自在的时候。
不甘示弱是造成很多问题的根源。我们不妨让自己更软弱一些,或者说,让心更柔软一些,也许世界就会更好一些。我们也不妨让命运保留那么一点山重水复疑无路的不确定性,才有观赏柳暗花明又一村的闲情。
打这些字的时候,关了灯。让十六的月亮从窗边照进来,洒在书桌和沙发上。原来,可以不需要灯,即使是晚上。
祝假期心情愉快。
chenxujun于南岭
欲望的爱换来绝望苦恋,所以,绝望的女人都有一个共性:都是情欲和执着惹的祸,那算不算是爱?
能相爱的,不一定能在一起,也不一定应该在一起。有时正因为不能在一起,对爱人少了苛求,反而爱得更从容,更容易感受幸福和珍惜,这是你不愿意也要接受的爱的真相。
爱一个人,是体现自己有没有能力抓紧幸福的机遇,因为人与人之间聚散有时却无期。人生多变,我们无法掌握一切,我们有条件学习抓紧的是情缘,心态和爱的质素,这些都是自我修养的范围,其它的,请留给上天,别累坏身心,妄想太多。
爱得过累便要停下来。死守的爱最快消逝,瞒骗的爱不君子也嫌丑陋,占有的爱最暴力可耻,害怕失去的爱,不可能产生安全感。来来去去,还是爱得不够清廉自在,烦恼自寻。
爱不是信命得来的侥幸,要付出和成长。
量力而为,问心无愧,你将爱得心安理得没遗憾。
能相爱的,不一定能在一起,也不一定应该在一起。有时正因为不能在一起,对爱人少了苛求,反而爱得更从容,更容易感受幸福和珍惜,这是你不愿意也要接受的爱的真相。
爱一个人,是体现自己有没有能力抓紧幸福的机遇,因为人与人之间聚散有时却无期。人生多变,我们无法掌握一切,我们有条件学习抓紧的是情缘,心态和爱的质素,这些都是自我修养的范围,其它的,请留给上天,别累坏身心,妄想太多。
爱得过累便要停下来。死守的爱最快消逝,瞒骗的爱不君子也嫌丑陋,占有的爱最暴力可耻,害怕失去的爱,不可能产生安全感。来来去去,还是爱得不够清廉自在,烦恼自寻。
爱不是信命得来的侥幸,要付出和成长。
量力而为,问心无愧,你将爱得心安理得没遗憾。
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
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,动态域名更新,防火墙,安装论坛程序等一系列的工作,我会慢慢地写出自己的心得与大家分享。毕竟这对我来说,也是个学习的过程。
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
引言
当您经常使用某个系统时,往往会陷入某种固定的使用模式。有时,您没有养成以尽可能最好的方式做事的习惯。有时,您的不良习惯甚至会导致出现混乱。 纠正此类缺点的最佳方法之一,就是有意识地采用抵制这些坏习惯的好习惯。本文提出了 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
因为需要在我的主机上支持J2EE和ROR,所以我就选择安装Apache,虽然有lighttpd这个选择,但我觉得还是Apache更稳定,毕竟我们公司都是用YApache的。
安装Apache
先把 Apache 2.0.59 下载到 /home/用户目录/Devtools 下,然后加压缩到/usr/local/src/目录
1 shell> cd /usr/local/src 2 shell> tar -zxvf httpd-2.0.59.tar.gz view plain | print | copy to clipboard | ? shell> cd /usr/local/src
shell> tar -zxvf httpd-2.0.59.tar.gz 然后进入httpd目录新建一个编译脚本,方便维护和以后升级。每次执行下面的setup.sh就可以安装了(前提是安装libxml2库、zlib库)
1 #!/bin/bash 2 ./configure --prefix=/opt/apache 3 --enable-so 4 --enable-rewrite 5 --enable-dav 6 --enable-info 7 --enable-cgid 8 --enable-mime-magic 9 --enable-alias 10 --enable-access 11 --enable-deflate 12 --enable-proxy 13 --enable-proxy-http 14 --enable-forward 15 16 make 17 make install view plain | print | copy to clipboard | ? #!/bin/bash
./configure --prefix=/opt/apache
--enable-so
--enable-rewrite
--enable-dav
--enable-info
--enable-cgid
--enable-mime-magic
--enable-alias
--enable-access
--enable-deflate
--enable-proxy
--enable-proxy-http
--enable-forward
make
make install
这样就可以把制定的模块静态编译到Apache里,而且也支持动态加载模块。
把Apache当作服务启动
1 shell> cp /opt/apache/bin/apachectl /etc/rc.d/init.d/httpd 2 shell> chmod 700 /etc/rc.d/init.d/httpd 3 shell> chkconfig –add httpd 4 shell> chkconfig –level 345 httpd on 5 shell> service httpd start 6 shell> netstat -atln view plain | print | copy to clipboard | ? shell> cp /opt/apache/bin/apachectl /etc/rc.d/init.d/httpd
shell> chmod 700 /etc/rc.d/init.d/httpd
shell> chkconfig –add httpd
shell> chkconfig –level 345 httpd on
shell> service httpd start
shell> netstat -atln
现在可以看到80端口已经开始监听了,访问自己的ip也可以看到Apache的欢迎界面:)
http://www.zhangzhang.net/articles/2006/09/03/Linux-Installs-Apache2
安装Apache
先把 Apache 2.0.59 下载到 /home/用户目录/Devtools 下,然后加压缩到/usr/local/src/目录
1 shell> cd /usr/local/src 2 shell> tar -zxvf httpd-2.0.59.tar.gz view plain | print | copy to clipboard | ? shell> cd /usr/local/src
shell> tar -zxvf httpd-2.0.59.tar.gz 然后进入httpd目录新建一个编译脚本,方便维护和以后升级。每次执行下面的setup.sh就可以安装了(前提是安装libxml2库、zlib库)
1 #!/bin/bash 2 ./configure --prefix=/opt/apache 3 --enable-so 4 --enable-rewrite 5 --enable-dav 6 --enable-info 7 --enable-cgid 8 --enable-mime-magic 9 --enable-alias 10 --enable-access 11 --enable-deflate 12 --enable-proxy 13 --enable-proxy-http 14 --enable-forward 15 16 make 17 make install view plain | print | copy to clipboard | ? #!/bin/bash
./configure --prefix=/opt/apache
--enable-so
--enable-rewrite
--enable-dav
--enable-info
--enable-cgid
--enable-mime-magic
--enable-alias
--enable-access
--enable-deflate
--enable-proxy
--enable-proxy-http
--enable-forward
make
make install
这样就可以把制定的模块静态编译到Apache里,而且也支持动态加载模块。
把Apache当作服务启动
1 shell> cp /opt/apache/bin/apachectl /etc/rc.d/init.d/httpd 2 shell> chmod 700 /etc/rc.d/init.d/httpd 3 shell> chkconfig –add httpd 4 shell> chkconfig –level 345 httpd on 5 shell> service httpd start 6 shell> netstat -atln view plain | print | copy to clipboard | ? shell> cp /opt/apache/bin/apachectl /etc/rc.d/init.d/httpd
shell> chmod 700 /etc/rc.d/init.d/httpd
shell> chkconfig –add httpd
shell> chkconfig –level 345 httpd on
shell> service httpd start
shell> netstat -atln
现在可以看到80端口已经开始监听了,访问自己的ip也可以看到Apache的欢迎界面:)
http://www.zhangzhang.net/articles/2006/09/03/Linux-Installs-Apache2
品位不凡,威严,略显高深,喜爱一切美丽的事物,易怒,固执,有些利己,但关心接近他的人。谦逊,但非常有野心,有才能,刻苦,是不甚令人满意的伴侣,朋友众多,树敌也多,是可以信赖的人
除非我们没有应该做得很多的事情,否则就不能完全享受懒惰。教育使人跳脱命运的掌控,成为一个独立自主的个人,成为真正的自己。
友谊之光像磷光,当四周漆黑之际,最为显露。你应该抛开所有不必要的担忧,只须全心全意去考虑事情的结果即可。
鄙吝一销,白云方可赠客;渣滓尽化,明月自来照人
除非我们没有应该做得很多的事情,否则就不能完全享受懒惰。教育使人跳脱命运的掌控,成为一个独立自主的个人,成为真正的自己。
友谊之光像磷光,当四周漆黑之际,最为显露。你应该抛开所有不必要的担忧,只须全心全意去考虑事情的结果即可。
鄙吝一销,白云方可赠客;渣滓尽化,明月自来照人
http://www.aboutplayer.com/ours/play.asp?song=风中有朵雨做的云%20%20&word=mp3,http://www.sncbxx.com/vdj0000/200641633240579.mp3?/9AEA2QPjXGphX1hmZe0eDgEFA-oZCSEPJ-f3CPs2.mp3,,[%B7%E7%D6%D0%D3%D0%B6%E4%D3%EA%D7%F6%B5%C4%D4%C6+%C3%CF%CD%A5%CE%AD]&si=%B7%E7%D6%D0%D3%D0%B6%E4%D3%EA%D7%F6%B5%C4%D4%C6;;%C3%CF%CD%A5%CE%AD;;0;;35934&lm=16777216
Windows Media Player文件
Windows Media Player文件
http://www.aboutplayer.com/ours/play.asp?song=我是一只牛%20%20&word=mp3,http://69587.cn/attachment/200707/YWtglaOasJedk6hhnpWYpZCTkpaqoqNllKGWoaVpNw$$.mp3,,[%CE%D2%CA%C7%D2%BB%D6%BB%C5%A3+%C1%F5%B5%C2%BB%AA]&si=%CE%D2%CA%C7%D2%BB%D6%BB%C5%A3;;%C1%F5%B5%C2%BB%AA;;69432;;69432&lm=16777216
http://www.happytreefriends.cn/quanji/famu.html
观望现在的IT市场,竞争愈趋激烈,很多商家在想尽各种手段提高自己的产品的品牌形象或者知名度的同时,却又做出了一幕幕恶性攻击其他对手的小人手段,让我们来回顾一下最近发生的这几档子事吧。。。。
既然大庭广众之下做了,所以也别嫌人说你。。。就首先说说你,HP,惠普。。5月初惠普在上海召开了全球移动技术峰会,参与大会的业内人事和很多媒体却成了一场闹剧的目击者。。。3个身穿着标有“戴尔”,“联想”,“宏基”logo的工程师人手一个对应品牌的笔记本电脑,放在了又绘有这3个厂家商标的展示台上,然后,进行了详细的拆解,踩踏等测试,最后,和放在一旁的惠普自己的笔记本来对比,堂而皇之地大肆阐述惠普的笔记本比对手在安全性能等多方面完全胜出的结论。。。此情此景,让下面的人不禁哑然。。。
记得当联想宣布收购IBM PC业务的时候taiwan惠普的董事长谁谁(记不太清了,一个女的)当时曾经喊出的企业口号,“要把IBM变不见”“连想(联想)都不用想”。让人记忆犹新。感觉他们已经把这些对手完全不放在眼里了,“戴尔只是我们众多的对手之一。。。最多不过是赶上或者模仿我们”,听听,多么牛的话啊,真的豪气冲天!现在在看看最新的这个事情,我只能说,惠普,你凭什么这么牛!
论到产品的技术,IBM(永远经典的小黑)等商家这些研发和申请专利可能是最被大家津津乐道的,说道售后,dell的理念和国内一些大型的IT企业恐怕都要强与HP,HP敢拿出来吼叫一下的,也就是这两年(从2005)换了可以个CEO后市场占有率的提高。。但是,它对整个行业的态度,转变之大却远远高与自身的的发展。
针对此次事件,被拿来和HP做比较的3大厂商第一时间内做出了反应。dell的一个负责人说的很中肯,“他们拿最新的产品和我们的老产品比,我们很愿意在新产品上和他们一起比较”,而宏基也表示“HP的笔记本性能只能与我们的老型号基本持平,不明白他们有什么好拿出来show的”。。。联想的态度则温和许多,“他们的行为应该去符合商业道德”。。。。
商业道德,这个东西恐怕是HP现在已经不考虑的事情了吧,为了业绩,道德,get away....
且就不说这次事件反映出的这几年HP产生的恶劣习性,这个由自己公司一手策划的测试(无第3方监督验证),它的公平和可靠性到底又有多少呢?看看HP的行动,真的难道他们不了解中国人也不是傻子吗?人的眼睛都是雪亮的,在激烈的IT商场中,一个企业应该保持怎样的一个心态去良性竞争,这是我们消费者和国家都应该关注的事情。。。
像HP这种有违不正当竞争法的做法,谁都不知道下一次会发生在什么时候什么地方,但是有一点肯定的是,这种事情,只会让我们更瞧不起HP,你可以超越你的对手,但你不能侮辱和陷害你的对手,因为这种店大欺客的事情,起码在中国,我们是不会买你的帐的!
既然大庭广众之下做了,所以也别嫌人说你。。。就首先说说你,HP,惠普。。5月初惠普在上海召开了全球移动技术峰会,参与大会的业内人事和很多媒体却成了一场闹剧的目击者。。。3个身穿着标有“戴尔”,“联想”,“宏基”logo的工程师人手一个对应品牌的笔记本电脑,放在了又绘有这3个厂家商标的展示台上,然后,进行了详细的拆解,踩踏等测试,最后,和放在一旁的惠普自己的笔记本来对比,堂而皇之地大肆阐述惠普的笔记本比对手在安全性能等多方面完全胜出的结论。。。此情此景,让下面的人不禁哑然。。。
记得当联想宣布收购IBM PC业务的时候taiwan惠普的董事长谁谁(记不太清了,一个女的)当时曾经喊出的企业口号,“要把IBM变不见”“连想(联想)都不用想”。让人记忆犹新。感觉他们已经把这些对手完全不放在眼里了,“戴尔只是我们众多的对手之一。。。最多不过是赶上或者模仿我们”,听听,多么牛的话啊,真的豪气冲天!现在在看看最新的这个事情,我只能说,惠普,你凭什么这么牛!
论到产品的技术,IBM(永远经典的小黑)等商家这些研发和申请专利可能是最被大家津津乐道的,说道售后,dell的理念和国内一些大型的IT企业恐怕都要强与HP,HP敢拿出来吼叫一下的,也就是这两年(从2005)换了可以个CEO后市场占有率的提高。。但是,它对整个行业的态度,转变之大却远远高与自身的的发展。
针对此次事件,被拿来和HP做比较的3大厂商第一时间内做出了反应。dell的一个负责人说的很中肯,“他们拿最新的产品和我们的老产品比,我们很愿意在新产品上和他们一起比较”,而宏基也表示“HP的笔记本性能只能与我们的老型号基本持平,不明白他们有什么好拿出来show的”。。。联想的态度则温和许多,“他们的行为应该去符合商业道德”。。。。
商业道德,这个东西恐怕是HP现在已经不考虑的事情了吧,为了业绩,道德,get away....
且就不说这次事件反映出的这几年HP产生的恶劣习性,这个由自己公司一手策划的测试(无第3方监督验证),它的公平和可靠性到底又有多少呢?看看HP的行动,真的难道他们不了解中国人也不是傻子吗?人的眼睛都是雪亮的,在激烈的IT商场中,一个企业应该保持怎样的一个心态去良性竞争,这是我们消费者和国家都应该关注的事情。。。
像HP这种有违不正当竞争法的做法,谁都不知道下一次会发生在什么时候什么地方,但是有一点肯定的是,这种事情,只会让我们更瞧不起HP,你可以超越你的对手,但你不能侮辱和陷害你的对手,因为这种店大欺客的事情,起码在中国,我们是不会买你的帐的!
经过一天的研究,PHP与Mysql的编码问题终于解决,现将我的研究成果与大家分享:
1)读取mysql前设置编码,代码如下:
mysql_query("SET NAMES 'utf-8'",$database->_resource);
mysql_query("SET CHARACTER SET utf-8",$database->_resource);
但不是总有效,设置gb2312就不行;
2)使用iconv函数转换编码,但是Php默认不支持;
3)使用mb_convert_encoding函数转换编码,有些虚拟主机不支持;
4)使用博大公司写的http://zeal.newmenbase.net/attachment/chinese.rar转换编码,可以避免以上出现的问题,为较好的解决方案。 将UTF8转换为GB2312的代码如下:
include("class.Chinese.php");
$chs = new Chinese("UTF8","GB2312",trim($title));
$title = $chs->ConvertIT();
1)读取mysql前设置编码,代码如下:
mysql_query("SET NAMES 'utf-8'",$database->_resource);
mysql_query("SET CHARACTER SET utf-8",$database->_resource);
但不是总有效,设置gb2312就不行;
2)使用iconv函数转换编码,但是Php默认不支持;
3)使用mb_convert_encoding函数转换编码,有些虚拟主机不支持;
4)使用博大公司写的http://zeal.newmenbase.net/attachment/chinese.rar转换编码,可以避免以上出现的问题,为较好的解决方案。 将UTF8转换为GB2312的代码如下:
include("class.Chinese.php");
$chs = new Chinese("UTF8","GB2312",trim($title));
$title = $chs->ConvertIT();
PHP转化GB2312到UTF-8这个问题已经困扰我好几天了,今天终于解决这个问题了。
这几天在网上查了很多的资料,说法不一,也有自己写函数的,看起来实在是复杂,在网上查资料的时候无意间发现了iconv()这个函数,其实找了这么几天,这个函数就是专门用来做编码转化的,直接用它转化为自己想要的编码然后重新更新数据库就可以了。
函数的具体使用是:iconv("UTF-8", "GB2312","待转化的字符串或变量");
里芬奇,通过对话筒吹哨子来入侵电话系统。有5岁小骇客的酷刑:6年不准碰任何电子设备,1. 6 年之内不得自由使用电子产品,所有上网行为必须在监控之下才得以进行。
2. 必须提交所有帐户的帐号、密码。
3. 规范期间不得与骇客组织 UGNazi、Anonymous 或其他骇客成员联系。
————————————————————————————————————
看过一部国产制作宏大的关于部队信息化建设的连续剧.场面颇为宏大,不知动用谁的力量请来了坦克,装甲车,直升机.然后又花费了N多纳税人的钱买来火药加弹药充斥场面.冲着导演这份精神也得赞赏下.
不过,导演在描写一位从美国麻......麻省理工回来的计算机高手(批注: 还是个帅哥)黑网吧电脑时.让我啼笑皆非,导演以非常"简洁"的手法远距离拍摄显示器后背,然后只见高手双手以不规则运动手法敲击键盘,几近秒杀的速度, 电脑全部启动.然后看见明显是WORD编排的字体逐步出现:"你的电脑已全部被我控制......"
以我当时的幼稚头脑都会奇怪导演何以如此简陋拍摄.让我很是怀疑这位高手的身份.同时也为祖国部队的未来担忧,后来长见识了后,也琢磨出来了,不是人家高手无能,要么,是导演电脑水平太次,或者根本不重视这方面细节,要么,黑客这个字眼就是个禁区.导演只好糊弄下过关就OK了.
黑客绝对是个吸引眼球的字眼,君不见,黑客教学光盘,黑客教程图书卖到手软还会惹来众生骚动.网上跟黑客沾边的文章都能点击率飙升,指不定我这篇文章都能沾点光呢.我也算个黑客崇拜迷,看到新闻里报道一位根正苗红发展势头旺盛的青年因为黑了电脑盗取资料而被判刑,在满场惋惜和嘲笑的叹息声中,我却是抛出滔滔江水般的敬仰之心.巴不得立马磕头行八拜之礼拜其为师.渴望艺成之后,能牵着天龙八部,拿着倚天和屠龙,相伴神雕侠侣一起笑傲江湖.当然.相信有我之心的人不在少数.
缘何如此?黑客从某方面来说,代表着技术巅峰,对于IT人来说,踏到这个巅峰就像拿到国家科技奖般令人万种钦佩.就像披红戴帽,骑马游街般令人争相敬仰.虽然,其泡MM效果还比不上帮她装个系统,杀个小毒.同时,成为黑客也意味着这辈子你注定会是个抢手货.挥动下手指就能享受白领高薪待遇.在如今我们这个人才和木材匮乏的国家,你将是个成功的典范.
不过,黑客所以为黑,而不是白.全在于它的不请自入.跟小偷的原理很相像.盗取资料数据还不让你知道.手段高超者,事后连脚印指纹唇纹头发脚毛都不留一点.叫你后院着火叫苦连天之际却不知哪家阿猫阿狗干的.论卑鄙可恶程度,确实犹甚于小偷小摸.这可能也是导演为什么宁愿花血本请来飞机却不敢舍小钱请个黑客顾问的原因吧.
我也很想成了个黑客.像小榕样,只要花个几分钟,就能黑一个网站.不过,我也知道,技术到了那个程度,已是不屑于干这活了.网站被黑往往要么是某个菜鸟级别黑客在练练手,要么就是某个后台组织带有牟利性的行为.不管是哪个原因,做为个IT人,还是不要去以身试法了.要知道现在的网络警察叔叔一天24小时拿着先进性武器,读着先进性教育在网络上监督着呢.要是实在想锻炼自己的能力, 干脆多借几台电脑自己在家随便整.
因为,黑客,可是个禁区哦.
2. 必须提交所有帐户的帐号、密码。
3. 规范期间不得与骇客组织 UGNazi、Anonymous 或其他骇客成员联系。
————————————————————————————————————
看过一部国产制作宏大的关于部队信息化建设的连续剧.场面颇为宏大,不知动用谁的力量请来了坦克,装甲车,直升机.然后又花费了N多纳税人的钱买来火药加弹药充斥场面.冲着导演这份精神也得赞赏下.
不过,导演在描写一位从美国麻......麻省理工回来的计算机高手(批注: 还是个帅哥)黑网吧电脑时.让我啼笑皆非,导演以非常"简洁"的手法远距离拍摄显示器后背,然后只见高手双手以不规则运动手法敲击键盘,几近秒杀的速度, 电脑全部启动.然后看见明显是WORD编排的字体逐步出现:"你的电脑已全部被我控制......"
以我当时的幼稚头脑都会奇怪导演何以如此简陋拍摄.让我很是怀疑这位高手的身份.同时也为祖国部队的未来担忧,后来长见识了后,也琢磨出来了,不是人家高手无能,要么,是导演电脑水平太次,或者根本不重视这方面细节,要么,黑客这个字眼就是个禁区.导演只好糊弄下过关就OK了.
黑客绝对是个吸引眼球的字眼,君不见,黑客教学光盘,黑客教程图书卖到手软还会惹来众生骚动.网上跟黑客沾边的文章都能点击率飙升,指不定我这篇文章都能沾点光呢.我也算个黑客崇拜迷,看到新闻里报道一位根正苗红发展势头旺盛的青年因为黑了电脑盗取资料而被判刑,在满场惋惜和嘲笑的叹息声中,我却是抛出滔滔江水般的敬仰之心.巴不得立马磕头行八拜之礼拜其为师.渴望艺成之后,能牵着天龙八部,拿着倚天和屠龙,相伴神雕侠侣一起笑傲江湖.当然.相信有我之心的人不在少数.
缘何如此?黑客从某方面来说,代表着技术巅峰,对于IT人来说,踏到这个巅峰就像拿到国家科技奖般令人万种钦佩.就像披红戴帽,骑马游街般令人争相敬仰.虽然,其泡MM效果还比不上帮她装个系统,杀个小毒.同时,成为黑客也意味着这辈子你注定会是个抢手货.挥动下手指就能享受白领高薪待遇.在如今我们这个人才和木材匮乏的国家,你将是个成功的典范.
不过,黑客所以为黑,而不是白.全在于它的不请自入.跟小偷的原理很相像.盗取资料数据还不让你知道.手段高超者,事后连脚印指纹唇纹头发脚毛都不留一点.叫你后院着火叫苦连天之际却不知哪家阿猫阿狗干的.论卑鄙可恶程度,确实犹甚于小偷小摸.这可能也是导演为什么宁愿花血本请来飞机却不敢舍小钱请个黑客顾问的原因吧.
我也很想成了个黑客.像小榕样,只要花个几分钟,就能黑一个网站.不过,我也知道,技术到了那个程度,已是不屑于干这活了.网站被黑往往要么是某个菜鸟级别黑客在练练手,要么就是某个后台组织带有牟利性的行为.不管是哪个原因,做为个IT人,还是不要去以身试法了.要知道现在的网络警察叔叔一天24小时拿着先进性武器,读着先进性教育在网络上监督着呢.要是实在想锻炼自己的能力, 干脆多借几台电脑自己在家随便整.
因为,黑客,可是个禁区哦.