1.      基本命令:

1.      ls

2.      cd

3.      mkdir

4.   cp (cp-r)           -r 复制所有文件和子目录

5.      rm (rm-rf)          -rf 删除非空目录

6.      locate              搜索一个文件

7.      nano –w            文本编辑器

8.      man + help          帮助文档

9.      apt-get +install,remove,update,upgrade,dist-upgrade 安装、删除、更新包

10.  aptitude             一个管理包的程序

11.  dep +url,dep-src+url   添加一个更新服务器

12.  dpkg -i package_file.deb  安装一个用户包

13.  dpkg -r package_name       删除一个用户包

14.  gedit

15.  sudo pass root   / sudo passwd -l root   设定用户密码

16.  apt-cache show <package>

apt-cache showpkg <package>

17.    tar –xvf  (-zxvf)       一个解压文件.gz和.tar的工具

18.    rpm –ql  (-ihv)            安装一个.rpm文件

19.    alien filename.rpm filename.deb  将.rpm 转换成 .deb

20.    mount -o loop -t iso9660 [ISO文件路径] [挂载路径A]   虚拟光盘

21.    apache2ctl -k restart          apache 服务器重启

22.    chown user file               改变文件、目录所属用户

23.    chown :users file             改变文件、目录所属用户组

24.    chmod –r 777 file          设定文件、目录所有用户均可访问

25.    ls-l          查看文件、目录的权限

26.    chmod a+x file        同24

27.    wget http://www.zlib.net/zlib-1.2.3.tar.gz

28.    build-essential

2.      控制台:

1.      ctr+alt+F1 ----  ctrl+alt+F6  console1 to console6

2.      ctr+alt+F7 to desktop

3. root 激活:

1. 进入 recovery模式

2. passwd root

LINUX下修改日期时间的方法

Linux机器上的时间比较复杂,有各式各样的时钟和选项等等。

机器里有两个时钟。硬件时钟从根本上讲是CMOS时钟,而系统时钟是由内核维护的。

1.修改硬件时钟的可以使用下面的方法:

你就可以用它来随时更新你的硬件时间,命令为:

hwclock --adjust
硬件时钟通常被设置成全球标准时间(UTC),而将时区信息保存在/usr/share/lib/timezone (或者在某些系统中可能是/usr/local/timezone)目录下某个适当的文件中,然后用一个符号链接文件/etc/localtime指向它。

查看硬件时钟用命令:
hwclock --show

重置硬件时钟用:
hwclock --set --date="07/08/05 10:10:59"

如果需要修改你的时区信息,可以使用tzset命令,如果你系统中没有这条命令,那可以用类似下面的操作:

ln -s /etc/localtime /usr/share/zoneinfo/US/Pacific

2.修改系统时钟的可以使用下面的方法:

data 10110155 就可以将时间调整为10月11日凌晨1点55分

比如将系统时间设定成2005年8月8日的命令如下。

#date -s 2005/08/08
将系统时间设定成下午8点12分0秒的命令如下。
#date -s 20:12:00

这是修改系统时钟,由于LINUX系统是间隔一段时间才重新写硬件时钟,
因此使用date -s修改完成之后,马上重新启动计算机,就有可能修改的系统
时间没有写入CMOSS中,所以最好
#clock -w
这个命令强行写入CMOS。

安装C/C++编译器及其工具

1.      安装C/C++编译器

2.           apt-get install gcc

3.      安装相关构建工具

4.           apt-get install build-essential

5.      安装zlib

6.           cd /home/kubuntu/Downloads/

7.           wget http://www.zlib.net/zlib-1.2.3.tar.gz

8.           tar xzvf zlib-1.2.3.tar.gz

9.           cd zlib-1.2.3

10.       ./configure

11.       make

12.       make install

如何设置UNIX/LINUX中的文件及目录权限
作者:佚名    转贴自:本站原创    点击数:406

在UNIX中,所有的文件及目录都拥有自己的访问权限,来限制用户的访问,提高系统的安全性.
每个文件及目录都有三个级别的权限:所有者级别(u),组访问级别(g),其他用户访问级别(o).每个级别都有三个权限:读(r),写(w),执行(x).
例如:

#ls -la
-rwxrwxrwx 1 root root 6789 Nov 1 09:01 abc.c
drwxr-xr-x 2 root root 51 Nov 1 10:20 tool

abc.c为一个文件,第一个rwx表示文件所有者(即文件属主)的权限为读写执行.第二个rwx表示同组用户的权限为读写执行.每三个rwx表示其他组用户的权限为读写执行.
tool为一个目录,每一个rwx表示目录所有者(即目录属主)的权限为读写执行.第二r-x表示同组用户的权限为读执行.第三个r-x表示其他组用户的权限为读执行.
我们可以用1,0来表示权限的设置与否.没有设置权限-,用0表示,设置了权限(不管是r,w或x),用1表示.

用0,1表示 转换为八进制数表示
没有权限 --- 000 0
执行权限 --x 001 1
写权限 -w- 010 2
写执行权限 -wx 011 3
读权限 r-- 100 4
读执行权限 r-x 101 5
读写权限 rw- 110 6
读写执行权限 rwx 111 7

下面便让我们看一看该如何设置权限.举例如下:
#chmod u+rwx abc.c 设置abc.c文件属主的权限为rwx
#chmod g+rwx abc.c 设置abc.c文件同组用户的权限为rwx
#chmod o+rwx abc.c 设置其他组的用户对abc.c文件有读,写,执行权限
这种设置等效于:
#chmod 777 abc.c
也等效于:
#chmod a+rwx abc.c (a表示所有用户)
让我们再看一个例子:
#chmod 755 lpsed
等效于:
#chmod u+rwx lpsed
#chmod g+r-x lpsed
#chmod o+r-x lpsed
表示所有的用户对文件lpsed都有读及执行权限,只有文件属主可以改变文件.即写权限。

一、理解Linux的单用户多任务,多用户多任务概念;

Linux 是一个多用户、多任务的操作系统;我们应该了解单用户多任务和多用户多任务的概念;

1、Linux 的单用户多任务;

单用户多任务;比如我们以benignant 登录系统,进入系统后,我要打开gedit 来写文档,但在写文档的过程中,我感觉少点音乐,所以又打开xmms 来点音乐;当然听点音乐还不行,MSN 还得打开,想知道几个弟兄现在正在做什么,这样一样,我在用beinan 用户登录时,执行了gedit 、xmms以及msn等,当然还有输入法fcitx ;这样说来就有点简单了,一个beinan用户,为了完成工作,执行了几个任务;当然beinan这个用户,其它的人还能以远程登录过来,也能做其它的工作。

2、Linux 的多用户、多任务;
有时可能是很多用户同时用同一个系统,但并不所有的用户都一定都要做同一件事,所以这就有多用户多任务之说;
举个例子,比如LinuxSir.Org 服务器,上面有FTP 用户、系统管理员、web 用户、常规普通用户等,在同一时刻,可能有的弟兄正在访问论坛;有的可能在上传软件包管理子站,比如luma 或Yuking 兄在管理他们的主页系统和FTP ;在与此同时,可能还会有系统管理员在维护系统;浏览主页的用的是nobody 用户,大家都用同一个,而上传软件包用的是FTP用户;管理员的对系统的维护或查看,可能用的是普通帐号或超级权限root帐号;不同用户所具有的权限也不同,要完成不同的任务得需要不同的用户,也可以说不同的用户,可能完成的工作也不一样;
值得注意的是:多用户多任务并不是大家同时挤到一接在一台机器的的键盘和显示器前来操作机器,多用户可能通过远程登录来进行,比如对服务器的远程控制,只要有用户权限任何人都是可以上去操作或访问的;

3、用户的角色区分;
用户在系统中是分角色的,在Linux 系统中,由于角色不同,权限和所完成的任务也不同;值得注意的是用户的角色是通过UID和识别的,特别是UID;在系统管理中,系统管理员一定要坚守UID 唯一的特性;
root 用户:系统唯一,是真实的,可以登录系统,可以操作系统任何文件和命令,拥有最高权限;
虚拟用户:这类用户也被称之为伪用户或假用户,与真实用户区分开来,这类用户不具有登录系统的能力,但却是系统运行不可缺少的用户,比如bin、daemon、adm、ftp、mail等;这类用户都系统自身拥有的,而非后来添加的,当然我们也可以添加虚拟用户;
普通真实用户:这类用户能登录系统,但只能操作自己家目录的内容;权限有限;这类用户都是系统管理员自行添加的;

4、多用户操作系统的安全;
多用户系统从事实来说对系统管理更为方便。从安全角度来说,多用户管理的系统更为安全,比如beinan用户下的某个文件不想让其它用户看到,只是设置一下文件的权限,只有beinan一个用户可读可写可编辑就行了,这样一来只有beinan一个用户可以对其私有文件进行操作,Linux 在多用户下表现最佳,Linux能很好的保护每个用户的安全,但我们也得学会Linux 才是,再安全的系统,如果没有安全意识的管理员或管理技术,这样的系统也不是安全的。
从服务器角度来说,多用户的下的系统安全性也是最为重要的,我们常用的Windows 操作系统,它在系纺权限管理的能力只能说是一般般,根本没有没有办法和Linux或Unix 类系统相比;

二、用户(user)和用户组(group)概念;

1、用户(user)的概念;

通过前面对Linux 多用户的理解,我们明白Linux 是真正意义上的多用户操作系统,所以我们能在Linux系统中建若干用户(user)。比如我们的同事想用我的计算机,但我不想让他用我的用户名登录,因为我的用户名下有不想让别人看到的资料和信息(也就是隐私内容)这时我就可以给他建一个新的用户名,让他用我所开的用户名去折腾,这从计算机安全角度来说是符合操作规则的;
当然用户(user)的概念理解还不仅仅于此,在Linux系统中还有一些用户是用来完成特定任务的,比如nobody和ftp 等,我们访问LinuxSir.Org 的网页程序,就是nobody用户;我们匿名访问ftp 时,会用到用户ftp或nobody ;如果您想了解Linux系统的一些帐号,请查看 /etc/passwd ;

2、用户组(group)的概念;

用户组(group)就是具有相同特征的用户(user)的集合体;比如有时我们要让多个用户具有相同的权限,比如查看、修改某一文件或执行某个命令,这时我们需要用户组,我们把用户都定义到同一用户组,我们通过修改文件或目录的权限,让用户组具有一定的操作权限,这样用户组下的用户对该文件或目录都具有相同的权限,这是我们通过定义组和修改文件的权限来实现的;
举例:我们为了让一些用户有权限查看某一文档,比如是一个时间表,而编写时间表的人要具有读写执行的权限,我们想让一些用户知道这个时间表的内容,而不让他们修改,所以我们可以把这些用户都划到一个组,然后来修改这个文件的权限,让用户组可读,这样用户组下面的每个用户都是可读的;

用户和用户组的对应关系是:一对一、多对一、一对多或多对多;

一对一:某个用户可以是某个组的唯一成员;
多对一:多个用户可以是某个唯一的组的成员,不归属其它用户组;比如beinan和linuxsir两个用户只归属于beinan用户组;
一对多:某个用户可以是多个用户组的成员;比如beinan可以是root组成员,也可以是linuxsir用户组成员,还可以是adm用户组成员;
多对多:多个用户对应多个用户组,并且几个用户可以是归属相同的组;其实多对多的关系是前面三条的扩展;理解了上面的三条,这条也能理解;

三、用户(user)和用户组(group)相关的配置文件、命令或目录;

1、与用户(user)和用户组(group)相关的配置文件;

1)与用户(user)相关的配置文件;
/etc/passwd 注:用户(user)的配置文件;
/etc/shadow 注:用户(user)影子口令文件;

2)与用户组(group)相关的配置文件;

/etc/group 注:用户组(group)配置文件;
/etc/gshadow 注:用户组(group)的影子文件;

2、管理用户(user)和用户组(group)的相关工具或命令;

1)管理用户(user)的工具或命令;
useradd 注:添加用户
adduser 注:添加用户

useradd -g mail

userdel  注:删除用户

passwd 注:为用户设置密码
usermod 注:修改用户命令,可以通过usermod 来修改登录名、用户的家目录等等;
pwcov 注:同步用户从/etc/passwd 到/etc/shadow
pwck 注:pwck是校验用户配置文件/etc/passwd 和/etc/shadow 文件内容是否合法或完整;
pwunconv 注:是pwcov 的立逆向操作,是从/etc/shadow和 /etc/passwd 创建/etc/passwd ,然后会删除 /etc/shadow 文件;
finger 注:查看用户信息工具
id 注:查看用户的UID、GID及所归属的用户组
chfn 注:更改用户信息工具
su 注:用户切换工具
sudo 注:sudo 是通过另一个用户来执行命令(execute a command as another user),su 是用来切换用户,然后通过切换到的用户来完成相应的任务,但sudo 能后面直接执行命令,比如sudo 不需要root 密码就可以执行root 赋与的执行只有root才能执行相应的命令;但得通过visudo 来编辑/etc/sudoers来实现;
visudo 注:visodo 是编辑 /etc/sudoers 的命令;也可以不用这个命令,直接用vi 来编辑 /etc/sudoers 的效果是一样的;
sudoedit 注:和sudo 功能差不多;

2)管理用户组(group)的工具或命令;
groupadd 注:添加用户组;
groupdel 注:删除用户组;

groupmod 注:修改用户组信息
groups 注:显示用户所属的用户组
grpck
grpconv 注:通过/etc/group和/etc/gshadow 的文件内容来同步或创建/etc/gshadow ,如果/etc/gshadow 不存在则创建;
grpunconv 注:通过/etc/group 和/etc/gshadow 文件内容来同步或创建/etc/group ,然后删除gshadow文件;

3、/etc/skel 目录;

/etc/skel目录一般是存放用户启动文件的目录,这个目录是由root权限控制,当我们添加用户时,这个目录下的文件自动复制到新添加的用户的家目录下;/etc/skel 目录下的文件都是隐藏文件,也就是类似.file格式的;我们可通过修改、添加、删除/etc/skel目录下的文件,来为用户提供一个统一、标准的、默认的用户环境;
[root@localhost beinan]# ls -la /etc/skel/
总用量 92
drwxr-xr-x 3 root root 4096 8月 11 23:32 .
drwxr-xr-x 115 root root 12288 10月 14 13:44 ..
-rw-r--r-- 1 root root 24 5月 11 00:15 .bash_logout
-rw-r--r-- 1 root root 191 5月 11 00:15 .bash_profile
-rw-r--r-- 1 root root 124 5月 11 00:15 .bashrc
-rw-r--r-- 1 root root 5619 2005-03-08.canna
-rw-r--r-- 1 root root 438 5月 18 15:23 .emacs
-rw-r--r-- 1 root root 120 5月 23 05:18 .gtkrc
drwxr-xr-x 3 root root 4096 8月 11 23:16 .kde
-rw-r--r-- 1 root root 658 2005-01-17.zshrc
/etc/skel 目录下的文件,一般是我们用useradd 和adduser 命令添加用户(user)时,系统自动复制到新添加用户(user)的家目录下;如果我们通过修改 /etc/passwd 来添加用户时,我们可以自己创建用户的家目录,然后把/etc/skel 下的文件复制到用户的家目录下,然后要用chown 来改变新用户家目录的属主;

4、/etc/login.defs 配置文件;

/etc/login.defs 文件是当创建用户时的一些规划,比如创建用户时,是否需要家目录,UID和GID的范围;用户的期限等等,这个文件是可以通过root来定义的;
比如Fedora 的 /etc/logins.defs 文件内容;
# *REQUIRED*
# Directory where mailboxes reside, _or_ name of file, relative to the
# home directory. If you _do_ define both, MAIL_DIR takes precedence.
# QMAIL_DIR is for Qmail
#
#QMAIL_DIR Maildir
MAIL_DIR /var/spool/mail 注:创建用户时,要在目录/var/spool/mail中创建一个用户mail文件;
#MAIL_FILE .mail
# Password aging controls:
#
# PASS_MAX_DAYS Maximum number of days a password may be used.
# PASS_MIN_DAYS Minimum number of days allowed between password changes.
# PASS_MIN_LEN Minimum acceptable password length.
# PASS_WARN_AGE Number of days warning given before a password expires.
#
PASS_MAX_DAYS 99999 注:用户的密码不过期最多的天数;
PASS_MIN_DAYS 0 注:密码修改之间最小的天数;
PASS_MIN_LEN 5 注:密码最小长度;
PASS_WARN_AGE 7 注:
#
# Min/max values for automatic uid selection in useradd
#
UID_MIN 500 注:最小UID为500 ,也就是说添加用户时,UID 是从500开始的;
UID_MAX 60000 注:最大UID为60000;
#
# Min/max values for automatic gid selection in groupadd
#
GID_MIN 500 注:GID 是从500开始;
GID_MAX 60000
#
# If defined, this command is run when removing a user.
# It should remove any at/cron/print jobs etc. owned by
# the user to be removed (passed as the first argument).
#
#USERDEL_CMD /usr/sbin/userdel_local
#
# If useradd should create home directories for users by default
# On RH systems, we do. This option is ORed with the -m flag on
# useradd command line.
#
CREATE_HOME yes 注:是否创用户家目录,要求创建;

5、/etc/default/useradd 文件;
通过useradd 添加用户时的规则文件;
# useradd defaults file
GROUP=100
HOME=/home 注:把用户的家目录建在/home中;
INACTIVE=-1 注:是否启用帐号过期停权,-1表示不启用;
EXPIRE= 注:帐号终止日期,不设置表示不启用;
SHELL=/bin/bash 注:所用SHELL的类型;
SKEL=/etc/skel 注: 默认添加用户的目录默认文件存放位置;也就是说,当我们用adduser添加用户时,用户家目录下的文件,都是从这个目录中复制过去的;

Linux系统中的每个文件和目录都有访问许可权限,用它来确定谁可以通过何种方式对文件和目录进行访问和操作。

  文件或目录的访问权限分为只读,只写和可执行三种。以文件为例,只读权限表示只允许读其内容,而禁止对其做任何的更改操作。可执行权限表示允许将该文件作为一个程序执行。文件被创建时,文件所有者自动拥有对该文件的读、写和可执行权限,以便于对文件的阅读和修改。用户也可根据需要把访问权限设置为需要的任何组合。

  有三种不同类型的用户可对文件或目录进行访问:文件所有者,同组用户、其他用户。所有者一般是文件的创建者。所有者可以允许同组用户有权访问文件,还可以将文件的访问权限赋予系统中的其他用户。在这种情况下,系统中每一位用户都能访问该用户拥有的文件或目录。

  每一文件或目录的访问权限都有三组,每组用三位表示,分别为文件属主的读、写和执行权限;与属主同组的用户的读、写和执行权限;系统中其他用户的读、写和执行权限。当用ls -l命令显示文件或目录的详细信息时,最左边的一列为文件的访问权限。例如:

  $ ls -l sobsrc. tgz

  -rw-r--r-- 1 root root 483997 Ju1 l5 17:3l sobsrc. tgz

  横线代表空许可。r代表只读,w代表写,x代表可执行。注意这里共有10个位置。第一个字符指定了文件类型。在通常意义上,一个目录也是一个文件。如果第一个字符是横线,表示是一个非目录的文件。如果是d,表示是一个目录。

  例如:

  - rw- r-- r--

  普通文件 文件主 组用户 其他用户

  是文件sobsrc.tgz 的访问权限,表示sobsrc.tgz是一个普通文件;sobsrc.tgz的属主有读写权限;与sobsrc.tgz属主同组的用户只有读权限;其他用户也只有读权限。

  确定了一个文件的访问权限后,用户可以利用Linux系统提供的chmod命令来重新设定不同的访问权限。也可以利用chown命令来更改某个文件或目录的所有者。利用chgrp命令来更改某个文件或目录的用户组。

  Linux系统中的每个文件和目录都有访问许可权限,用它来确定谁可以通过何种方式对文件和目录进行访问和操作。

  文件或目录的访问权限分为只读,只写和可执行三种。以文件为例,只读权限表示只允许读其内容,而禁止对其做任何的更改操作。可执行权限表示允许将该文件作为一个程序执行。文件被创建时,文件所有者自动拥有对该文件的读、写和可执行权限,以便于对文件的阅读和修改。用户也可根据需要把访问权限设置为需要的任何组合。

  有三种不同类型的用户可对文件或目录进行访问:文件所有者,同组用户、其他用户。所有者一般是文件的创建者。所有者可以允许同组用户有权访问文件,还可以将文件的访问权限赋予系统中的其他用户。在这种情况下,系统中每一位用户都能访问该用户拥有的文件或目录。

  每一文件或目录的访问权限都有三组,每组用三位表示,分别为文件属主的读、写和执行权限;与属主同组的用户的读、写和执行权限;系统中其他用户的读、写和执行权限。当用ls -l命令显示文件或目录的详细信息时,最左边的一列为文件的访问权限。例如:

  $ ls -l sobsrc. tgz

  -rw-r--r-- 1 root root 483997 Ju1 l5 17:3l sobsrc. tgz

  横线代表空许可。r代表只读,w代表写,x代表可执行。注意这里共有10个位置。第一个字符指定了文件类型。在通常意义上,一个目录也是一个文件。如果第一个字符是横线,表示是一个非目录的文件。如果是d,表示是一个目录。

  例如:

  - rw- r-- r--

  普通文件 文件主 组用户 其他用户

  是文件sobsrc.tgz 的访问权限,表示sobsrc.tgz是一个普通文件;sobsrc.tgz的属主有读写权限;与sobsrc.tgz属主同组的用户只有读权限;其他用户也只有读权限。

  确定了一个文件的访问权限后,用户可以利用Linux系统提供的chmod命令来重新设定不同的访问权限。也可以利用chown命令来更改某个文件或目录的所有者。利用chgrp命令来更改某个文件或目录的用户组。

  Linux系统中的每个文件和目录都有访问许可权限,用它来确定谁可以通过何种方式对文件和目录进行访问和操作。

  文件或目录的访问权限分为只读,只写和可执行三种。以文件为例,只读权限表示只允许读其内容,而禁止对其做任何的更改操作。可执行权限表示允许将该文件作为一个程序执行。文件被创建时,文件所有者自动拥有对该文件的读、写和可执行权限,以便于对文件的阅读和修改。用户也可根据需要把访问权限设置为需要的任何组合。

  有三种不同类型的用户可对文件或目录进行访问:文件所有者,同组用户、其他用户。所有者一般是文件的创建者。所有者可以允许同组用户有权访问文件,还可以将文件的访问权限赋予系统中的其他用户。在这种情况下,系统中每一位用户都能访问该用户拥有的文件或目录。

  每一文件或目录的访问权限都有三组,每组用三位表示,分别为文件属主的读、写和执行权限;与属主同组的用户的读、写和执行权限;系统中其他用户的读、写和执行权限。当用ls -l命令显示文件或目录的详细信息时,最左边的一列为文件的访问权限。例如:

  $ ls -l sobsrc. tgz

  -rw-r--r-- 1 root root 483997 Ju1 l5 17:3l sobsrc. tgz

  横线代表空许可。r代表只读,w代表写,x代表可执行。注意这里共有10个位置。第一个字符指定了文件类型。在通常意义上,一个目录也是一个文件。如果第一个字符是横线,表示是一个非目录的文件。如果是d,表示是一个目录。

  例如:

  - rw- r-- r--

  普通文件 文件主 组用户 其他用户

  是文件sobsrc.tgz 的访问权限,表示sobsrc.tgz是一个普通文件;sobsrc.tgz的属主有读写权限;与sobsrc.tgz属主同组的用户只有读权限;其他用户也只有读权限。

  确定了一个文件的访问权限后,用户可以利用Linux系统提供的chmod命令来重新设定不同的访问权限。也可以利用chown命令来更改某个文件或目录的所有者。利用chgrp命令来更改某个文件或目录的用户组。
  下面分别对这些命令加以介绍。

  chmod 命令

  chmod命令是非常重要的,用于改变文件或目录的访问权限。用户用它控制文件或目录的访问权限。

  该命令有两种用法。一种是包含字母和操作符表达式的文字设定法;另一种是包含数字的数字设定法。

  1. 文字设定法

  chmod [who] [+ | - | =] [mode] 文件名?

  命令中各选项的含义为:

  操作对象who可是下述字母中的任一个或者它们的组合:

  u 表示“用户(user)”,即文件或目录的所有者。

  g 表示“同组(group)用户”,即与文件属主有相同组ID的所有用户。

  o 表示“其他(others)用户”。

  a 表示“所有(all)用户”。它是系统默认值。

  操作符号可以是:

  + 添加某个权限。

  - 取消某个权限。

  = 赋予给定权限并取消其他所有权限(如果有的话)。

  设置mode所表示的权限可用下述字母的任意组合:

  r 可读。

  w 可写。

  x 可执行。

  X 只有目标文件对某些用户是可执行的或该目标文件是目录时才追加x 属性。

  s 在文件执行时把进程的属主或组ID置为该文件的文件属主。方式“u+s”设置文件的用户ID位,“g+s”设置组ID位。

  t 保存程序的文本到交换设备上。

  u 与文件属主拥有一样的权限。

  g 与和文件属主同组的用户拥有一样的权限。

  o 与其他用户拥有一样的权限。

  文件名:以空格分开的要改变权限的文件列表,支持通配符。

  在一个命令行中可给出多个权限方式,其间用逗号隔开。例如:chmod g+r,o+r example

  使同组和其他用户对文件example 有读权限。

  2. 数字设定法

  我们必须首先了解用数字表示的属性的含义:0表示没有权限,1表示可执行权限,2表示可写权限,4表示可读权限,然后将其相加。所以数字属性的格式应为3个从0到7的八进制数,其顺序是(u)(g)(o)。

  例如,如果想让某个文件的属主有“读/写”二种权限,需要把4(可读)+2(可写)=6(读/写)。

  数字设定法的一般形式为:

  chmod [mode] 文件名?

关于samba

一、首先以root身分登录进入系统。

二、编辑/etc/smb.conf文件,将"unix password sync = no"这个一句改为 "unix password sync = yes"。这样子的话,以后系统增加使用者时,会自动将该使用者的密码也更新到/etc/smbpasswd内 (Samba的帐号密码文件)。

三、到/home目录下增加下列目录,并指定这些目录的权限: 

/home/pub nobody:nobody 777   
/home/read-only root:root 755   
/home/user1 user1:user1 700

四、编辑/etc/smb.conf这个文件,修改:

   security = share

五、编辑/etc/smb.conf这个文件,到文件最后面增加下面几句:

   [public]
   comment = Public Areas
   path = /home/pub
   browseable = yes
   guest ok = yes
   writable =yes

   [read-only]
   comment = Read-Only Areas
   path = /home/read-only
   browseable = yes
   guest ok = yes

   [user1]
   comment = Password Required
   path = /home/user1
   browseable = yes
   writable = yes

  完成后存盘离开。

六、重行运行Samba:

   samba restart

一些防火墙设置

原作者:Anton Chuvakin

在过去几年中,Linux作为防火墙平台的应用显著增长。从早期1.2版内核的ipfwadm开始,Linux的防火墙代码也走过了很长一段路程了。在2.4版的Linux内核中,使用了netfilter体系。在最新的2.4版中,Linux大大加强了安全性,例如:更好的加密支持和netfilter体系的使用。netfilter具有完全的向后兼容性。

本文将对iptables的配置做一个综述并且重点介绍一些iptables的配置工具。本文的讨论将着眼于Linux内核的IP防火墙以及其各种界面的配置工具,比如:GUI或者脚本(shell、Perl或者特定的配置语言)。使用这些工具能够简化iptables的配置减少配置的错误。关于iptables的知识请参考Rusty Russell写的Linux iptables HOWTO。

使用命令行配置iptables的困难

使用iptables的命令行接口来配置iptables防火墙对一个人来说是一个挑战,用户很难指定所有IP报文的行为。用户需要对TCP/IP和应用层协议有较深的了解。象其前辈ipchains一样,iptables把IP过滤规则归并到链中,IP报文遍历规则链接受处理,还可以送到另外的链接受处理,或者最后由默认策略(ACCEPT、DROP、REJECT)处理。有些网络应用程序比其它一些程序更容易穿过防火墙,因此需要理解网络连接的建立和断开。

我们看一下POP3协议,这是最简单的协议之一。允许所有向内目标端口是110的报文通过通过无法解决所有的管理问题,因为这样只能使客户端向发出申请,而服务器却无法应答。另外,如果使用网络地址转换(NAT)和其它方式的报文转发,也存在许多问题。因为防火墙的配置将影响到整个企业的安全,所以应该特别小心。下面将大概地讨论iptables的配置,要获得更多细节请参考Linux iptables HOWTO

iptables的命令行选项

在进入这时的讨论之前,我们看一下iptables命令行选项的一个总结。

规则链维护选项

1.建立新的规则链(-N)
2.删除一个空的规则链(-X)
3.改变一个内置规则链的策略(-P)
4.列出一条规则链中的规则(-L)
5.擦写一条规则链中的规则(-F)

规则维护

1.在一条规则链中加入一条新的规则(-A)
2.删除一条规则链中某个位置的规则(-D)

iptables的优点

在讨论各种iptables配置工具之前,让我们看一下iptables的优点,尤其是netfilter比ipchains具有的优势。

iptables允许建立状态(stateful)防火墙,就是在内存中保存穿过防火墙的每条连接。这种模式对于有效地配置FTP和DNS以及其它网络服务是必要的。

iptables能够过滤TCP标志任意组合报文,还能够过滤MAC地址。

系统日志比ipchains更容易配置,扩展性也更好。

对于网络地址转换(Network Address Translation)和透明代理的支持,netfilter更为强大和易于使用。

iptable能够阻止某些DOS攻击,例如SYS洪泛攻击。

iptables配置工具

现在,我们看一下Linux iptables的一些配置工具。我主要关注每个工具的特征、弹性和易用性。我们将讨论以下的工具:

MonMotha's Firewall 2.3.5作者:MonMotha

Firewallscript (iptables 4.4c-3 devel) 作者:Patrik Hildingsson

Ferm-0.0.18 作者:Auke Kok

AGT-0.83 作者:Andy Gilligan

Knetfilter-1.2.4 作者:Luigi Genoni

gShield-2.0.2 作者:R. Gregory

MonMotha的Firewall 2.3.5

MonMotha写的Firewall 2.3.5是一个大约30K的shell脚本。目前,主要适用于基于主机的保护,因为一些基于网络的选项正在开发中。这个脚本的界面(例如:给iptables传递配置选项的方法)有点混乱。不过,它不需要配置文件而且安装容易,直接复制到任何地方都可以。默认情况下,它根本不做什么,实际上根本就不执行,也缺少文档。这个脚本对于拨号用户可能有点用处。

Firewallscript

Firewallscript(IFS 4.4d)也是一个bash脚本,大约有85K。这个脚本可以用于基于主机和网络的防护。首次运行时,它会直接产生一个配置文件。不过,在默认情况下,这个文件不起什么作用,只有测试作用。这个脚本可以配置NAT和地址伪装。这个脚本非常复杂,但是缺少文档,因此最好能够仔细阅读它的代码,使用iptables -L命令哪个链已经生效,什么被允许/拒绝。这个脚本的IP报文追踪功能还可以为你提供娱乐。此外,它还会自动探测、加载iptables需要的内核模块。这个脚本和上一个脚本还具有取消(undo)功能,能够恢复iptables原来的配置文件。

Ferm

Ferm是一个Perl脚本,使用一种类C语言写成的配置文件。这种语言非常容易阅读和理解。这个脚本有很好的文档和丰富的示例作为参考。

这是一个例子:

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

# simple workstation example for ferm

chain input

{
if ppp0 # put your outside interface here
{
proto tcp goto fw_tcp;
proto udp goto fw_udp;
proto icmp goto fw_icmp;
}
}

chain fw_tcp proto tcp {
dport ssh ACCEPT;
syn DENY log;
dport domain ACCEPT;
dport 0:1023 DENY log;
}

chain fw_udp proto udp {
DENY log;
}

chain fw_icmp proto icmp {
icmptype (
destination-unreachable time-exceeded
) ACCEPT;
DENY log;
}

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

这个配置文件将使ferm产生iptables如下规则:允许向外的ssh和DNS报文通过;阻塞所有的UDP报文;只允许两种类型的ICMP消息通过:目的不可达和超时,并绝拒绝和日志其它类型的ICMP消息。

AGT

AGT是一个使用C语言编写的程序。从它的代码来看,目前还处于开发阶段。不支持automake,需要手工编辑Makefile文件,文档也不是很丰富,但是其配置文件非常简单。下面就是一个配置文件:

NEW | FROM-INT
NEW | RESET

|| FROM-INT | icmp | ACCEPT |||||
|| FROM-INT | tcp | ACCEPT ||||| pop3
|| FROM-INT | tcp | ACCEPT ||||| imap

|| RESET | tcp | REJECT --reject-with tcp-reset |||||

这样的文件格式,加上缺乏必要的文档,对使用者来说是一个很大的挑战。而且最好多花些时间学学iptables。

knetfilter

knetfilter是一个非常棒的图形化iptables配置工具,它是基于KDE的(有KDE1和KDE2两个版本)。knetfilter非常易于上手,你可以很容易地使用它来配置基于主机保护的规则和规则列表;保存和恢复测这些规则和规则列表;测试规则和规则列表(在同一个面板上运行tcpdump网络嗅探器),这一切只要点几下鼠标就可以了。它也支持NAT和网络地址伪装的配置。但是,对于拨号工作站,knetfilter工作的不太好,因为它需要本地IP,而且只探测eth0网络接口,不进行PPP探测。这个工程的文档也很少,不过因为是基于图形界面,所以即使不用手册也可以很好地使用。

gShield

gShield是一个bash shell脚本,可能是当前最成熟的一个工具。它的文档非常丰富,配置文件也比较合理直观,还能够设置NAT。它不但能够处静态IP地址,还能够处理动态IP地址(例如:PPP)。

gShield还有图形界面,目前仍然处于早期开发阶段,可以从http://members.home.com/vhodges/gshieldconf.html下载。不过,它似乎只兼容gShield的早期版本(1.x)。

下面是一个示例配置文件:

FW_ROOT="/etc/firewall"
IPTABLES=`which iptables`
LOCALIF="eth0"
DNS="24.31.195.65"
LTIME="20/m"
ALLOW_DHCP_LEASES="YES"
...

gShield使用的默认配置非常安全,特别适合不愿意摆弄配置文件的用户,不过软件的编者建议用户最好能够通读整个配置文件。据README文件讲,gShield实现了"类tcpwrapper风格的服务访问控制功能",使用这个功能用户可以很容易地阻塞/允许某项服务,而不必考虑报文方向之类的问题,只要关心什么客户连接到服务器就可以了。

结论

虽然本文介绍了一些防火墙配置工具,但是实际上目前还没有理想的配置工具。最好的配置工具还是iptables命令,这里介绍的这些工具,只适用于对于使用iptables命令行感觉困难的用户。

声明:如果您认为这篇文章有点转载的价值,那么在转载时请注明文章的出处和作者(包括译者)。请不要拿出:

lion蠕虫分析

作者:Max Vision

作为自己没有侵犯版权的依据,因为Max Vision是美国人,他不会自己用汉语写一篇分析lion蠕虫的文章,虽然lion蠕虫是中国人写的。(读到这里,您可能会感到莫名其妙,已经抄起鸡蛋、西红柿了,但是请相信:我没有发烧,绝对是有感而发,通过这种方式表达自己的愤怒而已)。'

Apache模块 mod_rewrite

说明:

提供了一个基于规则的实时转向URL请求的引擎

状态:

Extension

模块名:

rewrite_module

源文件:

mod_rewrite.c

兼容性:

包含在Apache 1.3及其更新版本中

概要

``The great thing about mod_rewrite is it gives you all the configurability and flexibility of Sendmail. The downside to mod_rewrite is that it gives you all the configurability and flexibility of Sendmail.''

-- Brian Behlendorf
Apache Group

`` Despite the tons of examples and docs, mod_rewrite is voodoo. Damned cool voodoo, but still voodoo. ''

-- Brian Moore
bem@news.cmc.net

欢迎来到mod_rewrite, URL操作的瑞士军刀!

此模块提供了一个基于规则的(使用正则表达式分析器的)实时转向URL请求的引擎。 支持每个规则可以拥有不限数量的规则以及附加条件规则的灵活而且强大的URL操作机制。此URL操作可以取决于各种测试,比如服务器变量、环境变量、HTTP头、时间标记,甚至各种格式的用于匹配URL组成部分的查找数据库。

此模块可以操作URL的所有部分(包括路径信息部分), 在服务器级的(httpd.conf)和目录级的(.htaccess)配置都有效, 还可以生成最终请求串。此重写操作的结果可以是内部子处理,也可以是外部请求的转向,甚至还可以是内部代理处理。

但是,所有这些功能和灵活性带来一个问题,那就是复杂性, 因此,不要指望一天之内就能看懂整个模块。

此模块从1997年7月起为Apache Group所专用,由以下这些人创建于1996年4月

Ralf S. Engelschall
rse@engelschall.com
www.engelschall.com

指令索引

  • RewriteBase
  • RewriteCond
  • RewriteEngine
  • RewriteLock
  • RewriteLog
  • RewriteLogLevel
  • RewriteMap
  • RewriteOptions
  • RewriteRule

主题

  • 内部处理
  • 环境变量
  • 实用方案

内部处理

此模块的内部处理极为复杂,但是,为了使一般用户避免犯低级错误, 也让管理员能充分利用其功能,在此仍然做一下说明。

API程序段

首先,你必须了解,Apache是通过若干程序段来处理HTTP请求的。 Apache API 对每个程序段提供了一个hook程序。 Mod_rewrite使用两个hook程序: 其一是,URL到文件名的转译hook,用在读取HTTP请求之后,而在授权开始之前;其二是,修正hook,用在授权程序段和读取目录级配置文件(.htaccess)之后,而在内容处理器激活之前。

所以,Apache收到一个请求并且确定了响应主机(或者是虚拟主机)之后, 重写引擎即开始执行URL到文件名程序段,以处理服务器级的配置中所有的mod_rewrite指令。 在最终数据目录确定以后,进入修正程序段并触发目录级配置中的mod_rewrite指令。这两个程序段并不是泾渭分明的,但都实施把URL重写成新的URL或者文件名。虽然API最初不是为此设计的,但它已经成为API的一种用途, 而在Apache 1.x 中这是mod_rewrite唯一的实现方法。 记住以下两点,会有助于更好地理解:

  1. 虽然mod_rewrite可以重写URL为URL,重写URL为文件名, 甚至重写文件名为文件名,但是目前API只提供一个URL到文件名的hook。 在Apache 2.0 中,增加了两个丢失hook以使处理过程更清晰。 但是,这样做并没有给用户带来麻烦,只需记住这样一个事实: Apache借助URL到文件名的hook而比API设计的目标功能更强大。
  2. 难以置信的是,mod_rewrite提供了目录级的URL操作,.htaccess文件, 而这些文件必须在URL转换成文件名以后的较多步骤完成之后才会被处理。 这也是必须的,因为.htaccess文件存在于文件系统中,所以处理已经到达这个层面。 换句话说,根据API程序段,这时再处理任何URL操作已经太晚了。 为了解决这个鸡和蛋的问题,mod_rewrite使用了一个技巧: 在进行一个目录级的URL/文件名的操作时,mod_rewrite先把文件名重写回相应的URL (通常这个操作是不可行的,但是参考下面的RewriteBase指令就明白它是怎么实现的), 然后,对这个新的URL建立一个新的内部的子请求,以此重新开始API程序段的执行。

另外,mod_rewrite尽力使这些复杂的操作对用户全透明,但仍须记住:服务器级的URL操作速度快而且效率高,而目录级的操作由于这个鸡和蛋的问题速度慢效率也低。 但从另一个侧面看,这却是mod_rewrite得以为一般用户提供(局部限制的)URL操作的唯一方法。

牢记这两点!

规则集的处理

当mod_rewrite在这两个程序段中开始执行时,它会读取配置结构中的配置好的 (或者是在服务启动时建立的服务器级的,或者是Apache核心在遍历目录采集到的目录级的)规则集, 随后,启动URL重写引擎来处理(带有一个或多个条件)的规则集。 无论是服务器级的还是目录级的规则集,都是由同一个URL重写引擎处理,只是处理结果不同而已。

规则集中规则的顺序是很重要的,因为重写引擎是按一种特殊的(非常规的)顺序处理的,其原则是:逐个遍历每个规则(RewriteRule directives), 如果出现一个匹配条件的规则,则可能回头遍历已有的规则条件(RewriteConddirectives)。由于历史的原因,条件规则是置前的,所以控制流程略显冗长,细节见Figure 1。

Figure 1:The control flow through the rewriting ruleset

可见,URL首先与每个规则的Pattern匹配, 如果匹配不成功,mod_rewrite立即终止此规则的处理,继而处理下一个规则。如果匹配成功,mod_rewrite寻找响应的规则条件,如果一个条件都没有, 则简单地用Substitution构造的新的值来替换URL,然后继续处理其他规则。 如果条件存在,则开始一个内部循环按其列出的顺序逐个处理。 对规则的条件的处理有所不同:URL并不与pattern匹配, 而是,首先通过扩展变量、反向引用、查找映射表等步骤建立一个TestString的字符串,随后,用它来与CondPattern匹配。如果匹配不成功,则整个条件集和对应的规则失败;如果匹配成功,则执行下一个规则直到所有条件执行完毕。 如果所有条件得以匹配,则以Substitution替换URL,并且继续处理。

特殊字符的引用

在Apache 1.3.20, TestString and Substitution 字符串中的特殊字符可以用前缀的斜杠来实现转义(即,忽略其特殊含义而视之为普通字符)。 比如,Substitution可以用'/$'来包含一个美元符号,以避免mod_rewrite把它视为反向引用。

正则表达式的反向引用能力

这是很重要的一点:一旦在Pattern或者CondPattern使用了圆括号, 就会建立内部的反向引用,可以使用$N%N来调用(见下述),并且,在SubstitutionTestString中都有效。 Figure 2 说明了反向引用被转换扩展的位置。

Figure 2: The back-reference flow through a rule.

虽然mod_rewrite内部处理的这个过程是比较杂乱的, 但是了解这些可以帮助你阅读下文中指令的讲述。

环境变量

此模块会跟踪两个额外的(非标准的)CGI/SSI环境变量, SCRIPT_URLSCRIPT_URI。他们包含了当前资源的逻辑的网络状态, 而标准的CGI/SSI变量SCRIPT_NAMESCRIPT_FILENAME包含的是物理的系统状态。

注意: 这些变量保持的是其最初被请求时的URI/URL, , 在任何重写操作之前的。 其重要性在于他们是重写操作重写URL到物理路径名的原始依据。

举例

SCRIPT_NAME=/sw/lib/w3s/tree/global/u/rse/.www/index.html
SCRIPT_FILENAME=/u/rse/.www/index.html
SCRIPT_URL=/u/rse/
SCRIPT_URI=http://en1.engelschall.com/u/rse/

实用方案

我们还提供另外一个文档URL Rewriting Guide, 列举了许多基于URL的问题的实用方案,其中你可以找到真实有用的规则集和mod_rewrite的更多信息。

RewriteBase 指令

说明:

设置目录级重写的基准URL

语法:

RewriteBase URL-path

默认值:

参见使用方法.

上下文:

目录, .htaccess

覆盖项:

FileInfo

状态:

Extension

模块:

mod_rewrite

RewriteBase指令显式地设置了目录级重写的基准URL。 在下文中,你可以看见RewriteRule可以用于目录级的配置文件中(.htaccess), 并在局部范围内起作用,即,规则实际处理的只是剥离了本地路径前缀的一部分。处理结束后,这个路径会被自动地附着回去。 默认值是,RewriteBase physical-directory-path

在对一个新的URL进行替换时,此模块必须把这个URL重新注入到服务器处理中。为此,它必须知道其对应的URL前缀或者说URL基准。通常,此前缀就是对应的文件路径。 但是,大多数网站URL不是直接对应于其物理文件路径的,因而一般不能做这样的假定! 所以在这种情况下,就必须用RewriteBase指令来指定正确的URL前缀。

如果你的网站服务器URL不是与物理文件路径直接对应的,而又需要使用RewriteRule指令,则必须在每个对应的.htaccess文件中指定RewriteBase

举例,目录级配置文件内容如下:

#
#  /abc/def/.htaccess -- per-dir config file for directory /abc/def
#  Remember: /abc/def is the physical path of /xyz, i.e., the server
#            has a 'Alias /xyz /abc/def' directive e.g.
#
 
RewriteEngine On
 
#  let the server know that we were reached via /xyz and not
#  via the physical path prefix /abc/def
RewriteBase   /xyz
 
#  now the rewriting rules
RewriteRule   ^oldstuff/.html$  newstuff.html

上述例子中,对/xyz/oldstuff.html 的请求被正确地重写为物理的文件/abc/def/newstuff.html.

For Apache Hackers

以下列出了内部处理的详细步骤:

Request:
  /xyz/oldstuff.html
 
Internal Processing:
  /xyz/oldstuff.html     -> /abc/def/oldstuff.html  (per-server Alias)
  /abc/def/oldstuff.html -> /abc/def/newstuff.html  (per-dir    RewriteRule)
  /abc/def/newstuff.html -> /xyz/newstuff.html      (per-dir    RewriteBase)
  /xyz/newstuff.html     -> /abc/def/newstuff.html  (per-server Alias)
 
Result:
  /abc/def/newstuff.html

虽然这个过程看来很繁复,但是由于目录级重写的到来时机已经太晚了, 它不得不把这个(重写)请求重新注入到Apache核心中,所以Apache内部确实是这样处理的。但是:它的开销并不象看起来的那样大,因为重新注入完全在Apache服务器内部进行, 而且这样的过程在Apache内部也为其他许多操作所使用。 所以,你可以充分信任其设计和实现是正确的。

RewriteCond 指令

说明:

定义重写发生的条件

语法:

RewriteCond TestString CondPattern

上下文:

服务器配置, 虚拟主机, 目录, .htaccess

覆盖项:

FileInfo

状态:

Extension

模块:

mod_rewrite

RewriteCond指令定义了一个规则的条件,即,在一个RewriteRule指令之前有一个或多个RewriteCond指令。 条件之后的重写规则仅在当前URI与pattern匹配并且符合这些条件的时候才会起作用。

TestString是一个纯文本的字符串,但是还可以包含下列可扩展的成分:

  • RewriteRule反向引用: 引用方法是

$N

(0 <= N <= 9) 引用当前(带有若干RewriteCond指令的)RewriteRule中的 与pattern匹配的分组成分(圆括号!)。

  • RewriteCond反向引用: 引用方法是

%N

(1 <= N <= 9) 引用当前若干RewriteCond条件中最后符合的条件中的分组成分(圆括号!)。

  • RewriteMap 扩展: 引用方法是

${mapname:key|default}

细节请参见the documentation for RewriteMap。

  • 服务器变量: 引用方法是

%{ NAME_OF_VARIABLE }

NAME_OF_VARIABLE可以是下表列出的字符串之一:

HTTP headers:

connection & request:

HTTP_USER_AGENT
HTTP_REFERER
HTTP_COOKIE
HTTP_FORWARDED
HTTP_HOST
HTTP_PROXY_CONNECTION
HTTP_ACCEPT

REMOTE_ADDR
REMOTE_HOST
REMOTE_USER
REMOTE_IDENT
REQUEST_METHOD
SCRIPT_FILENAME
PATH_INFO
QUERY_STRING
AUTH_TYPE

server internals:

system stuff:

specials:

DOCUMENT_ROOT
SERVER_ADMIN
SERVER_NAME
SERVER_ADDR
SERVER_PORT
SERVER_PROTOCOL
SERVER_SOFTWARE

TIME_YEAR
TIME_MON
TIME_DAY
TIME_HOUR
TIME_MIN
TIME_SEC
TIME_WDAY
TIME

API_VERSION
THE_REQUEST
REQUEST_URI
REQUEST_FILENAME
IS_SUBREQ

这些都对应于类似命名的HTTP MIME头、Apache服务器的C变量以及Unix系统中的 struct tm字段,大多数都在其他的手册或者CGI规范中有所讲述。而其中为mod_rewrite所特有的变量有:

IS_SUBREQ

如果正在处理的请求是一个子请求,它包含字符串"true",否则就是"false"。 模块为了解析URI中的附加文件,有可能会产生子请求。

API_VERSION

这是正在使用的httpd中(服务器和模块之间内部接口)的Apache模块API的版本, 其定义位于include/ap_mmn.h中。此模块版本对应于正在使用的Apache的版本 (比如,在Apache 1.3.14的发行版中,这个值是19990320:10)。 通常,对它感兴趣的是模块的作者。

THE_REQUEST

这是由浏览器发送给服务器的完整的HTTP请求行。(比如, "GET /index.html HTTP/1.1"). 它不包含任何浏览器发送的附加头信息。

REQUEST_URI

这是在HTTP请求行中所请求的资源。(比如上述例子中的"/index.html".)

REQUEST_FILENAME

这是与请求相匹配的完整的本地文件系统的文件路径名或描述.

特别注意事项:

  1. SCRIPT_FILENAME和REQUEST_FILENAME包含的值是相同的,, Apache服务器的内部request_rec结构中的filename字段。 第一个其实就是大家都知道的CGI变量名,而第二个则是( 包含了request_rec结构中的uri字段的)REQUEST_URI的一个副本,
  2. 特殊形式: %{ENV:variable} 其中的variable可以是任何环境变量。 它是通过查找Apache内部结构得到的, 或者(如果没找到的话)是由Apache服务器进程通过getenv()得到的。
  3. 特殊形式: %{HTTP:header} 其中的header可以是任何HTTP MIME头的名称。 它是通过查找HTTP请求得到的。比如: %{HTTP:Proxy-Connection}就是HTTP头 ``Proxy-Connection:''的值.
  4. 特殊形式 %{LA-U:variable} 它是一个预设的值, variable的最终值在执行一个内部的(基于URL的)子请求后决定。 在重写需要使用一个尚未有效的但是会在之后的API程序段中设置的变量的时候,就会使用这个方法。 比如,需要在服务器级配置(httpd.conf文件)中重写REMOTE_USER变量, 则,必须使用%{LA-U:REMOTE_USER},因为此变量是由认证程序段设置的, 而这个程序段是在mod_rewrite所在的URL转译程序段之后才执行的。 但是,因为mod_rewrite是通过API修正程序段来实现目录级(.htaccess file)配置的, 而这个程序段在认证程序段之前就执行了,所以用%{REMOTE_USER}就可以了。
  5. 特殊形式: %{LA-F:variable} 它是一个预设的值, variable的最终值在执行一个内部的(基于文件名的)子请求后决定。 大多数情况下和上述的LA-U是相同的.

CondPattern是条件pattern, , 一个应用于当前实例TestString的正则表达式, , TestString将会被计算然后与CondPattern匹配.

谨记: CondPattern是一个兼容perl的正则表达式,但是还有若干增补:

  1. 可以在pattern串中使用'!' 字符(惊叹号)来实现匹配的反转
  2. CondPatterns有若干特殊的变种。除了正则表达式的标准用法,还有下列用法:
    • '<CondPattern' (词典顺序的小于)
      CondPattern视为纯字符串,与TestString以词典顺序相比较. 如果按词典顺序,TestString小于CondPattern,则为真.
    • '>CondPattern' (词典顺序的大于)
      CondPattern视为纯字符串,与TestString以词典顺序相比较. 如果按词典顺序,TestString大于CondPattern,则为真.
    • '=CondPattern' (词典顺序的等于)
      CondPattern视为纯字符串,与TestString以词典顺序相比较. 如果按词典顺序,TestString等于CondPattern,则为真,即, 两个字符串(逐个字符地)完全相等。如果CondPattern只是""(两个引号), 则TestString将与空串相比较.
    • '-d' (是一个目录[directory])
      TestString视为一个路径名并测试它是否存在而且是一个目录.
    • '-f' (是一个常规的文件[file])
      TestString视为一个路径名并测试它是否存在而且是一个常规的文件.
    • '-s' (是一个非空的常规文件[size])
      TestString视为一个路径名并测试它是否存在而且是一个尺寸大于0的常规的文件.
    • '-l' (是一个符号连接[link])
      TestString视为一个路径名并测试它是否存在而且是一个符号连接.
    • '-F' (对子请求有效的业已存在的文件)
      测试TestString是否一个有效的文件, 而且可以被服务器当前已经配置的所有存取控制所存取。 它用一个内部子请求来做判断,由于会降低服务器的性能,请小心使用!
    • '-U' (对子请求有效的业已存在的URL)
      测试TestString是否一个有效的URL, 而且可以被服务器当前已经配置的所有存取控制所存取。 它用一个内部子请求来做判断,由于会降低服务器的性能,请小心使用!

注意

所有这些测试都可以用惊叹号作前缀('!')以实现条件的反转.

另外,还可以为CondPattern追加特殊的标记

[flags]

作为RewriteCond指令的第三个参数。 Flags是一个以逗号分隔的以下标记的列表:

  • 'nocase|NC' (no case)
    它使测试忽略大小写, , 扩展后的TestStringCondPattern中, 'A-Z' 和'a-z'是没有区别的。此标记仅作用于TestStringCondPattern的比较, 而对文件系统和子请求的测试不起作用。
  • 'ornext|OR' (or next condition)
    它以OR方式组合若干规则的条件,而不是隐含的AND。典型的例子如下:
·                RewriteCond %{REMOTE_HOST}  ^host1.*  [OR]
·                RewriteCond %{REMOTE_HOST}  ^host2.*  [OR]
·                RewriteCond %{REMOTE_HOST}  ^host3.*
·                RewriteRule ...some special stuff for any of these hosts...

如果不用这个标记,则必须使用三个 条件/规则。

举例:

如果要按请求头中的``User-Agent:'重写一个站点的主页,可以这样写:

RewriteCond  %{HTTP_USER_AGENT}  ^Mozilla.*
RewriteRule  ^/$                 /homepage.max.html  [L]
 
RewriteCond  %{HTTP_USER_AGENT}  ^Lynx.*
RewriteRule  ^/$                 /homepage.min.html  [L]
 
RewriteRule  ^/$                 /homepage.std.html  [L]

含义: 如果你使用的浏览器是Netscape Navigator(其识别标志是'Mozilla'), 则你将得到内容最大化的主页,包括Frames等等; 如果你使用的是(基于终端的)Lynx,则你得到的是内容最小化的主页,不包含tables等等; 如果你使用的是其他的浏览器,则你得到的是一个标准的主页。

RewriteEngine 指令

说明:

打开或关闭运行时刻的重写引擎

语法:

RewriteEngine on|off

默认值:

RewriteEngine off

上下文:

服务器配置, 虚拟主机, 目录, .htaccess

覆盖项:

FileInfo

状态:

Extension

模块:

mod_rewrite

RewriteEngine指令打开或关闭运行时刻的重写引擎。 如果设置为off,则此模块不执行任何运行时刻的重写操作, 甚至也不更新SCRIPT_URx环境变量。

使用该指令可以使此模块无效,而无须注释所有的RewriteRule指令!

注意:默认情况下,重写配置是不可继承的, 即,必须在每个需要的虚拟主机中设置一个RewriteEngine on指令。

RewriteLock 指令

说明:

设置RewriteMap同步所使用的加锁文件名

语法:

RewriteLock file-path

上下文:

服务器配置

状态:

Extension

模块:

mod_rewrite

此指令设置mod_rewrite为了和RewriteMap 程序通讯而使用的一个同步加锁文件的名称。在需要使用重写映射表程序时,它必须是一个本地路径(而不能是一个NFS挂接设备); 对其他类型的重写映射表,则无此要求。

RewriteLog 指令

说明:

设置重写引擎日志的文件名

语法:

RewriteLog file-path

上下文:

服务器配置, 虚拟主机

状态:

Extension

模块:

mod_rewrite

RewriteLog指令设置用于记录所有重写操作的文件的名称。 如果此文件名不是以斜杠('/')开头,则它是相对于Server Root的。 此指令应该仅仅出现在服务器级配置中。

如果要关闭对重写操作的记录,不推荐把Filename设置为/dev/null, 因为,虽然重写引擎不能输出记录了,但仍会内部地建立这个日志文件, 它会使服务器速度降低,而且对管理员毫无益处! 要关闭日志,可以删除或注解RewriteLog指令, 或者使用RewriteLogLevel 0!

安全

参见Apache Security Tips,其中讲述了,为什么如果存放日志的目录对除了启动服务器以外的用户是可写的会带来安全隐患。

举例

RewriteLog "/usr/local/var/apache/logs/rewrite.log"

RewriteLogLevel 指令

说明:

设置重写引擎日志的详细程度的级别

语法:

RewriteLogLevel Level

默认值:

RewriteLogLevel 0

上下文:

服务器配置, 虚拟主机

状态:

Extension

模块:

mod_rewrite

RewriteLogLevel指令设置重写引擎日志的详细程度的级别。 默认级别0意味着不记录,而9或更大的值意味着记录所有的操作。

要关闭重写引擎日志,可以简单地设此值为0,关闭所有的重写操作记录。

使用较高的Level值会使Apache服务器速度急剧下降! 重写日志使用大于2的Level值只用于调试!

举例

RewriteLogLevel 3

RewriteMap 指令

说明:

定义用于关键词查找的映射函数

语法:

RewriteMap MapName MapType:MapSource

上下文:

服务器配置, 虚拟主机

状态:

Extension

模块:

mod_rewrite

兼容性:

Apache 2.0.41及其更新版本中可以使用不同的dbm类型。

RewriteMap定义一个映射表, 由映射函数用于查找关键词来插入/替换字段。此查找操作的源可以是多种类型。

MapName是映射表的名称, 指定了一个映射函数,用于重写规则的字符串替换,它可以是下列形式之一:

${ MapName : LookupKey }
${ MapName : LookupKey | DefaultValue }

如果使用了这样的形式,则会在MapName中查找关键词LookupKey。 如果找到了,则被替换成SubstValue;如果没有找到,则被替换成DefaultValue, 如果没有指定DefaultValue,则被替换成空字符串。

可以使用下列MapTypeMapSource的组合:

  • 标准纯文本
    MapType: txt, MapSource: 有效的Unix文件系统文件名

这是重写映射表的标准形式,即, MapSource是一个纯文本文件,包含空行、注释行(以字符'#'打头), 以及每行一个的替换对,如下。

MatchingKey SubstValue

Example

##
##  map.txt -- rewriting map
##
 
Ralf.S.Engelschall    rse   # Bastard Operator From Hell
Mr.Joe.Average        joe   # Mr. Average

RewriteMap real-to-user txt:/path/to/file/map.txt

  • 随机纯文本
    MapType: rnd, MapSource: 有效的Unix文件系统文件名

这个与上述的标准纯文本很相似,但它有一个特殊的后处理特性: 查找完毕后,会解析其中包含的含义为``or''和``|''符号。 也就是说,会随机地选择其中之一作为实际的返回值。虽然这看似毫无意义,但它的设计意图是, 在一个查找值是服务器名称的反向代理环境中,实现负载平衡。如:

##
##  map.txt -- rewriting map
##
 
static   www1|www2|www3|www4
dynamic  www5|www6

RewriteMap servers rnd:/path/to/file/map.txt

  • 散列文件
    MapType: dbm[=type], MapSource: 有效的Unix文件系统文件名

这里的源是一个二进制格式的DBM文件,包含了与纯文本相同的内容, 但是因为它有优化的特殊表现形式,使它的查找速度明显快得多。此类型可以是sdbm, gdbm, ndbm或db,由compile-time settings所决定。如果省略type,则使用编译时选择的缺省设置。 你可以使用任何DBM工具或者下列Perl脚本来建立这个文件,但必须保证DBM的类型正确。 建立NDBM文件的例子:

#!/path/to/bin/perl
##
##  txt2dbm -- convert txt map to dbm format
##
 
use NDBM_File;
use Fcntl;
 
($txtmap, $dbmmap) = @ARGV;
 
open(TXT, "<$txtmap") or die "Couldn't open $txtmap!/n";
tie (%DB, 'NDBM_File', $dbmmap,O_RDWR|O_TRUNC|O_CREAT, 0644)
  or die "Couldn't create $dbmmap!/n";
 
while (<TXT>) {
  next if (/^/s*#/ or /^/s*$/);
  $DB{$1} = $2 if (/^/s*(/S+)/s+(/S+)/);
}
 
untie %DB;
close(TXT);

$ txt2dbm map.txt map.db

  • 内部函数
    MapType: int, MapSource: 内部的Apache函数

这里的源是一个内部的Apache函数。 目前,还不能由你自己建立,只能使用下列已经存在的函数:

    • toupper:
      转换查找关键词为大写.
    • tolower:
      转换查找关键词为小写.
    • escape:
      转换查找关键词中的特殊字符为十六进制编码.
    • unescape:
      转换查找关键词中的十六进制编码为特殊字符.
  • 外部的重写程序
    MapType: prg, MapSource: 有效的Unix文件系统文件名

这里的源是一个程序,而不是一个映射表文件。 程序的编制语言可以随意选择,但最终结果必须是可执行的 (, 或者是目标代码,或者是首行为'#!/path/to/interpreter'的脚本).

此程序仅在Apache服务器启动时启动一次, 随后通过stdinstdout文件句柄与重写引擎交互。对每个映射函数的查找操作,它从stdin接收以回车结束的查找关键词, 然后把查找结果以回车结束反馈到stdout, 如果查找失败,则返回四个字符的``NULL'' (, 对给定的关键词没有对应的值)。 此程序的最简单形式是一个1:1的映射(,key == value),如:

#!/usr/bin/perl
$| = 1;
while (<STDIN>) {
    # ...put here any transformations or lookups...
    print 1.      基本命令:
1.      ls
2.      cd
3.      mkdir
4.   cp (cp-r)           -r 复制所有文件和子目录
5.      rm (rm-rf)          -rf 删除非空目录
6.      locate              搜索一个文件
7.      nano –w            文本编辑器
8.      man + help          帮助文档
9.      apt-get +install,remove,update,upgrade,dist-upgrade 安装、删除、更新包
10.  aptitude             一个管理包的程序
11.  dep +url,dep-src+url   添加一个更新服务器
12.  dpkg -i package_file.deb  安装一个用户包
13.  dpkg -r package_name       删除一个用户包
14.  gedit
15.  sudo pass root   / sudo passwd -l root   设定用户密码
16.  apt-cache show <package>
apt-cache showpkg <package>
17.    tar –xvf  (-zxvf)       一个解压文件.gz和.tar的工具
18.    rpm –ql  (-ihv)            安装一个.rpm文件
19.    alien filename.rpm filename.deb  将.rpm 转换成 .deb
20.    mount -o loop -t iso9660 [ISO文件路径] [挂载路径A]   虚拟光盘
21.    apache2ctl -k restart          apache 服务器重启
22.    chown user file               改变文件、目录所属用户
23.    chown :users file             改变文件、目录所属用户组
24.    chmod –r 777 file          设定文件、目录所有用户均可访问
25.    ls-l          查看文件、目录的权限
26.    chmod a+x file        同24
27.    wget http://www.zlib.net/zlib-1.2.3.tar.gz
28.    build-essential

2.      控制台:
1.      ctr+alt+F1 ----  ctrl+alt+F6  console1 to console6
2.      ctr+alt+F7 to desktop
3. root 激活:
            1. 进入 recovery模式
            2. passwd root

LINUX下修改日期时间的方法

Linux机器上的时间比较复杂,有各式各样的时钟和选项等等。 

机器里有两个时钟。硬件时钟从根本上讲是CMOS时钟,而系统时钟是由内核维护的。

1.修改硬件时钟的可以使用下面的方法:

你就可以用它来随时更新你的硬件时间,命令为: 

hwclock --adjust 硬件时钟通常被设置成全球标准时间(UTC),而将时区信息保存在/usr/share/lib/timezone (或者在某些系统中可能是/usr/local/timezone)目录下某个适当的文件中,然后用一个符号链接文件/etc/localtime指向它。 

查看硬件时钟用命令: hwclock --show 

重置硬件时钟用: hwclock --set --date="07/08/05 10:10:59" 

如果需要修改你的时区信息,可以使用tzset命令,如果你系统中没有这条命令,那可以用类似下面的操作: 

ln -s /etc/localtime /usr/share/zoneinfo/US/Pacific 

2.修改系统时钟的可以使用下面的方法:

data 10110155 就可以将时间调整为10月11日凌晨1点55分

比如将系统时间设定成2005年8月8日的命令如下。 

#date -s 2005/08/08将系统时间设定成下午8点12分0秒的命令如下。#date -s 20:12:00 

这是修改系统时钟,由于LINUX系统是间隔一段时间才重新写硬件时钟,因此使用date -s修改完成之后,马上重新启动计算机,就有可能修改的系统时间没有写入CMOSS中,所以最好#clock -w 这个命令强行写入CMOS。

安装C/C++编译器及其工具
1.      安装C/C++编译器
2.           apt-get install gcc
3.      安装相关构建工具
4.           apt-get install build-essential
5.      安装zlib
6.           cd /home/kubuntu/Downloads/

7.           wget http://www.zlib.net/zlib-1.2.3.tar.gz

8.           tar xzvf zlib-1.2.3.tar.gz

9.           cd zlib-1.2.3

10.       ./configure

11.       make

12.       make install

如何设置UNIX/LINUX中的文件及目录权限作者:佚名    转贴自:本站原创    点击数:406

在UNIX中,所有的文件及目录都拥有自己的访问权限,来限制用户的访问,提高系统的安全性.
每个文件及目录都有三个级别的权限:所有者级别(u),组访问级别(g),其他用户访问级别(o).每个级别都有三个权限:读(r),写(w),执行(x).
例如:

#ls -la
-rwxrwxrwx 1 root root 6789 Nov 1 09:01 abc.c
drwxr-xr-x 2 root root 51 Nov 1 10:20 tool

abc.c为一个文件,第一个rwx表示文件所有者(即文件属主)的权限为读写执行.第二个rwx表示同组用户的权限为读写执行.每三个rwx表示其他组用户的权限为读写执行.
tool为一个目录,每一个rwx表示目录所有者(即目录属主)的权限为读写执行.第二r-x表示同组用户的权限为读执行.第三个r-x表示其他组用户的权限为读执行.
我们可以用1,0来表示权限的设置与否.没有设置权限-,用0表示,设置了权限(不管是r,w或x),用1表示.

用0,1表示 转换为八进制数表示
没有权限 --- 000 0
执行权限 --x 001 1
写权限 -w- 010 2
写执行权限 -wx 011 3
读权限 r-- 100 4
读执行权限 r-x 101 5
读写权限 rw- 110 6
读写执行权限 rwx 111 7

下面便让我们看一看该如何设置权限.举例如下:
#chmod u+rwx abc.c 设置abc.c文件属主的权限为rwx
#chmod g+rwx abc.c 设置abc.c文件同组用户的权限为rwx
#chmod o+rwx abc.c 设置其他组的用户对abc.c文件有读,写,执行权限
这种设置等效于:
#chmod 777 abc.c
也等效于:
#chmod a+rwx abc.c (a表示所有用户)
让我们再看一个例子:
#chmod 755 lpsed
等效于:
#chmod u+rwx lpsed
#chmod g+r-x lpsed
#chmod o+r-x lpsed
表示所有的用户对文件lpsed都有读及执行权限,只有文件属主可以改变文件.即写权限。

一、理解Linux的单用户多任务,多用户多任务概念;

Linux 是一个多用户、多任务的操作系统;我们应该了解单用户多任务和多用户多任务的概念;

1、Linux 的单用户多任务;

单用户多任务;比如我们以benignant 登录系统,进入系统后,我要打开gedit 来写文档,但在写文档的过程中,我感觉少点音乐,所以又打开xmms 来点音乐;当然听点音乐还不行,MSN 还得打开,想知道几个弟兄现在正在做什么,这样一样,我在用beinan 用户登录时,执行了gedit 、xmms以及msn等,当然还有输入法fcitx ;这样说来就有点简单了,一个beinan用户,为了完成工作,执行了几个任务;当然beinan这个用户,其它的人还能以远程登录过来,也能做其它的工作。

2、Linux 的多用户、多任务;
有时可能是很多用户同时用同一个系统,但并不所有的用户都一定都要做同一件事,所以这就有多用户多任务之说;
举个例子,比如LinuxSir.Org 服务器,上面有FTP 用户、系统管理员、web 用户、常规普通用户等,在同一时刻,可能有的弟兄正在访问论坛;有的可能在上传软件包管理子站,比如luma 或Yuking 兄在管理他们的主页系统和FTP ;在与此同时,可能还会有系统管理员在维护系统;浏览主页的用的是nobody 用户,大家都用同一个,而上传软件包用的是FTP用户;管理员的对系统的维护或查看,可能用的是普通帐号或超级权限root帐号;不同用户所具有的权限也不同,要完成不同的任务得需要不同的用户,也可以说不同的用户,可能完成的工作也不一样;
值得注意的是:多用户多任务并不是大家同时挤到一接在一台机器的的键盘和显示器前来操作机器,多用户可能通过远程登录来进行,比如对服务器的远程控制,只要有用户权限任何人都是可以上去操作或访问的;

3、用户的角色区分;
用户在系统中是分角色的,在Linux 系统中,由于角色不同,权限和所完成的任务也不同;值得注意的是用户的角色是通过UID和识别的,特别是UID;在系统管理中,系统管理员一定要坚守UID 唯一的特性;
root 用户:系统唯一,是真实的,可以登录系统,可以操作系统任何文件和命令,拥有最高权限;
虚拟用户:这类用户也被称之为伪用户或假用户,与真实用户区分开来,这类用户不具有登录系统的能力,但却是系统运行不可缺少的用户,比如bin、daemon、adm、ftp、mail等;这类用户都系统自身拥有的,而非后来添加的,当然我们也可以添加虚拟用户;
普通真实用户:这类用户能登录系统,但只能操作自己家目录的内容;权限有限;这类用户都是系统管理员自行添加的;

4、多用户操作系统的安全;
多用户系统从事实来说对系统管理更为方便。从安全角度来说,多用户管理的系统更为安全,比如beinan用户下的某个文件不想让其它用户看到,只是设置一下文件的权限,只有beinan一个用户可读可写可编辑就行了,这样一来只有beinan一个用户可以对其私有文件进行操作,Linux 在多用户下表现最佳,Linux能很好的保护每个用户的安全,但我们也得学会Linux 才是,再安全的系统,如果没有安全意识的管理员或管理技术,这样的系统也不是安全的。
从服务器角度来说,多用户的下的系统安全性也是最为重要的,我们常用的Windows 操作系统,它在系纺权限管理的能力只能说是一般般,根本没有没有办法和Linux或Unix 类系统相比;

二、用户(user)和用户组(group)概念;

1、用户(user)的概念;

通过前面对Linux 多用户的理解,我们明白Linux 是真正意义上的多用户操作系统,所以我们能在Linux系统中建若干用户(user)。比如我们的同事想用我的计算机,但我不想让他用我的用户名登录,因为我的用户名下有不想让别人看到的资料和信息(也就是隐私内容)这时我就可以给他建一个新的用户名,让他用我所开的用户名去折腾,这从计算机安全角度来说是符合操作规则的;
当然用户(user)的概念理解还不仅仅于此,在Linux系统中还有一些用户是用来完成特定任务的,比如nobody和ftp 等,我们访问LinuxSir.Org 的网页程序,就是nobody用户;我们匿名访问ftp 时,会用到用户ftp或nobody ;如果您想了解Linux系统的一些帐号,请查看 /etc/passwd ;

2、用户组(group)的概念;

用户组(group)就是具有相同特征的用户(user)的集合体;比如有时我们要让多个用户具有相同的权限,比如查看、修改某一文件或执行某个命令,这时我们需要用户组,我们把用户都定义到同一用户组,我们通过修改文件或目录的权限,让用户组具有一定的操作权限,这样用户组下的用户对该文件或目录都具有相同的权限,这是我们通过定义组和修改文件的权限来实现的;
举例:我们为了让一些用户有权限查看某一文档,比如是一个时间表,而编写时间表的人要具有读写执行的权限,我们想让一些用户知道这个时间表的内容,而不让他们修改,所以我们可以把这些用户都划到一个组,然后来修改这个文件的权限,让用户组可读,这样用户组下面的每个用户都是可读的;

用户和用户组的对应关系是:一对一、多对一、一对多或多对多;

一对一:某个用户可以是某个组的唯一成员;
多对一:多个用户可以是某个唯一的组的成员,不归属其它用户组;比如beinan和linuxsir两个用户只归属于beinan用户组;
一对多:某个用户可以是多个用户组的成员;比如beinan可以是root组成员,也可以是linuxsir用户组成员,还可以是adm用户组成员;
多对多:多个用户对应多个用户组,并且几个用户可以是归属相同的组;其实多对多的关系是前面三条的扩展;理解了上面的三条,这条也能理解;

三、用户(user)和用户组(group)相关的配置文件、命令或目录;

1、与用户(user)和用户组(group)相关的配置文件;

1)与用户(user)相关的配置文件;
/etc/passwd 注:用户(user)的配置文件;
/etc/shadow 注:用户(user)影子口令文件;

2)与用户组(group)相关的配置文件;

/etc/group 注:用户组(group)配置文件;
/etc/gshadow 注:用户组(group)的影子文件;

2、管理用户(user)和用户组(group)的相关工具或命令;

1)管理用户(user)的工具或命令;
useradd 注:添加用户
adduser 注:添加用户

useradd -g mail

userdel  注:删除用户

passwd 注:为用户设置密码
usermod 注:修改用户命令,可以通过usermod 来修改登录名、用户的家目录等等;
pwcov 注:同步用户从/etc/passwd 到/etc/shadow
pwck 注:pwck是校验用户配置文件/etc/passwd 和/etc/shadow 文件内容是否合法或完整;
pwunconv 注:是pwcov 的立逆向操作,是从/etc/shadow和 /etc/passwd 创建/etc/passwd ,然后会删除 /etc/shadow 文件;
finger 注:查看用户信息工具
id 注:查看用户的UID、GID及所归属的用户组
chfn 注:更改用户信息工具
su 注:用户切换工具
sudo 注:sudo 是通过另一个用户来执行命令(execute a command as another user),su 是用来切换用户,然后通过切换到的用户来完成相应的任务,但sudo 能后面直接执行命令,比如sudo 不需要root 密码就可以执行root 赋与的执行只有root才能执行相应的命令;但得通过visudo 来编辑/etc/sudoers来实现;
visudo 注:visodo 是编辑 /etc/sudoers 的命令;也可以不用这个命令,直接用vi 来编辑 /etc/sudoers 的效果是一样的;
sudoedit 注:和sudo 功能差不多;

2)管理用户组(group)的工具或命令;
groupadd 注:添加用户组;
groupdel 注:删除用户组;

groupmod 注:修改用户组信息
groups 注:显示用户所属的用户组
grpck
grpconv 注:通过/etc/group和/etc/gshadow 的文件内容来同步或创建/etc/gshadow ,如果/etc/gshadow 不存在则创建;
grpunconv 注:通过/etc/group 和/etc/gshadow 文件内容来同步或创建/etc/group ,然后删除gshadow文件;

3、/etc/skel 目录;

/etc/skel目录一般是存放用户启动文件的目录,这个目录是由root权限控制,当我们添加用户时,这个目录下的文件自动复制到新添加的用户的家目录下;/etc/skel 目录下的文件都是隐藏文件,也就是类似.file格式的;我们可通过修改、添加、删除/etc/skel目录下的文件,来为用户提供一个统一、标准的、默认的用户环境;
[root@localhost beinan]# ls -la /etc/skel/
总用量 92
drwxr-xr-x 3 root root 4096 8月 11 23:32 .
drwxr-xr-x 115 root root 12288 10月 14 13:44 ..
-rw-r--r-- 1 root root 24 5月 11 00:15 .bash_logout
-rw-r--r-- 1 root root 191 5月 11 00:15 .bash_profile
-rw-r--r-- 1 root root 124 5月 11 00:15 .bashrc
-rw-r--r-- 1 root root 5619 2005-03-08.canna
-rw-r--r-- 1 root root 438 5月 18 15:23 .emacs
-rw-r--r-- 1 root root 120 5月 23 05:18 .gtkrc
drwxr-xr-x 3 root root 4096 8月 11 23:16 .kde
-rw-r--r-- 1 root root 658 2005-01-17.zshrc
/etc/skel 目录下的文件,一般是我们用useradd 和adduser 命令添加用户(user)时,系统自动复制到新添加用户(user)的家目录下;如果我们通过修改 /etc/passwd 来添加用户时,我们可以自己创建用户的家目录,然后把/etc/skel 下的文件复制到用户的家目录下,然后要用chown 来改变新用户家目录的属主;

4、/etc/login.defs 配置文件;

/etc/login.defs 文件是当创建用户时的一些规划,比如创建用户时,是否需要家目录,UID和GID的范围;用户的期限等等,这个文件是可以通过root来定义的;
比如Fedora 的 /etc/logins.defs 文件内容;
# *REQUIRED*
# Directory where mailboxes reside, _or_ name of file, relative to the
# home directory. If you _do_ define both, MAIL_DIR takes precedence.
# QMAIL_DIR is for Qmail
#
#QMAIL_DIR Maildir
MAIL_DIR /var/spool/mail 注:创建用户时,要在目录/var/spool/mail中创建一个用户mail文件;
#MAIL_FILE .mail
# Password aging controls:
#
# PASS_MAX_DAYS Maximum number of days a password may be used.
# PASS_MIN_DAYS Minimum number of days allowed between password changes.
# PASS_MIN_LEN Minimum acceptable password length.
# PASS_WARN_AGE Number of days warning given before a password expires.
#
PASS_MAX_DAYS 99999 注:用户的密码不过期最多的天数;
PASS_MIN_DAYS 0 注:密码修改之间最小的天数;
PASS_MIN_LEN 5 注:密码最小长度;
PASS_WARN_AGE 7 注:
#
# Min/max values for automatic uid selection in useradd
#
UID_MIN 500 注:最小UID为500 ,也就是说添加用户时,UID 是从500开始的;
UID_MAX 60000 注:最大UID为60000;
#
# Min/max values for automatic gid selection in groupadd
#
GID_MIN 500 注:GID 是从500开始;
GID_MAX 60000
#
# If defined, this command is run when removing a user.
# It should remove any at/cron/print jobs etc. owned by
# the user to be removed (passed as the first argument).
#
#USERDEL_CMD /usr/sbin/userdel_local
#
# If useradd should create home directories for users by default
# On RH systems, we do. This option is ORed with the -m flag on
# useradd command line.
#
CREATE_HOME yes 注:是否创用户家目录,要求创建;

5、/etc/default/useradd 文件;
通过useradd 添加用户时的规则文件;
# useradd defaults file
GROUP=100
HOME=/home 注:把用户的家目录建在/home中;
INACTIVE=-1 注:是否启用帐号过期停权,-1表示不启用;
EXPIRE= 注:帐号终止日期,不设置表示不启用;
SHELL=/bin/bash 注:所用SHELL的类型;
SKEL=/etc/skel 注: 默认添加用户的目录默认文件存放位置;也就是说,当我们用adduser添加用户时,用户家目录下的文件,都是从这个目录中复制过去的;

Linux系统中的每个文件和目录都有访问许可权限,用它来确定谁可以通过何种方式对文件和目录进行访问和操作。

  文件或目录的访问权限分为只读,只写和可执行三种。以文件为例,只读权限表示只允许读其内容,而禁止对其做任何的更改操作。可执行权限表示允许将该文件作为一个程序执行。文件被创建时,文件所有者自动拥有对该文件的读、写和可执行权限,以便于对文件的阅读和修改。用户也可根据需要把访问权限设置为需要的任何组合。

  有三种不同类型的用户可对文件或目录进行访问:文件所有者,同组用户、其他用户。所有者一般是文件的创建者。所有者可以允许同组用户有权访问文件,还可以将文件的访问权限赋予系统中的其他用户。在这种情况下,系统中每一位用户都能访问该用户拥有的文件或目录。

  每一文件或目录的访问权限都有三组,每组用三位表示,分别为文件属主的读、写和执行权限;与属主同组的用户的读、写和执行权限;系统中其他用户的读、写和执行权限。当用ls -l命令显示文件或目录的详细信息时,最左边的一列为文件的访问权限。例如:

  $ ls -l sobsrc. tgz

  -rw-r--r-- 1 root root 483997 Ju1 l5 17:3l sobsrc. tgz

  横线代表空许可。r代表只读,w代表写,x代表可执行。注意这里共有10个位置。第一个字符指定了文件类型。在通常意义上,一个目录也是一个文件。如果第一个字符是横线,表示是一个非目录的文件。如果是d,表示是一个目录。

  例如:

  - rw- r-- r--

  普通文件 文件主 组用户 其他用户

  是文件sobsrc.tgz 的访问权限,表示sobsrc.tgz是一个普通文件;sobsrc.tgz的属主有读写权限;与sobsrc.tgz属主同组的用户只有读权限;其他用户也只有读权限。

  确定了一个文件的访问权限后,用户可以利用Linux系统提供的chmod命令来重新设定不同的访问权限。也可以利用chown命令来更改某个文件或目录的所有者。利用chgrp命令来更改某个文件或目录的用户组。

  Linux系统中的每个文件和目录都有访问许可权限,用它来确定谁可以通过何种方式对文件和目录进行访问和操作。

  文件或目录的访问权限分为只读,只写和可执行三种。以文件为例,只读权限表示只允许读其内容,而禁止对其做任何的更改操作。可执行权限表示允许将该文件作为一个程序执行。文件被创建时,文件所有者自动拥有对该文件的读、写和可执行权限,以便于对文件的阅读和修改。用户也可根据需要把访问权限设置为需要的任何组合。

  有三种不同类型的用户可对文件或目录进行访问:文件所有者,同组用户、其他用户。所有者一般是文件的创建者。所有者可以允许同组用户有权访问文件,还可以将文件的访问权限赋予系统中的其他用户。在这种情况下,系统中每一位用户都能访问该用户拥有的文件或目录。

  每一文件或目录的访问权限都有三组,每组用三位表示,分别为文件属主的读、写和执行权限;与属主同组的用户的读、写和执行权限;系统中其他用户的读、写和执行权限。当用ls -l命令显示文件或目录的详细信息时,最左边的一列为文件的访问权限。例如:

  $ ls -l sobsrc. tgz

  -rw-r--r-- 1 root root 483997 Ju1 l5 17:3l sobsrc. tgz

  横线代表空许可。r代表只读,w代表写,x代表可执行。注意这里共有10个位置。第一个字符指定了文件类型。在通常意义上,一个目录也是一个文件。如果第一个字符是横线,表示是一个非目录的文件。如果是d,表示是一个目录。

  例如:

  - rw- r-- r--

  普通文件 文件主 组用户 其他用户

  是文件sobsrc.tgz 的访问权限,表示sobsrc.tgz是一个普通文件;sobsrc.tgz的属主有读写权限;与sobsrc.tgz属主同组的用户只有读权限;其他用户也只有读权限。

  确定了一个文件的访问权限后,用户可以利用Linux系统提供的chmod命令来重新设定不同的访问权限。也可以利用chown命令来更改某个文件或目录的所有者。利用chgrp命令来更改某个文件或目录的用户组。

  Linux系统中的每个文件和目录都有访问许可权限,用它来确定谁可以通过何种方式对文件和目录进行访问和操作。

  文件或目录的访问权限分为只读,只写和可执行三种。以文件为例,只读权限表示只允许读其内容,而禁止对其做任何的更改操作。可执行权限表示允许将该文件作为一个程序执行。文件被创建时,文件所有者自动拥有对该文件的读、写和可执行权限,以便于对文件的阅读和修改。用户也可根据需要把访问权限设置为需要的任何组合。

  有三种不同类型的用户可对文件或目录进行访问:文件所有者,同组用户、其他用户。所有者一般是文件的创建者。所有者可以允许同组用户有权访问文件,还可以将文件的访问权限赋予系统中的其他用户。在这种情况下,系统中每一位用户都能访问该用户拥有的文件或目录。

  每一文件或目录的访问权限都有三组,每组用三位表示,分别为文件属主的读、写和执行权限;与属主同组的用户的读、写和执行权限;系统中其他用户的读、写和执行权限。当用ls -l命令显示文件或目录的详细信息时,最左边的一列为文件的访问权限。例如:

  $ ls -l sobsrc. tgz

  -rw-r--r-- 1 root root 483997 Ju1 l5 17:3l sobsrc. tgz

  横线代表空许可。r代表只读,w代表写,x代表可执行。注意这里共有10个位置。第一个字符指定了文件类型。在通常意义上,一个目录也是一个文件。如果第一个字符是横线,表示是一个非目录的文件。如果是d,表示是一个目录。

  例如:

  - rw- r-- r--

  普通文件 文件主 组用户 其他用户

  是文件sobsrc.tgz 的访问权限,表示sobsrc.tgz是一个普通文件;sobsrc.tgz的属主有读写权限;与sobsrc.tgz属主同组的用户只有读权限;其他用户也只有读权限。

  确定了一个文件的访问权限后,用户可以利用Linux系统提供的chmod命令来重新设定不同的访问权限。也可以利用chown命令来更改某个文件或目录的所有者。利用chgrp命令来更改某个文件或目录的用户组。
  下面分别对这些命令加以介绍。

  chmod 命令

  chmod命令是非常重要的,用于改变文件或目录的访问权限。用户用它控制文件或目录的访问权限。

  该命令有两种用法。一种是包含字母和操作符表达式的文字设定法;另一种是包含数字的数字设定法。

  1. 文字设定法

  chmod [who] [+ | - | =] [mode] 文件名?

  命令中各选项的含义为:

  操作对象who可是下述字母中的任一个或者它们的组合:

  u 表示“用户(user)”,即文件或目录的所有者。

  g 表示“同组(group)用户”,即与文件属主有相同组ID的所有用户。

  o 表示“其他(others)用户”。

  a 表示“所有(all)用户”。它是系统默认值。

  操作符号可以是:

  + 添加某个权限。

  - 取消某个权限。

  = 赋予给定权限并取消其他所有权限(如果有的话)。

  设置mode所表示的权限可用下述字母的任意组合:

  r 可读。

  w 可写。

  x 可执行。

  X 只有目标文件对某些用户是可执行的或该目标文件是目录时才追加x 属性。

  s 在文件执行时把进程的属主或组ID置为该文件的文件属主。方式“u+s”设置文件的用户ID位,“g+s”设置组ID位。

  t 保存程序的文本到交换设备上。

  u 与文件属主拥有一样的权限。

  g 与和文件属主同组的用户拥有一样的权限。

  o 与其他用户拥有一样的权限。

  文件名:以空格分开的要改变权限的文件列表,支持通配符。

  在一个命令行中可给出多个权限方式,其间用逗号隔开。例如:chmod g+r,o+r example

  使同组和其他用户对文件example 有读权限。

  2. 数字设定法

  我们必须首先了解用数字表示的属性的含义:0表示没有权限,1表示可执行权限,2表示可写权限,4表示可读权限,然后将其相加。所以数字属性的格式应为3个从0到7的八进制数,其顺序是(u)(g)(o)。

  例如,如果想让某个文件的属主有“读/写”二种权限,需要把4(可读)+2(可写)=6(读/写)。

  数字设定法的一般形式为:

  chmod [mode] 文件名?

关于samba

一、首先以root身分登录进入系统。

二、编辑/etc/smb.conf文件,将"unix password sync = no"这个一句改为 "unix password sync = yes"。这样子的话,以后系统增加使用者时,会自动将该使用者的密码也更新到/etc/smbpasswd内 (Samba的帐号密码文件)。

三、到/home目录下增加下列目录,并指定这些目录的权限: 

/home/pub nobody:nobody 777   
/home/read-only root:root 755   
/home/user1 user1:user1 700

四、编辑/etc/smb.conf这个文件,修改:

   security = share

五、编辑/etc/smb.conf这个文件,到文件最后面增加下面几句:

   [public]
   comment = Public Areas
   path = /home/pub
   browseable = yes
   guest ok = yes
   writable =yes

   [read-only]
   comment = Read-Only Areas
   path = /home/read-only
   browseable = yes
   guest ok = yes

   [user1]
   comment = Password Required
   path = /home/user1
   browseable = yes
   writable = yes

  完成后存盘离开。

六、重行运行Samba:

   samba restart

一些防火墙设置

原作者:Anton Chuvakin

在过去几年中,Linux作为防火墙平台的应用显著增长。从早期1.2版内核的ipfwadm开始,Linux的防火墙代码也走过了很长一段路程了。在2.4版的Linux内核中,使用了netfilter体系。在最新的2.4版中,Linux大大加强了安全性,例如:更好的加密支持和netfilter体系的使用。netfilter具有完全的向后兼容性。

本文将对iptables的配置做一个综述并且重点介绍一些iptables的配置工具。本文的讨论将着眼于Linux内核的IP防火墙以及其各种界面的配置工具,比如:GUI或者脚本(shell、Perl或者特定的配置语言)。使用这些工具能够简化iptables的配置减少配置的错误。关于iptables的知识请参考Rusty Russell写的Linux iptables HOWTO。

使用命令行配置iptables的困难

使用iptables的命令行接口来配置iptables防火墙对一个人来说是一个挑战,用户很难指定所有IP报文的行为。用户需要对TCP/IP和应用层协议有较深的了解。象其前辈ipchains一样,iptables把IP过滤规则归并到链中,IP报文遍历规则链接受处理,还可以送到另外的链接受处理,或者最后由默认策略(ACCEPT、DROP、REJECT)处理。有些网络应用程序比其它一些程序更容易穿过防火墙,因此需要理解网络连接的建立和断开。

我们看一下POP3协议,这是最简单的协议之一。允许所有向内目标端口是110的报文通过通过无法解决所有的管理问题,因为这样只能使客户端向发出申请,而服务器却无法应答。另外,如果使用网络地址转换(NAT)和其它方式的报文转发,也存在许多问题。因为防火墙的配置将影响到整个企业的安全,所以应该特别小心。下面将大概地讨论iptables的配置,要获得更多细节请参考Linux iptables HOWTO

iptables的命令行选项

在进入这时的讨论之前,我们看一下iptables命令行选项的一个总结。

规则链维护选项

1.建立新的规则链(-N)
2.删除一个空的规则链(-X)
3.改变一个内置规则链的策略(-P)
4.列出一条规则链中的规则(-L)
5.擦写一条规则链中的规则(-F)

规则维护

1.在一条规则链中加入一条新的规则(-A)
2.删除一条规则链中某个位置的规则(-D)

iptables的优点

在讨论各种iptables配置工具之前,让我们看一下iptables的优点,尤其是netfilter比ipchains具有的优势。

iptables允许建立状态(stateful)防火墙,就是在内存中保存穿过防火墙的每条连接。这种模式对于有效地配置FTP和DNS以及其它网络服务是必要的。

iptables能够过滤TCP标志任意组合报文,还能够过滤MAC地址。

系统日志比ipchains更容易配置,扩展性也更好。

对于网络地址转换(Network Address Translation)和透明代理的支持,netfilter更为强大和易于使用。

iptable能够阻止某些DOS攻击,例如SYS洪泛攻击。

iptables配置工具

现在,我们看一下Linux iptables的一些配置工具。我主要关注每个工具的特征、弹性和易用性。我们将讨论以下的工具:

MonMotha's Firewall 2.3.5作者:MonMotha

Firewallscript (iptables 4.4c-3 devel) 作者:Patrik Hildingsson

Ferm-0.0.18 作者:Auke Kok

AGT-0.83 作者:Andy Gilligan

Knetfilter-1.2.4 作者:Luigi Genoni

gShield-2.0.2 作者:R. Gregory

MonMotha的Firewall 2.3.5

MonMotha写的Firewall 2.3.5是一个大约30K的shell脚本。目前,主要适用于基于主机的保护,因为一些基于网络的选项正在开发中。这个脚本的界面(例如:给iptables传递配置选项的方法)有点混乱。不过,它不需要配置文件而且安装容易,直接复制到任何地方都可以。默认情况下,它根本不做什么,实际上根本就不执行,也缺少文档。这个脚本对于拨号用户可能有点用处。

Firewallscript

Firewallscript(IFS 4.4d)也是一个bash脚本,大约有85K。这个脚本可以用于基于主机和网络的防护。首次运行时,它会直接产生一个配置文件。不过,在默认情况下,这个文件不起什么作用,只有测试作用。这个脚本可以配置NAT和地址伪装。这个脚本非常复杂,但是缺少文档,因此最好能够仔细阅读它的代码,使用iptables -L命令哪个链已经生效,什么被允许/拒绝。这个脚本的IP报文追踪功能还可以为你提供娱乐。此外,它还会自动探测、加载iptables需要的内核模块。这个脚本和上一个脚本还具有取消(undo)功能,能够恢复iptables原来的配置文件。

Ferm

Ferm是一个Perl脚本,使用一种类C语言写成的配置文件。这种语言非常容易阅读和理解。这个脚本有很好的文档和丰富的示例作为参考。

这是一个例子:

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

# simple workstation example for ferm

chain input

{
if ppp0 # put your outside interface here
{
proto tcp goto fw_tcp;
proto udp goto fw_udp;
proto icmp goto fw_icmp;
}
}

chain fw_tcp proto tcp {
dport ssh ACCEPT;
syn DENY log;
dport domain ACCEPT;
dport 0:1023 DENY log;
}

chain fw_udp proto udp {
DENY log;
}

chain fw_icmp proto icmp {
icmptype (
destination-unreachable time-exceeded
) ACCEPT;
DENY log;
}

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

这个配置文件将使ferm产生iptables如下规则:允许向外的ssh和DNS报文通过;阻塞所有的UDP报文;只允许两种类型的ICMP消息通过:目的不可达和超时,并绝拒绝和日志其它类型的ICMP消息。

AGT

AGT是一个使用C语言编写的程序。从它的代码来看,目前还处于开发阶段。不支持automake,需要手工编辑Makefile文件,文档也不是很丰富,但是其配置文件非常简单。下面就是一个配置文件:

NEW | FROM-INT
NEW | RESET

|| FROM-INT | icmp | ACCEPT |||||
|| FROM-INT | tcp | ACCEPT ||||| pop3
|| FROM-INT | tcp | ACCEPT ||||| imap

|| RESET | tcp | REJECT --reject-with tcp-reset |||||

这样的文件格式,加上缺乏必要的文档,对使用者来说是一个很大的挑战。而且最好多花些时间学学iptables。

knetfilter

knetfilter是一个非常棒的图形化iptables配置工具,它是基于KDE的(有KDE1和KDE2两个版本)。knetfilter非常易于上手,你可以很容易地使用它来配置基于主机保护的规则和规则列表;保存和恢复测这些规则和规则列表;测试规则和规则列表(在同一个面板上运行tcpdump网络嗅探器),这一切只要点几下鼠标就可以了。它也支持NAT和网络地址伪装的配置。但是,对于拨号工作站,knetfilter工作的不太好,因为它需要本地IP,而且只探测eth0网络接口,不进行PPP探测。这个工程的文档也很少,不过因为是基于图形界面,所以即使不用手册也可以很好地使用。

gShield

gShield是一个bash shell脚本,可能是当前最成熟的一个工具。它的文档非常丰富,配置文件也比较合理直观,还能够设置NAT。它不但能够处静态IP地址,还能够处理动态IP地址(例如:PPP)。

gShield还有图形界面,目前仍然处于早期开发阶段,可以从http://members.home.com/vhodges/gshieldconf.html下载。不过,它似乎只兼容gShield的早期版本(1.x)。

下面是一个示例配置文件:

FW_ROOT="/etc/firewall"
IPTABLES=`which iptables`
LOCALIF="eth0"
DNS="24.31.195.65"
LTIME="20/m"
ALLOW_DHCP_LEASES="YES"
...

gShield使用的默认配置非常安全,特别适合不愿意摆弄配置文件的用户,不过软件的编者建议用户最好能够通读整个配置文件。据README文件讲,gShield实现了"类tcpwrapper风格的服务访问控制功能",使用这个功能用户可以很容易地阻塞/允许某项服务,而不必考虑报文方向之类的问题,只要关心什么客户连接到服务器就可以了。

结论

虽然本文介绍了一些防火墙配置工具,但是实际上目前还没有理想的配置工具。最好的配置工具还是iptables命令,这里介绍的这些工具,只适用于对于使用iptables命令行感觉困难的用户。

声明:如果您认为这篇文章有点转载的价值,那么在转载时请注明文章的出处和作者(包括译者)。请不要拿出:

lion蠕虫分析

作者:Max Vision

作为自己没有侵犯版权的依据,因为Max Vision是美国人,他不会自己用汉语写一篇分析lion蠕虫的文章,虽然lion蠕虫是中国人写的。(读到这里,您可能会感到莫名其妙,已经抄起鸡蛋、西红柿了,但是请相信:我没有发烧,绝对是有感而发,通过这种方式表达自己的愤怒而已)。'

Apache模块 mod_rewrite

说明:

提供了一个基于规则的实时转向URL请求的引擎

状态:

Extension

模块名:

rewrite_module

源文件:

mod_rewrite.c

兼容性:

包含在Apache 1.3及其更新版本中

概要

``The great thing about mod_rewrite is it gives you all the configurability and flexibility of Sendmail. The downside to mod_rewrite is that it gives you all the configurability and flexibility of Sendmail.''

-- Brian Behlendorf
Apache Group

`` Despite the tons of examples and docs, mod_rewrite is voodoo. Damned cool voodoo, but still voodoo. ''

-- Brian Moore
bem@news.cmc.net

欢迎来到mod_rewrite, URL操作的瑞士军刀!

此模块提供了一个基于规则的(使用正则表达式分析器的)实时转向URL请求的引擎。 支持每个规则可以拥有不限数量的规则以及附加条件规则的灵活而且强大的URL操作机制。此URL操作可以取决于各种测试,比如服务器变量、环境变量、HTTP头、时间标记,甚至各种格式的用于匹配URL组成部分的查找数据库。

此模块可以操作URL的所有部分(包括路径信息部分), 在服务器级的(httpd.conf)和目录级的(.htaccess)配置都有效, 还可以生成最终请求串。此重写操作的结果可以是内部子处理,也可以是外部请求的转向,甚至还可以是内部代理处理。

但是,所有这些功能和灵活性带来一个问题,那就是复杂性, 因此,不要指望一天之内就能看懂整个模块。

此模块从1997年7月起为Apache Group所专用,由以下这些人创建于1996年4月

Ralf S. Engelschall
rse@engelschall.com
www.engelschall.com

指令索引

  • RewriteBase
  • RewriteCond
  • RewriteEngine
  • RewriteLock
  • RewriteLog
  • RewriteLogLevel
  • RewriteMap
  • RewriteOptions
  • RewriteRule

主题

  • 内部处理
  • 环境变量
  • 实用方案

内部处理

此模块的内部处理极为复杂,但是,为了使一般用户避免犯低级错误, 也让管理员能充分利用其功能,在此仍然做一下说明。

API程序段

首先,你必须了解,Apache是通过若干程序段来处理HTTP请求的。 Apache API 对每个程序段提供了一个hook程序。 Mod_rewrite使用两个hook程序: 其一是,URL到文件名的转译hook,用在读取HTTP请求之后,而在授权开始之前;其二是,修正hook,用在授权程序段和读取目录级配置文件(.htaccess)之后,而在内容处理器激活之前。

所以,Apache收到一个请求并且确定了响应主机(或者是虚拟主机)之后, 重写引擎即开始执行URL到文件名程序段,以处理服务器级的配置中所有的mod_rewrite指令。 在最终数据目录确定以后,进入修正程序段并触发目录级配置中的mod_rewrite指令。这两个程序段并不是泾渭分明的,但都实施把URL重写成新的URL或者文件名。虽然API最初不是为此设计的,但它已经成为API的一种用途, 而在Apache 1.x 中这是mod_rewrite唯一的实现方法。 记住以下两点,会有助于更好地理解:

  1. 虽然mod_rewrite可以重写URL为URL,重写URL为文件名, 甚至重写文件名为文件名,但是目前API只提供一个URL到文件名的hook。 在Apache 2.0 中,增加了两个丢失hook以使处理过程更清晰。 但是,这样做并没有给用户带来麻烦,只需记住这样一个事实: Apache借助URL到文件名的hook而比API设计的目标功能更强大。
  2. 难以置信的是,mod_rewrite提供了目录级的URL操作,.htaccess文件, 而这些文件必须在URL转换成文件名以后的较多步骤完成之后才会被处理。 这也是必须的,因为.htaccess文件存在于文件系统中,所以处理已经到达这个层面。 换句话说,根据API程序段,这时再处理任何URL操作已经太晚了。 为了解决这个鸡和蛋的问题,mod_rewrite使用了一个技巧: 在进行一个目录级的URL/文件名的操作时,mod_rewrite先把文件名重写回相应的URL (通常这个操作是不可行的,但是参考下面的RewriteBase指令就明白它是怎么实现的), 然后,对这个新的URL建立一个新的内部的子请求,以此重新开始API程序段的执行。

另外,mod_rewrite尽力使这些复杂的操作对用户全透明,但仍须记住:服务器级的URL操作速度快而且效率高,而目录级的操作由于这个鸡和蛋的问题速度慢效率也低。 但从另一个侧面看,这却是mod_rewrite得以为一般用户提供(局部限制的)URL操作的唯一方法。

牢记这两点!

规则集的处理

当mod_rewrite在这两个程序段中开始执行时,它会读取配置结构中的配置好的 (或者是在服务启动时建立的服务器级的,或者是Apache核心在遍历目录采集到的目录级的)规则集, 随后,启动URL重写引擎来处理(带有一个或多个条件)的规则集。 无论是服务器级的还是目录级的规则集,都是由同一个URL重写引擎处理,只是处理结果不同而已。

规则集中规则的顺序是很重要的,因为重写引擎是按一种特殊的(非常规的)顺序处理的,其原则是:逐个遍历每个规则(RewriteRule directives), 如果出现一个匹配条件的规则,则可能回头遍历已有的规则条件(RewriteConddirectives)。由于历史的原因,条件规则是置前的,所以控制流程略显冗长,细节见Figure 1。

Figure 1:The control flow through the rewriting ruleset

可见,URL首先与每个规则的Pattern匹配, 如果匹配不成功,mod_rewrite立即终止此规则的处理,继而处理下一个规则。如果匹配成功,mod_rewrite寻找响应的规则条件,如果一个条件都没有, 则简单地用Substitution构造的新的值来替换URL,然后继续处理其他规则。 如果条件存在,则开始一个内部循环按其列出的顺序逐个处理。 对规则的条件的处理有所不同:URL并不与pattern匹配, 而是,首先通过扩展变量、反向引用、查找映射表等步骤建立一个TestString的字符串,随后,用它来与CondPattern匹配。如果匹配不成功,则整个条件集和对应的规则失败;如果匹配成功,则执行下一个规则直到所有条件执行完毕。 如果所有条件得以匹配,则以Substitution替换URL,并且继续处理。

特殊字符的引用

在Apache 1.3.20, TestString and Substitution 字符串中的特殊字符可以用前缀的斜杠来实现转义(即,忽略其特殊含义而视之为普通字符)。 比如,Substitution可以用'/$'来包含一个美元符号,以避免mod_rewrite把它视为反向引用。

正则表达式的反向引用能力

这是很重要的一点:一旦在Pattern或者CondPattern使用了圆括号, 就会建立内部的反向引用,可以使用$N%N来调用(见下述),并且,在SubstitutionTestString中都有效。 Figure 2 说明了反向引用被转换扩展的位置。

Figure 2: The back-reference flow through a rule.

虽然mod_rewrite内部处理的这个过程是比较杂乱的, 但是了解这些可以帮助你阅读下文中指令的讲述。

环境变量

此模块会跟踪两个额外的(非标准的)CGI/SSI环境变量, SCRIPT_URLSCRIPT_URI。他们包含了当前资源的逻辑的网络状态, 而标准的CGI/SSI变量SCRIPT_NAMESCRIPT_FILENAME包含的是物理的系统状态。

注意: 这些变量保持的是其最初被请求时的URI/URL, , 在任何重写操作之前的。 其重要性在于他们是重写操作重写URL到物理路径名的原始依据。

举例

SCRIPT_NAME=/sw/lib/w3s/tree/global/u/rse/.www/index.html
SCRIPT_FILENAME=/u/rse/.www/index.html
SCRIPT_URL=/u/rse/
SCRIPT_URI=http://en1.engelschall.com/u/rse/

实用方案

我们还提供另外一个文档URL Rewriting Guide, 列举了许多基于URL的问题的实用方案,其中你可以找到真实有用的规则集和mod_rewrite的更多信息。

RewriteBase 指令

说明:

设置目录级重写的基准URL

语法:

RewriteBase URL-path

默认值:

参见使用方法.

上下文:

目录, .htaccess

覆盖项:

FileInfo

状态:

Extension

模块:

mod_rewrite

RewriteBase指令显式地设置了目录级重写的基准URL。 在下文中,你可以看见RewriteRule可以用于目录级的配置文件中(.htaccess), 并在局部范围内起作用,即,规则实际处理的只是剥离了本地路径前缀的一部分。处理结束后,这个路径会被自动地附着回去。 默认值是,RewriteBase physical-directory-path

在对一个新的URL进行替换时,此模块必须把这个URL重新注入到服务器处理中。为此,它必须知道其对应的URL前缀或者说URL基准。通常,此前缀就是对应的文件路径。 但是,大多数网站URL不是直接对应于其物理文件路径的,因而一般不能做这样的假定! 所以在这种情况下,就必须用RewriteBase指令来指定正确的URL前缀。

如果你的网站服务器URL不是与物理文件路径直接对应的,而又需要使用RewriteRule指令,则必须在每个对应的.htaccess文件中指定RewriteBase

举例,目录级配置文件内容如下:

#
#  /abc/def/.htaccess -- per-dir config file for directory /abc/def
#  Remember: /abc/def is the physical path of /xyz, i.e., the server
#            has a 'Alias /xyz /abc/def' directive e.g.
#
 
RewriteEngine On
 
#  let the server know that we were reached via /xyz and not
#  via the physical path prefix /abc/def
RewriteBase   /xyz
 
#  now the rewriting rules
RewriteRule   ^oldstuff/.html$  newstuff.html

上述例子中,对/xyz/oldstuff.html 的请求被正确地重写为物理的文件/abc/def/newstuff.html.

For Apache Hackers

以下列出了内部处理的详细步骤:

Request:
  /xyz/oldstuff.html
 
Internal Processing:
  /xyz/oldstuff.html     -> /abc/def/oldstuff.html  (per-server Alias)
  /abc/def/oldstuff.html -> /abc/def/newstuff.html  (per-dir    RewriteRule)
  /abc/def/newstuff.html -> /xyz/newstuff.html      (per-dir    RewriteBase)
  /xyz/newstuff.html     -> /abc/def/newstuff.html  (per-server Alias)
 
Result:
  /abc/def/newstuff.html

虽然这个过程看来很繁复,但是由于目录级重写的到来时机已经太晚了, 它不得不把这个(重写)请求重新注入到Apache核心中,所以Apache内部确实是这样处理的。但是:它的开销并不象看起来的那样大,因为重新注入完全在Apache服务器内部进行, 而且这样的过程在Apache内部也为其他许多操作所使用。 所以,你可以充分信任其设计和实现是正确的。

RewriteCond 指令

说明:

定义重写发生的条件

语法:

RewriteCond TestString CondPattern

上下文:

服务器配置, 虚拟主机, 目录, .htaccess

覆盖项:

FileInfo

状态:

Extension

模块:

mod_rewrite

RewriteCond指令定义了一个规则的条件,即,在一个RewriteRule指令之前有一个或多个RewriteCond指令。 条件之后的重写规则仅在当前URI与pattern匹配并且符合这些条件的时候才会起作用。

TestString是一个纯文本的字符串,但是还可以包含下列可扩展的成分:

  • RewriteRule反向引用: 引用方法是

$N

(0 <= N <= 9) 引用当前(带有若干RewriteCond指令的)RewriteRule中的 与pattern匹配的分组成分(圆括号!)。

  • RewriteCond反向引用: 引用方法是

%N

(1 <= N <= 9) 引用当前若干RewriteCond条件中最后符合的条件中的分组成分(圆括号!)。

  • RewriteMap 扩展: 引用方法是

${mapname:key|default}

细节请参见the documentation for RewriteMap。

  • 服务器变量: 引用方法是

%{ NAME_OF_VARIABLE }

NAME_OF_VARIABLE可以是下表列出的字符串之一:

HTTP headers:

connection & request:

HTTP_USER_AGENT
HTTP_REFERER
HTTP_COOKIE
HTTP_FORWARDED
HTTP_HOST
HTTP_PROXY_CONNECTION
HTTP_ACCEPT

REMOTE_ADDR
REMOTE_HOST
REMOTE_USER
REMOTE_IDENT
REQUEST_METHOD
SCRIPT_FILENAME
PATH_INFO
QUERY_STRING
AUTH_TYPE

server internals:

system stuff:

specials:

DOCUMENT_ROOT
SERVER_ADMIN
SERVER_NAME
SERVER_ADDR
SERVER_PORT
SERVER_PROTOCOL
SERVER_SOFTWARE

TIME_YEAR
TIME_MON
TIME_DAY
TIME_HOUR
TIME_MIN
TIME_SEC
TIME_WDAY
TIME

API_VERSION
THE_REQUEST
REQUEST_URI
REQUEST_FILENAME
IS_SUBREQ

这些都对应于类似命名的HTTP MIME头、Apache服务器的C变量以及Unix系统中的 struct tm字段,大多数都在其他的手册或者CGI规范中有所讲述。而其中为mod_rewrite所特有的变量有:

IS_SUBREQ

如果正在处理的请求是一个子请求,它包含字符串"true",否则就是"false"。 模块为了解析URI中的附加文件,有可能会产生子请求。

API_VERSION

这是正在使用的httpd中(服务器和模块之间内部接口)的Apache模块API的版本, 其定义位于include/ap_mmn.h中。此模块版本对应于正在使用的Apache的版本 (比如,在Apache 1.3.14的发行版中,这个值是19990320:10)。 通常,对它感兴趣的是模块的作者。

THE_REQUEST

这是由浏览器发送给服务器的完整的HTTP请求行。(比如, "GET /index.html HTTP/1.1"). 它不包含任何浏览器发送的附加头信息。

REQUEST_URI

这是在HTTP请求行中所请求的资源。(比如上述例子中的"/index.html".)

REQUEST_FILENAME

这是与请求相匹配的完整的本地文件系统的文件路径名或描述.

特别注意事项:

  1. SCRIPT_FILENAME和REQUEST_FILENAME包含的值是相同的,, Apache服务器的内部request_rec结构中的filename字段。 第一个其实就是大家都知道的CGI变量名,而第二个则是( 包含了request_rec结构中的uri字段的)REQUEST_URI的一个副本,
  2. 特殊形式: %{ENV:variable} 其中的variable可以是任何环境变量。 它是通过查找Apache内部结构得到的, 或者(如果没找到的话)是由Apache服务器进程通过getenv()得到的。
  3. 特殊形式: %{HTTP:header} 其中的header可以是任何HTTP MIME头的名称。 它是通过查找HTTP请求得到的。比如: %{HTTP:Proxy-Connection}就是HTTP头 ``Proxy-Connection:''的值.
  4. 特殊形式 %{LA-U:variable} 它是一个预设的值, variable的最终值在执行一个内部的(基于URL的)子请求后决定。 在重写需要使用一个尚未有效的但是会在之后的API程序段中设置的变量的时候,就会使用这个方法。 比如,需要在服务器级配置(httpd.conf文件)中重写REMOTE_USER变量, 则,必须使用%{LA-U:REMOTE_USER},因为此变量是由认证程序段设置的, 而这个程序段是在mod_rewrite所在的URL转译程序段之后才执行的。 但是,因为mod_rewrite是通过API修正程序段来实现目录级(.htaccess file)配置的, 而这个程序段在认证程序段之前就执行了,所以用%{REMOTE_USER}就可以了。
  5. 特殊形式: %{LA-F:variable} 它是一个预设的值, variable的最终值在执行一个内部的(基于文件名的)子请求后决定。 大多数情况下和上述的LA-U是相同的.

CondPattern是条件pattern, , 一个应用于当前实例TestString的正则表达式, , TestString将会被计算然后与CondPattern匹配.

谨记: CondPattern是一个兼容perl的正则表达式,但是还有若干增补:

  1. 可以在pattern串中使用'!' 字符(惊叹号)来实现匹配的反转
  2. CondPatterns有若干特殊的变种。除了正则表达式的标准用法,还有下列用法:
    • '<CondPattern' (词典顺序的小于)
      CondPattern视为纯字符串,与TestString以词典顺序相比较. 如果按词典顺序,TestString小于CondPattern,则为真.
    • '>CondPattern' (词典顺序的大于)
      CondPattern视为纯字符串,与TestString以词典顺序相比较. 如果按词典顺序,TestString大于CondPattern,则为真.
    • '=CondPattern' (词典顺序的等于)
      CondPattern视为纯字符串,与TestString以词典顺序相比较. 如果按词典顺序,TestString等于CondPattern,则为真,即, 两个字符串(逐个字符地)完全相等。如果CondPattern只是""(两个引号), 则TestString将与空串相比较.
    • '-d' (是一个目录[directory])
      TestString视为一个路径名并测试它是否存在而且是一个目录.
    • '-f' (是一个常规的文件[file])
      TestString视为一个路径名并测试它是否存在而且是一个常规的文件.
    • '-s' (是一个非空的常规文件[size])
      TestString视为一个路径名并测试它是否存在而且是一个尺寸大于0的常规的文件.
    • '-l' (是一个符号连接[link])
      TestString视为一个路径名并测试它是否存在而且是一个符号连接.
    • '-F' (对子请求有效的业已存在的文件)
      测试TestString是否一个有效的文件, 而且可以被服务器当前已经配置的所有存取控制所存取。 它用一个内部子请求来做判断,由于会降低服务器的性能,请小心使用!
    • '-U' (对子请求有效的业已存在的URL)
      测试TestString是否一个有效的URL, 而且可以被服务器当前已经配置的所有存取控制所存取。 它用一个内部子请求来做判断,由于会降低服务器的性能,请小心使用!

注意

所有这些测试都可以用惊叹号作前缀('!')以实现条件的反转.

另外,还可以为CondPattern追加特殊的标记

[flags]

作为RewriteCond指令的第三个参数。 Flags是一个以逗号分隔的以下标记的列表:

  • 'nocase|NC' (no case)
    它使测试忽略大小写, , 扩展后的TestStringCondPattern中, 'A-Z' 和'a-z'是没有区别的。此标记仅作用于TestStringCondPattern的比较, 而对文件系统和子请求的测试不起作用。
  • 'ornext|OR' (or next condition)
    它以OR方式组合若干规则的条件,而不是隐含的AND。典型的例子如下:
·                RewriteCond %{REMOTE_HOST}  ^host1.*  [OR]
·                RewriteCond %{REMOTE_HOST}  ^host2.*  [OR]
·                RewriteCond %{REMOTE_HOST}  ^host3.*
·                RewriteRule ...some special stuff for any of these hosts...

如果不用这个标记,则必须使用三个 条件/规则。

举例:

如果要按请求头中的``User-Agent:'重写一个站点的主页,可以这样写:

RewriteCond  %{HTTP_USER_AGENT}  ^Mozilla.*
RewriteRule  ^/$                 /homepage.max.html  [L]
 
RewriteCond  %{HTTP_USER_AGENT}  ^Lynx.*
RewriteRule  ^/$                 /homepage.min.html  [L]
 
RewriteRule  ^/$                 /homepage.std.html  [L]

含义: 如果你使用的浏览器是Netscape Navigator(其识别标志是'Mozilla'), 则你将得到内容最大化的主页,包括Frames等等; 如果你使用的是(基于终端的)Lynx,则你得到的是内容最小化的主页,不包含tables等等; 如果你使用的是其他的浏览器,则你得到的是一个标准的主页。

RewriteEngine 指令

说明:

打开或关闭运行时刻的重写引擎

语法:

RewriteEngine on|off

默认值:

RewriteEngine off

上下文:

服务器配置, 虚拟主机, 目录, .htaccess

覆盖项:

FileInfo

状态:

Extension

模块:

mod_rewrite

RewriteEngine指令打开或关闭运行时刻的重写引擎。 如果设置为off,则此模块不执行任何运行时刻的重写操作, 甚至也不更新SCRIPT_URx环境变量。

使用该指令可以使此模块无效,而无须注释所有的RewriteRule指令!

注意:默认情况下,重写配置是不可继承的, 即,必须在每个需要的虚拟主机中设置一个RewriteEngine on指令。

RewriteLock 指令

说明:

设置RewriteMap同步所使用的加锁文件名

语法:

RewriteLock file-path

上下文:

服务器配置

状态:

Extension

模块:

mod_rewrite

此指令设置mod_rewrite为了和RewriteMap 程序通讯而使用的一个同步加锁文件的名称。在需要使用重写映射表程序时,它必须是一个本地路径(而不能是一个NFS挂接设备); 对其他类型的重写映射表,则无此要求。

RewriteLog 指令

说明:

设置重写引擎日志的文件名

语法:

RewriteLog file-path

上下文:

服务器配置, 虚拟主机

状态:

Extension

模块:

mod_rewrite

RewriteLog指令设置用于记录所有重写操作的文件的名称。 如果此文件名不是以斜杠('/')开头,则它是相对于Server Root的。 此指令应该仅仅出现在服务器级配置中。

如果要关闭对重写操作的记录,不推荐把Filename设置为/dev/null, 因为,虽然重写引擎不能输出记录了,但仍会内部地建立这个日志文件, 它会使服务器速度降低,而且对管理员毫无益处! 要关闭日志,可以删除或注解RewriteLog指令, 或者使用RewriteLogLevel 0!

安全

参见Apache Security Tips,其中讲述了,为什么如果存放日志的目录对除了启动服务器以外的用户是可写的会带来安全隐患。

举例

RewriteLog "/usr/local/var/apache/logs/rewrite.log"

RewriteLogLevel 指令

说明:

设置重写引擎日志的详细程度的级别

语法:

RewriteLogLevel Level

默认值:

RewriteLogLevel 0

上下文:

服务器配置, 虚拟主机

状态:

Extension

模块:

mod_rewrite

RewriteLogLevel指令设置重写引擎日志的详细程度的级别。 默认级别0意味着不记录,而9或更大的值意味着记录所有的操作。

要关闭重写引擎日志,可以简单地设此值为0,关闭所有的重写操作记录。

使用较高的Level值会使Apache服务器速度急剧下降! 重写日志使用大于2的Level值只用于调试!

举例

RewriteLogLevel 3

RewriteMap 指令

说明:

定义用于关键词查找的映射函数

语法:

RewriteMap MapName MapType:MapSource

上下文:

服务器配置, 虚拟主机

状态:

Extension

模块:

mod_rewrite

兼容性:

Apache 2.0.41及其更新版本中可以使用不同的dbm类型。

RewriteMap定义一个映射表, 由映射函数用于查找关键词来插入/替换字段。此查找操作的源可以是多种类型。

MapName是映射表的名称, 指定了一个映射函数,用于重写规则的字符串替换,它可以是下列形式之一:

${ MapName : LookupKey }
${ MapName : LookupKey | DefaultValue }

如果使用了这样的形式,则会在MapName中查找关键词LookupKey。 如果找到了,则被替换成SubstValue;如果没有找到,则被替换成DefaultValue, 如果没有指定DefaultValue,则被替换成空字符串。

可以使用下列MapTypeMapSource的组合:

  • 标准纯文本
    MapType: txt, MapSource: 有效的Unix文件系统文件名

这是重写映射表的标准形式,即, MapSource是一个纯文本文件,包含空行、注释行(以字符'#'打头), 以及每行一个的替换对,如下。

MatchingKey SubstValue

Example

##
##  map.txt -- rewriting map
##
 
Ralf.S.Engelschall    rse   # Bastard Operator From Hell
Mr.Joe.Average        joe   # Mr. Average

RewriteMap real-to-user txt:/path/to/file/map.txt

  • 随机纯文本
    MapType: rnd, MapSource: 有效的Unix文件系统文件名

这个与上述的标准纯文本很相似,但它有一个特殊的后处理特性: 查找完毕后,会解析其中包含的含义为``or''和``|''符号。 也就是说,会随机地选择其中之一作为实际的返回值。虽然这看似毫无意义,但它的设计意图是, 在一个查找值是服务器名称的反向代理环境中,实现负载平衡。如:

##
##  map.txt -- rewriting map
##
 
static   www1|www2|www3|www4
dynamic  www5|www6

RewriteMap servers rnd:/path/to/file/map.txt

  • 散列文件
    MapType: dbm[=type], MapSource: 有效的Unix文件系统文件名

这里的源是一个二进制格式的DBM文件,包含了与纯文本相同的内容, 但是因为它有优化的特殊表现形式,使它的查找速度明显快得多。此类型可以是sdbm, gdbm, ndbm或db,由compile-time settings所决定。如果省略type,则使用编译时选择的缺省设置。 你可以使用任何DBM工具或者下列Perl脚本来建立这个文件,但必须保证DBM的类型正确。 建立NDBM文件的例子:

#!/path/to/bin/perl
##
##  txt2dbm -- convert txt map to dbm format
##
 
use NDBM_File;
use Fcntl;
 
($txtmap, $dbmmap) = @ARGV;
 
open(TXT, "<$txtmap") or die "Couldn't open $txtmap!/n";
tie (%DB, 'NDBM_File', $dbmmap,O_RDWR|O_TRUNC|O_CREAT, 0644)
  or die "Couldn't create $dbmmap!/n";
 
while (<TXT>) {
  next if (/^/s*#/ or /^/s*$/);
  $DB{$1} = $2 if (/^/s*(/S+)/s+(/S+)/);
}
 
untie %DB;
close(TXT);

$ txt2dbm map.txt map.db

  • 内部函数
    MapType: int, MapSource: 内部的Apache函数

这里的源是一个内部的Apache函数。 目前,还不能由你自己建立,只能使用下列已经存在的函数:

    • toupper:
      转换查找关键词为大写.
    • tolower:
      转换查找关键词为小写.
    • escape:
      转换查找关键词中的特殊字符为十六进制编码.
    • unescape:
      转换查找关键词中的十六进制编码为特殊字符.
  • 外部的重写程序
    MapType: prg, MapSource: 有效的Unix文件系统文件名

这里的源是一个程序,而不是一个映射表文件。 程序的编制语言可以随意选择,但最终结果必须是可执行的 (, 或者是目标代码,或者是首行为'#!/path/to/interpreter'的脚本).

此程序仅在Apache服务器启动时启动一次, 随后通过stdinstdout文件句柄与重写引擎交互。对每个映射函数的查找操作,它从stdin接收以回车结束的查找关键词, 然后把查找结果以回车结束反馈到stdout, 如果查找失败,则返回四个字符的``NULL'' (, 对给定的关键词没有对应的值)。 此程序的最简单形式是一个1:1的映射(,key == value),如:

#!/usr/bin/perl
$| = 1;
while (<STDIN>) {
    # ...put here any transformations or lookups...
___FCKpd___77
}

但是必须注意:

1.         ``即使它看来简单而愚蠢,只要正确,就保持原样(Keep it simple, stupid)'' (KISS), 因为,在规则起作用时,此程序的崩溃会直接导致Apache服务器的崩溃。

2. 避免犯一个常见的错误: 绝不要对stdout做缓冲I/O! 它会导致死循环! 所以上述例子中才会有``$|=1''...

3. 使用RewriteLock指令定义一个加锁文件, 用于同步mod_rewrite和此程序之间的通讯。缺省时是没有同步操作的。

RewriteMap指令允许多次出现。 对每个映射函数都可以使用一个RewriteMap指令来定义其重写映射表。 虽然不能在目录的上下文中定义映射表, 但是,完全可以在其中使用映射表。

注意

对于纯文本和DBM格式的文件,已经查找过的关键词会被缓存在内核中,直到映射表的mtime改变了或者服务器重启了。这样,你可以把每个请求都会用到的映射函数放在规则中,这是没有问题的,因为外部查找只进行一次!

RewriteOptions 指令

说明:

为重写引擎设置一些特殊的选项

语法:

RewriteOptions Options

默认值:

RewriteOptions MaxRedirects=10

上下文:

服务器配置, 虚拟主机, 目录, .htaccess

覆盖项:

FileInfo

状态:

Extension

模块:

mod_rewrite

兼容性:

MaxRedirects在Apache 2.0.45以及更新的版本中有效

RewriteOptions指令为当前服务器级和目录级的配置设置一些选项。 Option可以是下列值之一:

inherit

此值强制当前配置可以继承其父配置。 在虚拟主机级配置中,它意味着主服务器的映射表、条件和规则可以被继承。 在目录级配置中,它意味着其父目录的.htaccess中的条件和规则可以被继承。

MaxRedirects=number

为了避免目录级RewriteRule的无休止的内部重定向, 在此类重定向和500内部服务器错误次数达到一个最大值的时候, mod_rewrite会停止对此请求的处理。 如果你确实需要对每个请求允许大于10次的内部重定向,可以增大这个值。

RewriteRule 指令

说明:

为重写引擎定义规则

语法:

RewriteRule Pattern Substitution

上下文:

服务器配置, 虚拟主机, 目录, .htaccess

覆盖项:

FileInfo

状态:

Extension

模块:

mod_rewrite

兼容性:

cookie-flag在Apache 2.0.40及其更新版本中有效.

RewriteRule指令是重写引擎的根本。此指令可以多次使用。 每个指令定义一个简单的重写规则。这些规则的定义顺序尤为重要, 因为,在运行时刻,规则是按这个顺序逐一生效的.

Pattern是一个作用于当前URL的兼容perl的正则表达式. 这里的``当前''是指该规则生效时的URL的值。它可能与被请求的URL不同,因为其他规则可能在此之前已经发生匹配并对它做了改动。

正则表达式的一些用法:

Text:
  .           Any single character
  [chars]     Character class: One  of chars
  [^chars]    Character class: None of chars
  text1|text2 Alternative: text1 or text2
 
Quantifiers:
  ?           0 or 1 of the preceding text
  *           0 or N of the preceding text (N > 0)
  +           1 or N of the preceding text (N > 1)
 
Grouping:
  (text)      Grouping of text
              (either to set the borders of an alternative or
              for making backreferences where the Nth group can 
              be used on the RHS of a RewriteRule with $N)
 
Anchors:
  ^           Start of line anchor
  $           End   of line anchor
 
Escaping:
  /char       escape that particular char
              (for instance to specify the chars ".[]()" etc.)

更多有关正则表达式的资料请参见perl正则表达式手册页("perldoc perlre"). 如果你对正则表达式的更详细的资料及其变种(POSIX regex 等.)感兴趣, 请参见以下专著:

Mastering Regular Expressions
Jeffrey E.F. Friedl
Nutshell Handbook Series
O'Reilly & Associates, Inc. 1997
ISBN 1-56592-257-3

另外,在mod_rewrite中,还可以使用否字符('!')的pattern前缀,以实现pattern的反转。 比如:``如果当前URL与pattern相匹配''. 它用于使用否pattern较容易描述的需要排除的某些情况,或者作为最后一条规则。

注意

使用否字符以反转pattern时,pattern中不能使用分组的通配成分。 由于pattern不匹配而使分组的内容是空的,所以它是不可能实现的。 因此,如果使用了否pattern,那么后继的字符串中就不能使用$N!

重写规则中的Substitution是, 当原始URL与Pattern相匹配时,用以替代(或替换)的字符串。 除了纯文本,还可以使用

  1. $N 反向引用RewriteRule的pattern
  2. %N 反向引用最后匹配的RewriteCond pattern
  3. 规则条件测试字符串中(%{VARNAME})的服务器变量
  4. 映射函数调用(${mapname:key|default})

反向引用的$N (N=0..9) 是指用Pattern所匹配的第N组的内容去替换URL。 服务器变量与RewriteCond指令的TestString相同。映射函数由RewriteMap指令所决定,其说明也参见该指令。 这三种类型变量按上面列表中的顺序被扩展。

如上所述,所有的重写规则都是(按配置文件中的定义顺序)作用于Substitution的。 URL被Substitution完全地替换,并继续处理直到所有规则处理完毕, 除非用L标记显式地终结 - 见下文。

'-'是一个特殊的替换串,意思是不要替换! 似乎很愚蠢吧? 不, 它可以用于仅仅匹配某些URL而无须替换的情况下,, 在发生替换前,允许以C (chain)标记连接的多个pattern同时起作用。

还有,你甚至可以在替换字符串中新建包含请求串的URL。 在替换串中使用问号,以标明其后继的成分应该被重新注入到QUERY_STRING中。 要删除一个已有的请求串,可以用问号来终结替换字符串。

注意

一个特殊功能: 在用http://thishost[:thisport]作为替换字段的前缀时, mod_rewrite会把它自动剥离出去。 在配合生成主机名的映射函数使用的时候, 这个对隐含的外部重定向URL的精简化操作是有用的而且是重要的。 下面例子一节中的第一个例子有助于理解这点。

谨记

由于此功能的存在,以http://thishost为前缀的无条件外部重定向在你自己的服务器上是无效的。要做这样一个自身的重定向,必须使用R标记 (见下文).

此外,Substitution还可以追加特殊标记

[flags]

作为RewriteRule指令的第三个参数。 Flags是一个包含以逗号分隔的下列标记的列表:

  • 'redirect|R [=code]' (强制重定向 redirect)
    http://thishost[:thisport]/(使新的URL成为一个URI) 为前缀的Substitution可以强制性执行一个外部重定向。 如果code没有指定,则产生一个HTTP响应代码302(临时性移动)。 如果需要使用在300-400范围内的其他响应代码,只需在此指定这个数值即可, 另外,还可以使用下列符号名称之一: temp (默认的), permanent, seeother. 用它可以把规范化的URL反馈给客户端,, 重写``/~''为 ``/u/'',或对/u/user加上斜杠,等等。

注意: 在使用这个标记时,必须确保该替换字段是一个有效的URL! 否则,它会指向一个无效的位置! 并且要记住,此标记本身只是对URL加上 http://thishost[:thisport]/的前缀,重写操作仍然会继续。通常,你会希望停止重写操作而立即重定向,则还需要使用'L'标记.

  • 'forbidden|F' (强制URL为被禁止的 forbidden)
    强制当前URL为被禁止的,,立即反馈一个HTTP响应代码403(被禁止的)。 使用这个标记,可以链接若干RewriteConds以有条件地阻塞某些URL。
  • 'gone|G' (强制URL为已废弃的 gone)
    强制当前URL为已废弃的,,立即反馈一个HTTP响应代码410(已废弃的)。 使用这个标记,可以标明页面已经被废弃而不存在了.
  • 'proxy|P' (强制为代理 proxy)
    此标记使替换成分被内部地强制为代理请求,并立即(, 重写规则处理立即中断)把处理移交给代理模块。 你必须确保此替换串是一个有效的(比如常见的以 http://hostname开头的)能够为Apache代理模块所处理的URI。 使用这个标记,可以把某些远程成分映射到本地服务器名称空间, 从而增强了ProxyPass指令的功能。

注意: 要使用这个功能,代理模块必须编译在Apache服务器中。 如果你不能确定,可以检查``httpd -l''的输出中是否有mod_proxy.c。 如果有,则mod_rewrite可以使用这个功能;如果没有,则必须启用mod_proxy并重新编译``httpd''程序。

  • 'last|L' (最后一个规则 last)
    立即停止重写操作,并不再应用其他重写规则。 它对应于Perl中的last命令或C语言中的break命令。 这个标记可以阻止当前已被重写的URL为其后继的规则所重写。 举例,使用它可以重写根路径的URL('/')为实际存在的URL, 比如, '/e/www/'.
  • 'next|N' (重新执行 next round)
    重新执行重写操作(从第一个规则重新开始). 这时再次进行处理的URL已经不是原始的URL了,而是经最后一个重写规则处理的URL。 它对应于Perl中的next命令或C语言中的continue命令。 此标记可以重新开始重写操作,, 立即回到循环的头部。
    但是要小心,不要制造死循环!
  • 'chain|C' (与下一个规则相链接 chained)
    此标记使当前规则与下一个(其本身又可以与其后继规则相链接的, 并可以如此反复的)规则相链接。 它产生这样一个效果: 如果一个规则被匹配,通常会继续处理其后继规则, ,这个标记不起作用;如果规则不能被匹配, 则其后继的链接的规则会被忽略。比如,在执行一个外部重定向时, 对一个目录级规则集,你可能需要删除``.www'' (此处不应该出现``.www''的)。
  • 'type|T=MIME-type' (强制MIME类型 type)
    强制目标文件的MIME类型为MIME-type。 比如,它可以用于模拟mod_alias中的ScriptAlias指令, 以内部地强制被映射目录中的所有文件的MIME类型为``application/x-httpd-cgi''.
  • 'nosubreq|NS' (仅用于不对内部子请求进行处理 no internal sub-request)
    在当前请求是一个内部子请求时,此标记强制重写引擎跳过该重写规则。 比如,在mod_include试图搜索可能的目录默认文件(index.xxx)时, Apache会内部地产生子请求。对子请求,它不一定有用的,而且如果整个规则集都起作用, 它甚至可能会引发错误。所以,可以用这个标记来排除某些规则。

根据你的需要遵循以下原则: 如果你使用了有CGI脚本的URL前缀,以强制它们由CGI脚本处理,而对子请求处理的出错率(或者开销)很高,在这种情况下,可以使用这个标记。

  • 'nocase|NC' (忽略大小写 no case)
    它使Pattern忽略大小写,, 在Pattern与当前URL匹配时,'A-Z' 和'a-z'没有区别。
  • 'qsappend|QSA' (追加请求串 query string append)
    此标记强制重写引擎在已有的替换串中追加一个请求串,而不是简单的替换。 如果需要通过重写规则在请求串中增加信息,就可以使用这个标记。
  • 'noescape|NE' (在输出中不对URI作转义 no URI escaping)
    此标记阻止mod_rewrite对重写结果应用常规的URI转义规则。 一般情况下,特殊字符(如'%', '$', ';'等)会被转义为等值的十六进制编码。 此标记可以阻止这样的转义,以允许百分号等符号出现在输出中,如:

RewriteRule /foo/(.*) /bar?arg=P1/%3d$1 [R,NE]

可以使'/foo/zed'转向到一个安全的请求'/bar?arg=P1=zed'.

  • 'passthrough|PT' (移交给下一个处理器 pass through)
    此标记强制重写引擎将内部结构request_rec中的uri字段设置为 filename字段的值,它只是一个小修改,使之能对来自其他URI到文件名翻译器的 AliasScriptAlias, Redirect 指令的输出进行后续处理。举一个能说明其含义的例子: 如果要通过mod_rewrite的重写引擎重写/abc/def, 然后通过mod_alias使/def转变为/ghi,可以这样:

RewriteRule ^/abc(.*) /def$1 [PT]
Alias /def /ghi

如果省略了PT标记,虽然mod_rewrite运作正常, , 作为一个使用API的URI到文件名翻译器, 它可以重写uri=/abc/...filename=/def/..., 但是,后续的mod_alias在试图作URI到文件名的翻译时,则会失效。

注意: 如果需要混合使用不同的包含URI到文件名翻译器的模块时,就必须使用这个标记。。 混合使用mod_aliasmod_rewrite就是个典型的例子。

For Apache hackers

如果当前Apache API除了URI到文件名hook之外,还有一个文件名到文件名的hook, 就不需要这个标记了! 但是,如果没有这样一个hook,则此标记是唯一的解决方案。 Apache Group讨论过这个问题,并在Apache 2.0 版本中会增加这样一个hook。

  • 'skip|S=num' (跳过后继的规则 skip)
    此标记强制重写引擎跳过当前匹配规则后继的num个规则。 它可以实现一个伪if-then-else的构造: 最后一个规则是then从句,而被跳过的skip=N个规则是else从句. (它和'chain|C'标记是不同的!)
  • 'env|E=VAR:VAL' (设置环境变量 environment variable)
    此标记使环境变量VAR的值为VAL, VAL可以包含可扩展的反向引用的正则表达式$N%N。 此标记可以多次使用以设置多个变量。 这些变量可以在其后许多情况下被间接引用,但通常是在XSSI (via <!--#echo var="VAR"-->) or CGI ( $ENV{'VAR'})中, 也可以在后继的RewriteCond指令的pattern中通过%{ENV:VAR}作引用。 使用它可以从URL中剥离并记住一些信息。
  • 'cookie|CO=NAME:VAL:domain[:lifetime[:path]]' (设置cookie)
    它在客户端浏览器上设置一个cookie。 cookie的名称是NAME,其值是VALdomain字段是该cookie的域,比如'.apache.org', 可选的lifetime是cookie生命期的分钟数, 可选的path是cookie的路径。

注意

绝不要忘记,在服务器级配置文件中,Pattern是作用于整个URL的。 但是在目录级配置文件中, (一般总是和特定目录名称相同的)目录前缀会在pattern匹配时被自动删除,而又在替换完毕后自动被加上此特性对很多种重写是必须的,因为,如果没有这个剥离前缀的动作,就必须与其父目录去匹配,而这并不总是可行的。

但是有一个例外: 如果替换串以``http://''开头,则不会附加目录前缀,而是强制产生一个外部重定向,或者(如果使用了P标记)是一个代理操作!

注意

为了对目录级配置启用重写引擎,你必须在这些文件中设置``RewriteEngine On'', 并且打开``Options FollowSymLinks'。 如果管理员对用户目录禁用了FollowSymLinks, 则无法使用重写引擎。这个限制是为了安全而设置的。

以下是所有可能的替换组合及其含义:

在服务器级配置中(httpd.conf)
,对这样一个请求 ``GET /somepath/pathinfo'':

Given Rule                                      Resulting Substitution
----------------------------------------------  ----------------------------------
^/somepath(.*) otherpath$1                      not supported, because invalid!
 
^/somepath(.*) otherpath$1  [R]                 not supported, because invalid!
 
^/somepath(.*) otherpath$1  [P]                 not supported, because invalid!
----------------------------------------------  ----------------------------------
^/somepath(.*) /otherpath$1                     /otherpath/pathinfo
 
^/somepath(.*) /otherpath$1 [R]                 http://thishost/otherpath/pathinfo
                                                via external redirection
 
^/somepath(.*) /otherpath$1 [P]                 not supported, because silly!
----------------------------------------------  ----------------------------------
^/somepath(.*) http://thishost/otherpath$1      /otherpath/pathinfo
 
^/somepath(.*) http://thishost/otherpath$1 [R]  http://thishost/otherpath/pathinfo
                                                via external redirection
 
^/somepath(.*) http://thishost/otherpath$1 [P]  not supported, because silly!
----------------------------------------------  ----------------------------------
^/somepath(.*) http://otherhost/otherpath$1     http://otherhost/otherpath/pathinfo
                                                via external redirection
 
^/somepath(.*) http://otherhost/otherpath$1 [R] http://otherhost/otherpath/pathinfo
                                                via external redirection
                                                (the [R] flag is redundant)
 
^/somepath(.*) http://otherhost/otherpath$1 [P] http://otherhost/otherpath/pathinfo
                                                via internal proxy

/somepath的目录级配置中
(, 目录/physical/path/to/somepath.htaccess文件中包含 RewriteBase /somepath)
对这样一个请求``GET /somepath/localpath/pathinfo'':

Given Rule                                      Resulting Substitution
----------------------------------------------  ----------------------------------
^localpath(.*) otherpath$1                      /somepath/otherpath/pathinfo
 
^localpath(.*) otherpath$1  [R]                 http://thishost/somepath/otherpath/pathinfo
                                                via external redirection
 
^localpath(.*) otherpath$1  [P]                 not supported, because silly!
----------------------------------------------  ----------------------------------
^localpath(.*) /otherpath$1                     /otherpath/pathinfo
 
^localpath(.*) /otherpath$1 [R]                 http://thishost/otherpath/pathinfo
                                                via external redirection
 
^localpath(.*) /otherpath$1 [P]                 not supported, because silly!
----------------------------------------------  ----------------------------------
^localpath(.*) http://thishost/otherpath$1      /otherpath/pathinfo
 
^localpath(.*) http://thishost/otherpath$1 [R]  http://thishost/otherpath/pathinfo
                                                via external redirection
 
^localpath(.*) http://thishost/otherpath$1 [P]  not supported, because silly!
----------------------------------------------  ----------------------------------
^localpath(.*) http://otherhost/otherpath$1     http://otherhost/otherpath/pathinfo
                                                via external redirection
 
^localpath(.*) http://otherhost/otherpath$1 [R] http://otherhost/otherpath/pathinfo
                                                via external redirection
                                                (the [R] flag is redundant)
 
^localpath(.*) http://otherhost/otherpath$1 [P] http://otherhost/otherpath/pathinfo
                                                via internal proxy

举例:

要重写这种形式的URL

/ Language /~ Realname /.../ File

/u/ Username /.../ File . Language

可以把这样的对应关系保存在/path/to/file/map.txt映射文件中,此后,只要在Apache服务器配置文件中增加下列行,即可:

RewriteLog   /path/to/file/rewrite.log
RewriteMap   real-to-user               txt:/path/to/file/map.txt
RewriteRule  ^/([^/]+)/~([^/]+)/(.*)$   /u/${real-to-user:$2|nobody}/$3.$1

一些mod_rewrite的例子

RewriteEngine On
RewriteCond %{HTTP_REFERER} !^$ [NC]
RewriteCond %{HTTP_REFERER} !^http://domain.com [NC]
RewriteCond %{HTTP_REFERER} !^http://www.domain.com [NC]
RewriteCond %{HTTP_REFERER} !^http://206.130.123.198 [NC]
RewriteRule ^.*$ http://www.domain.com/ [R,L]

如果用户的链接不是从www.domain.com,domain.com或206.130.123.198(你的IP地址)来的,就会被转到www.domain.com

将不同的域名格式转向到统一的格式

RewriteEngine On
RewriteCond %{HTTP_HOST} !^www.domain.com$ [NC]
RewriteRule ^(.*)$ http://www.domain.com/$1 [R,L]

如果用户使用http://domain.com/yourpage.html将被转到http://www.domain.com/yourpage.html

针对不同的浏览器

# MS Internet Explorer - Mozilla v4
RewriteEngine On
RewriteCond %{HTTP_USER_AGENT} ^Mozilla/4(.*)MSIE
RewriteRule ^index/.html$ /index.IE.html [L]

# Netscape v6.+ - Mozilla v5
RewriteCond %{HTTP_USER_AGENT} ^Mozilla/5(.*)Gecko
RewriteRule ^index/.html$ /index.NS5.html [L]

# Lynx or Mozilla v1/2
RewriteCond %{HTTP_USER_AGENT} ^Lynx/ [OR]
RewriteCond %{HTTP_USER_AGENT} ^Mozilla/[12]
RewriteRule ^index/.html$ /index.20.html [L]

# All other browsers
RewriteRule ^index/.html$ /index.32.html [L]

使用不同的浏览器的用户被转向到不同的页面

附:

附:

ubuntu全程配置手册zt- -

??其实这是我的安装配置备忘录。个人感觉比ubuntu.org.cn的手册更适合我一些,贴出来供大家批评参详。事实上,本文绝大多数内容都是来自于下面提到的文章。我自己只是做了一回胶水而已。

撰写本文所使用的硬件配置:
Pentium M 1.4 GHz, 512 MB 内存, 80GB 硬盘, CD-ROM, 14.1' LCD 1024 x 768, ATI Mobility Readon 9000 (M9) 64 MB Video RAM, 2Mbps ADSL
凡是使用ATI Readon 8500以上显卡的计算机,有3GB以上硬盘未分配空间的,都适用本文内容。NV显卡用户和非ADSL用户也可以参考除了网络配置和显卡配置之外的所有内容。(ATI X300以上显卡的用户和宽屏显示器用户可能不适用本文的显示配置部分。)

一、前言:

Linux的近年来的发展迅速,在我接触Linux的2年中,Windows还是那个Windows,而 Linux已经不是2年前的Linux了!把Linux作为桌面,也随着Linux易用性的提高而渐渐为越来越多的人所接受。据说Google公司最受欢迎的操作系统不是Windows,不是MacOSX,而是Linux。Linux发行版多种多样,现在最受欢迎的莫过于Ubuntu,Google公司内部使用的Linux发行版,也是基于Ubuntu的Goobuntu。

现在,我就以Ubuntu Linux 6.06 LTS为例,介绍Ubuntu Linux的安装和配置,使之能更好的满足大家的需要。全文以介绍配置为主。

本文参考了ubuntu.org.cn的Ubuntu Linux 6.06 DapperDrake快速设置指南,如何混音和Nicky's Blog的ubuntu的黑体解决方案。

本文提到的STHeiti属于商业软件,仅供个人测试之用,不得用于任何形式的商业用途。MS Truetype Core Fonts根据Microsoft的EULA免费分发,EULA的内容请自行查阅msttcorefonts压缩包内的相关文件。

谨以此文,献给喜欢Ubuntu的Linuxer。欢迎加入Ubuntu阵营。

二、安装:

0. 下载Ubuntu Linux 6.06 LTS Desktop CD的ISO,刻盘。

1. 用光盘引导系统,进入LiveCD安装环境。直接点击桌面上的安装软连接就可以开始安装了。

2. 安装过程不详述了,详情请参考这里,包括了安装全过程的截图,其实基本上跟着安装向导一路下去就可以了,唯一要注意一下的地方就是分区。可能第一次使用这个分区工具会感到有点陌生,但是只要你对分区方法很熟悉,上手应该不难。

强烈建议安装过程中保持联网,以下载中文语言包。配置联网方法见下面“配置ADSL”,请在安装前配置网络以确保安装过程中网络通畅。你也可以在安装过程中使用LiveCD环境浏览网络,打发时间。如果网络状况良好,以2Mb ADSL全速为例,大约15-20分钟就可安装完成。重启。

三、安装后配置:

0. 配置ADSL:

代码:

sudo pppoeconf

配置完毕,即已经联网。
要手动联网可以使用:

代码:

pon dsl-provider

手动关闭联网可以使用:

代码:

poff dsl-provider

1. 添加源:

代码:

sudo mv /etc/apt/sources.list /etc/apt/sources.list_backup
sudo gedit /etc/apt/sources.list

添加下面的任意一组(请根据你的实际连线速度决定):

代码:

    * Archive.ubuntu.com 更新服务器(欧洲):

deb http://archive.ubuntu.com/ubuntu/ dapper main restricted universe multiverse
deb http://archive.ubuntu.com/ubuntu/ dapper-security main restricted universe multiverse
deb http://archive.ubuntu.com/ubuntu/ dapper-updates main restricted universe multiverse
deb http://archive.ubuntu.com/ubuntu/ dapper-backports main restricted universe multiverse
deb http://archive.ubuntu.org.cn/ubuntu-cn/ dapper main restricted universe multiverse

    * Ubuntu.cn99.com 更新服务器(江苏省常州市电信,推荐电信用户使用。):

deb http://ubuntu.cn99.com/ubuntu/ dapper main restricted universe multiverse
deb http://ubuntu.cn99.com/ubuntu/ dapper-updates main restricted universe multiverse
deb http://ubuntu.cn99.com/ubuntu/ dapper-security main restricted universe multiverse
deb http://ubuntu.cn99.com/ubuntu/ dapper-backports main restricted universe multiverse
deb http://ubuntu.cn99.com/ubuntu-cn/ dapper main restricted universe multiverse

    * Mirror.lupaworld.com 更新服务器(浙江省杭州市电信,推荐电信用户使用。):

deb http://mirror.lupaworld.com/ubuntu/archive/ dapper main restricted universe multiverse
deb http://mirror.lupaworld.com/ubuntu/archive/ dapper-security main restricted universe multiverse
deb http://mirror.lupaworld.com/ubuntu/archive/ dapper-updates main restricted universe multiverse
deb http://mirror.lupaworld.com/ubuntu/archive/ dapper-backports main restricted universe multiverse
deb http://mirror.lupaworld.com/ubuntu/ubuntu-cn/ dapper main restricted universe multiverse

    * 上海市交通大学 更新服务器(教育网,推荐校园网和网通用户使用。):

deb http://ftp.sjtu.edu.cn/ubuntu/ dapper main multiverse restricted universe
deb http://ftp.sjtu.edu.cn/ubuntu/ dapper-backports main multiverse restricted universe
deb http://ftp.sjtu.edu.cn/ubuntu/ dapper-proposed main multiverse restricted universe
deb http://ftp.sjtu.edu.cn/ubuntu/ dapper-security main multiverse restricted universe
deb http://ftp.sjtu.edu.cn/ubuntu/ dapper-updates main multiverse restricted universe
deb http://ftp.sjtu.edu.cn/ubuntu-cn/ dapper main multiverse restricted universe

    * 北京市清华大学 更新服务器(教育网,推荐校园网和网通用户使用。):

deb http://mirror.net9.org/ubuntu/ dapper main multiverse restricted universe
deb http://mirror.net9.org/ubuntu/ dapper-backports main multiverse restricted universe
deb http://mirror.net9.org/ubuntu/ dapper-proposed main multiverse restricted universe
deb http://mirror.net9.org/ubuntu/ dapper-security main multiverse restricted universe
deb http://mirror.net9.org/ubuntu/ dapper-updates main multiverse restricted universe
deb http://mirror.net9.org/ubuntu-cn/ dapper main multiverse restricted universe

    * 中国 台湾省台湾大学 更新服务器(推荐网通用户使用,电信PING平均响应速度41MS。)

deb http://ubuntu.csie.ntu.edu.tw/ubuntu/ dapper main restricted universe multiverse
deb-src http://ubuntu.csie.ntu.edu.tw/ubuntu/ dapper main restricted universe multiverse
deb http://ubuntu.csie.ntu.edu.tw/ubuntu/ dapper-updates main restricted universe multiverse
deb-src http://ubuntu.csie.ntu.edu.tw/ubuntu/ dapper-updates main restricted universe multiverse
deb http://ubuntu.csie.ntu.edu.tw/ubuntu/ dapper-backports main restricted universe multiverse
deb-src http://ubuntu.csie.ntu.edu.tw/ubuntu/ dapper-backports main restricted universe multiverse
deb http://ubuntu.csie.ntu.edu.tw/ubuntu/ dapper-security main restricted universe multiverse
deb-src http://ubuntu.csie.ntu.edu.tw/ubuntu/ dapper-security main restricted universe multiverse
deb http://ftp.sjtu.edu.cn/ubuntu-cn/ dapper main multiverse restricted universe

    * Mirror.vmmatrix.net 更新服务器(上海市电信,推荐电信网通用户使用。):

deb http://mirror.vmmatrix.net/ubuntu/ dapper main restricted universe multiverse
deb-src http://mirror.vmmatrix.net/ubuntu/ dapper main restricted universe multiverse
deb http://mirror.vmmatrix.net/ubuntu/ dapper-updates main restricted universe multiverse
deb-src http://mirror.vmmatrix.net/ubuntu/ dapper-updates main restricted universe multiverse
deb http://mirror.vmmatrix.net/ubuntu/ dapper-backports main restricted universe multiverse
deb-src http://mirror.vmmatrix.net/ubuntu/ dapper-backports main restricted universe multiverse
deb http://mirror.vmmatrix.net/ubuntu/ dapper-security main restricted universe multiverse
deb-src http://mirror.vmmatrix.net/ubuntu/ dapper-security main restricted universe multiverse
deb http://ftp.sjtu.edu.cn/ubuntu-cn/ dapper main multiverse restricted universe

2. 更新软件包信息:

代码:

sudo apt-get update

3. 升级内核:

代码:

sudo apt-get install linux-686

4. 删除老内核:

代码:

sudo apt-get remove linux-image-386 linux-restricted-modules-2.6.15-23-386 linux-restricted-modules-386 linux-386 linux-image-2.6.15-23-386

5. 重启。

6. 开始ADSL联网:
假如你在设置的时候就设成开机时启动ADSL,这步就可以省略。

代码:

pon dsl-provider

7. 升级系统:

代码:

sudo apt-get dist-upgrade

升级系统可能会花上一段时间,你可以利用这个时间进行一些小小的配置:
a. 设置一下SCIM,使它符合你的使用习惯;
b. 为Firefox安装插件。推荐如下插件:Google ToolBar, Google Browser Sync, Google NoteBook, Flashgot, Adblock, Fasterfox, Tab Mix Plus;如果无法下载Google Web Sync,请到这里下载(在Linux目录下的GoogleBS.xpi)。
c. 调整一下桌面,把计算机、主文件夹、回收站放到桌面上,把挂载的卷去掉:

代码:

gconf-editor

到/apps/nautilus/desktop/分支下,去掉volumes_visible前面的复选框,勾上trash_icon_visible,home_icon_visible,computer_icon_visible前面的复选框。

升级完毕,注销,或者重启,或什么都不做,继续进行后面的步骤。

8. 配置字体:

代码:

sudo fontconfig-voodoo -f -s zh_CN

9. 安装文泉驿字体:

代码:

sudo apt-get install xfonts-wqy
sudo gedit /etc/fonts/conf.d/50-xfonts-wqy.conf

添加如下内容:

代码:

<selectfont>
  <acceptfont>
    <pattern>
      <patelt name="family"><string>WenQuanYi Bitmap Song</string></patelt>
    </pattern>
  </acceptfont>
</selectfont>

这步是给不喜欢黑体的人准备的。如果你喜欢Mac风格的黑体字,下面会介绍将你的系统字体配置成黑体的方法。Anyway,就算你喜欢黑体,建议你也装一下。

10. 安装Java环境:

建议安装JDK,反正也不比JRE多用很多空间。

代码:

sudo apt-get install sun-java5-jdk

配置JRE:

代码:

sudo update-alternatives --config java

选择:/usr/lib/jvm/java-1.5.0-sun/jre/bin/java作为你的JRE

配置Java中文字体:

代码:

wget http://paste.ubuntu.org.cn/d323
sudo mv /etc/java-1.5.0-sun/fontconfig.properties /etc/java-1.5.0-sun/fontconfig.properties.old
sudo mv d323 /etc/java-1.5.0-sun/fontconfig.properties
sudo chown root:root /etc/java-1.5.0-sun/fontconfig.properties

安装浏览器Java插件:

代码:

sudo apt-get install sun-java5-plugin

11. 改进输入法:

代码:

sudo apt-get install scim-bridge
sudo vi /etc/X11/xinit/xinput.d/zh_CN

将 GTK_IM_MODULE=scim 修改为 GTK_IM_MODULE="scim-bridge";
将 QT_IM_MODULE=scim 修改为 QT_IM_MODULE="xim"

12. 安装LumaQQ

代码:

cd;mkdir tmp;cd tmp
wget -c http://download.ubuntu.org.cn/software/lumaqq_2005-linux_gtk2_x86_no_jre.tar.gz
sudo tar zxvf lumaqq_2005-linux_gtk2_x86_no_jre.tar.gz -C /opt/
wget -c http://download.ubuntu.org.cn/software/lumaqq_2005_patch_2006.02.02.15.00.zip
sudo unzip -o lumaqq_2005_patch_2006.02.02.15.00.zip -d /opt/LumaQQ/lib
sudo chown -R root:root /opt/LumaQQ/
sudo chmod -R 755 /opt/LumaQQ/
sudo vi /usr/share/applications/LumaQQ.desktop

添加如下行:

代码:

[Desktop Entry]
Name=LumaQQ
Comment=QQ Client
Exec=/opt/LumaQQ/lumaqq
Icon=/opt/LumaQQ/QQ.png
Terminal=false
Type=Application
Categories=Application;Network;

你可以在 应用程序 - Internet - LumaQQ 打开LumaQQ

13. 安装播放器:

代码:

sudo apt-get install beep-media-player totem-xine w32codecs libxine-extracodecs mplayer banshee

14. 安装StarDict

代码:

sudo apt-get install stardict stardict-common stardict-cdict-gb stardict-cedict-gb stardict-hanzim stardict-langdao-ce-gb stardict-langdao-ec-gb stardict-oxford-gb stardict-xdict-ce-gb stardict-xdict-ec-gb

15. 安装浏览器Flash插件:

代码:

sudo apt-get install flashplugin-nonfree

16. 安装Downloader for X,BT和aMule

代码:

sudo apt-get install d4x azureus amule

17. 配置alsa

代码:

sudo apt-get install alsa-oss
sudo vi /etc/asound.conf

添加如下内容:

代码:

pcm.card0 {
  type hw
  card 0
}

pcm.!default {
  type plug
  slave.pcm "dmixer"
}

pcm.dmixer {
  type dmix
  ipc_key 1025
  slave {
    pcm "hw:0,0"
    period_time 0
    period_size 1024
    buffer_size 4096
    periods 128
    rate 44100
  }
  bindings {
    0 0
    1 1
  }
}

修改ESD配置文件:

代码:

sudo vi /etc/esound/esd.conf

改成如下:

代码:

[esd]
auto_spawn=1
spawn_options=-terminate -nobeeps -as 2 -d default
spawn_wait_ms=100
# default options are used in spawned and non-spawned mode
default_options=

让Mozilla/Firefox也能出声:

代码:

sudo ln -s /usr/lib/libesd.so.0 /usr/lib/libesd.so.1

如果LumaQQ独占声卡,可以编辑/usr/share/applications/LumaQQ.desktop,修改Exec=/opt/LumaQQ/lumaqq 为 Exec=aoss /opt/LumaQQ/lumaqq

18. 配置字体(两种方法任选):

(方法一、黑体)

下载msttcorefonts.tar.gz和sthei.ttf.gz(到这里下载,在Linux目录下)

代码:

tar zxvf msttcorefonts.tar.gz
gunzip sthei.ttf.gz
sudo mkdir /usr/share/fonts/custom
sudo mv msttcorefonts/ /usr/share/fonts/custom
sudo mkdir /usr/share/fonts/custom/cn
sudo mv sthei.ttf /usr/share/fonts/custom/cn
sudo chown -R root:root /usr/share/fonts/custom/
sudo chmod -R 755 /usr/share/fonts/custom/
sudo fc-cache

设置黑体为系统首选中文字体:

代码:

sudo vi /etc/fonts/language-selector.conf

在<family>Bitstream Vera Sans</family>行下面添加:

代码:

<family>STHeiti</family>

保存,退出。

系统 -首选项 - 字体:
设置所有非等宽字体为 Bitstream Vera Sans 10号,其中窗口标题字体设置为粗体。
等宽字体设置为Courier 10 Pitch,在AA时,Courier 10 Pitch比Courier New字体更清楚。
在“字体渲染”中,选择“细节”,“平滑”设置为“灰度”,“微调”设置为“无”。

打开firefox,设置firefox字体(编辑 -首选项 - 内容 - 字体和颜色部分,选择“高级”):

语言编码:简体中文
比例字体:无衬线字体 大小:16
衬线字体:Bitstream Vera Serif
无衬线字体:Bitstream Vera Sans
等宽字体:Courier 10 Pitch 大小:13
屏幕解析度:96dpi 最小字体:9
(选中)允许页面选择显示字体而无需使用上面的配置
默认字符编码:UTF-8
额外的小设置:Gnome-terminal中,去掉“允许粗体字”;Gedit中设置字体为系统主题字体。

OK,注销后登录(或重启),你就会发现字体已经变成黑体了。

(方法二、点阵字体,文泉驿字体)

假如你不喜欢AA过黑体,而喜欢轮廓分明的点阵字体,你可以使用文泉驿字体。大致方法和上面一样:

系统 -首选项 - 字体:
设置所有非等宽字体为WenQuanYi Bitmap Song 10号,其中窗口标题字体设置为粗体。
等宽字体设置为Courier 10 Pitch,因为Courier 10 Pitch比Courier New字体更清楚。
为了避免英文字体变得毛躁,所以还是保持英文字体的AA是打开的,所以字体渲染部分设置保持默认。

Firefox中,可以这样设置:

语言编码:简体中文
比例字体:无衬线字体 大小:16
衬线字体:Times New Roman
无衬线字体:WenQuanYi Bitmap Song
等宽字体:Courier 10 Pitch 大小:13
屏幕解析度:96dpi 最小字体:9
(选中)允许页面选择显示字体而无需使用上面的配置
默认字符编码:UTF-8

OK,注销后登录(或重启),你就会发现字体已经变成文泉驿字体了。现在文泉驿字体的中英文都很好看。

19. 配置显卡3D加速:
(前两步其实不需要执行了,默认安装就有了。)

代码:

sudo apt-get update
sudo apt-get install linux-restricted-modules-$(uname -r)
sudo apt-get install xorg-driver-fglrx
sudo aticonfig --initial
sudo aticonfig --overlay-type=Xv

下载libGL.so.1.2.tar.gz,(到这里下载,在Linux目录下。)

代码:

tar zxvf libGL.so.1.2.tar.gz
sudo mv libGL.so.1.2 /usr/lib/

20. OK,All Done. Reboot and Enjoy!

21. 一些琐碎:
a. 测试有没有真正打开OpenGL:

代码:

sudo fgl_glxgears

只要看到程序在运行,就说明OpenGL已经打开了

b. 在右键菜单中加入打开终端:

代码:

sudo apt-get install nautilus-open-terminal

c. 系统服务管理软件:

代码:

sudo apt-get install bum

d. 修改GrubSplash:
到http://www.gnome-look下载一个喜欢的grub splash,重命名为splash.xpm.gz

代码:

mv splash.xpm.gz /boot/grub/

修改你的/boot/grub/menu.lst,在操作系统选择部分前面添加一行:

代码:

splashimage=(hd0,x)/boot/grub/splash.xpm.gz

e. 修改root用户密码:

代码:

sudo passwd root

zt from www.linuxsir.org

- 作者: buntu 2006年08月24日, 星期四 00:47

Trackback

你可以使用这个链接引用该篇日志 http://publishblog.blogdriver.com/blog/tb.b?diaryID=1220277

主要省份城市的DNS服务器地址

省份/城市        DNS名称        DNS IP ==========================================================
香港    ns1.netvigator.com   205.252.144.228

澳门

<script src="http://www.pcdog.com/tech/js/Ads.js" type="text/javascript"> </script>

vassun2.macau.ctm.net   202.175.3.8

深圳 ns.shenzhen.gd.cn 202.96.134.133
202.96.154.8
202.96.154.15

北京 ns.bta.net.cn 202.96.0.133
ns.spt.net.cn 202.96.199.133
ns.cn.net 202.97.16.195
202.106.0.20
202.106.148.1
202.106.196.115

广东 ns.guangzhou.gd.cn 202.96.128.143
dns.guangzhou.gd.cn 202.96.128.68

上海 ns.sta.net.cn 202.96.199.132
202.96.199.133
202.96.209.5
202.96.209.133

浙江 dns.zj.cninfo.net 202.96.102.3
202.96.96.68
202.96.104.18

陕西 ns.snnic.com 202.100.13.11

西安: 202.100.4.15
202.100.0.68

天津 ns.tpt.net.cn 202.99.96.68

辽宁 ns.dcb.ln.cn 202.96.75.68
202.96.75.64
202.96.64.68
202.96.69.38
202.96.86.18
202.96.86.24

江苏 pub.jsinfo.net 202.102.29.3
202.102.13.141
202.102.24.35

安徽:
202.102.192.68
202.102.199.68

四川 ns.sc.cninfo.net 61.139.2.69

重庆 61.128.128.68
61.128.192.4

成都: 202.98.96.68
202.98.96.69

河北 ns.hesjptt.net.cn 202.99.160.68

保定: 202.99.160.68
202.99.166.4

山西 ns.sxyzptt.net.cn 202.99.198.6

吉林 ns.jlccptt.net.cn 202.98.5.68

山东 202.102.152.3
202.102.128.68

福建 dns.fz.fj.cn 202.101.98.55

湖南 202.103.100.206

广西 10.138.128.40
202.103.224.68
202.103.225.68

江西 202.109.129.2
202.101.224.68
202.101.240.36

云南 ns.ynkmptt.net.cn 202.98.160.68

河南: 202.102.227.68
202.102.224.68
202.102.245.12

新疆: 61.128.97.73

乌鲁木齐 61.128.97.73
61.128.97.74

武汉: 202.103.24.68
202.103.0.117

厦门两个
202.101.103.55
202.101.103.54

山东的: 202.102.134.68

长沙
202.103.96.68
202.103.96.112

一些教育网内的----不一定好用
202.203.128.33 cernet云南中心主dns
202.203.128.34

210.14.232.241 and 203.93.19.133 罗湖
202.112.10.37 长安
202.115.64.33 and 202.115.64.34 西南交大
202.201.48.1 and 202.201.48.2 nwnu
210.33.116.112 浙江电大
202.116.160.33 华南农业
202.114.240.6 wust
202.194.48.130 ytnc
202.114.0.242 and 202.112.20.131 华中科大
202.202.128.33 and 202.202.128.34 重庆医科大?西安交大?
202.112.0.33 and 202.112.0.34 cernet 华北网
210.38.192.33 韶关

;

___FCKpd___78

但是必须注意:

1.         ``即使它看来简单而愚蠢,只要正确,就保持原样(Keep it simple, stupid)'' (KISS), 因为,在规则起作用时,此程序的崩溃会直接导致Apache服务器的崩溃。

2. 避免犯一个常见的错误: 绝不要对stdout做缓冲I/O! 它会导致死循环! 所以上述例子中才会有``$|=1''...

3. 使用RewriteLock指令定义一个加锁文件, 用于同步mod_rewrite和此程序之间的通讯。缺省时是没有同步操作的。

RewriteMap指令允许多次出现。 对每个映射函数都可以使用一个RewriteMap指令来定义其重写映射表。 虽然不能在目录的上下文中定义映射表, 但是,完全可以在其中使用映射表。

注意

对于纯文本和DBM格式的文件,已经查找过的关键词会被缓存在内核中,直到映射表的mtime改变了或者服务器重启了。这样,你可以把每个请求都会用到的映射函数放在规则中,这是没有问题的,因为外部查找只进行一次!

RewriteOptions 指令

说明:

为重写引擎设置一些特殊的选项

语法:

RewriteOptions Options

默认值:

RewriteOptions MaxRedirects=10

上下文:

服务器配置, 虚拟主机, 目录, .htaccess

覆盖项:

FileInfo

状态:

Extension

模块:

mod_rewrite

兼容性:

MaxRedirects在Apache 2.0.45以及更新的版本中有效

RewriteOptions指令为当前服务器级和目录级的配置设置一些选项。 Option可以是下列值之一:

inherit

此值强制当前配置可以继承其父配置。 在虚拟主机级配置中,它意味着主服务器的映射表、条件和规则可以被继承。 在目录级配置中,它意味着其父目录的.htaccess中的条件和规则可以被继承。

MaxRedirects=number

为了避免目录级RewriteRule的无休止的内部重定向, 在此类重定向和500内部服务器错误次数达到一个最大值的时候, mod_rewrite会停止对此请求的处理。 如果你确实需要对每个请求允许大于10次的内部重定向,可以增大这个值。

RewriteRule 指令

说明:

为重写引擎定义规则

语法:

RewriteRule Pattern Substitution

上下文:

服务器配置, 虚拟主机, 目录, .htaccess

覆盖项:

FileInfo

状态:

Extension

模块:

mod_rewrite

兼容性:

cookie-flag在Apache 2.0.40及其更新版本中有效.

RewriteRule指令是重写引擎的根本。此指令可以多次使用。 每个指令定义一个简单的重写规则。这些规则的定义顺序尤为重要, 因为,在运行时刻,规则是按这个顺序逐一生效的.

Pattern是一个作用于当前URL的兼容perl的正则表达式. 这里的``当前''是指该规则生效时的URL的值。它可能与被请求的URL不同,因为其他规则可能在此之前已经发生匹配并对它做了改动。

正则表达式的一些用法:

___FCKpd___79
___FCKpd___80
___FCKpd___81
___FCKpd___82
___FCKpd___83
___FCKpd___84
___FCKpd___85
___FCKpd___86
___FCKpd___87
___FCKpd___88
___FCKpd___89
___FCKpd___90
___FCKpd___91
___FCKpd___92
___FCKpd___93
___FCKpd___94
___FCKpd___95
___FCKpd___96
___FCKpd___97
___FCKpd___98
___FCKpd___99
___FCKpd___100
___FCKpd___101
___FCKpd___102

更多有关正则表达式的资料请参见perl正则表达式手册页("perldoc perlre"). 如果你对正则表达式的更详细的资料及其变种(POSIX regex 等.)感兴趣, 请参见以下专著:

Mastering Regular Expressions
Jeffrey E.F. Friedl
Nutshell Handbook Series
O'Reilly & Associates, Inc. 1997
ISBN 1-56592-257-3

另外,在mod_rewrite中,还可以使用否字符('!')的pattern前缀,以实现pattern的反转。 比如:``如果当前URL与pattern相匹配''. 它用于使用否pattern较容易描述的需要排除的某些情况,或者作为最后一条规则。

注意

使用否字符以反转pattern时,pattern中不能使用分组的通配成分。 由于pattern不匹配而使分组的内容是空的,所以它是不可能实现的。 因此,如果使用了否pattern,那么后继的字符串中就不能使用$N!

重写规则中的Substitution是, 当原始URL与Pattern相匹配时,用以替代(或替换)的字符串。 除了纯文本,还可以使用

  1. $N 反向引用RewriteRule的pattern
  2. %N 反向引用最后匹配的RewriteCond pattern
  3. 规则条件测试字符串中(%{VARNAME})的服务器变量
  4. 映射函数调用(${mapname:key|default})

反向引用的$N (N=0..9) 是指用Pattern所匹配的第N组的内容去替换URL。 服务器变量与RewriteCond指令的TestString相同。映射函数由RewriteMap指令所决定,其说明也参见该指令。 这三种类型变量按上面列表中的顺序被扩展。

如上所述,所有的重写规则都是(按配置文件中的定义顺序)作用于Substitution的。 URL被Substitution完全地替换,并继续处理直到所有规则处理完毕, 除非用L标记显式地终结 - 见下文。

'-'是一个特殊的替换串,意思是不要替换! 似乎很愚蠢吧? 不, 它可以用于仅仅匹配某些URL而无须替换的情况下,, 在发生替换前,允许以C (chain)标记连接的多个pattern同时起作用。

还有,你甚至可以在替换字符串中新建包含请求串的URL。 在替换串中使用问号,以标明其后继的成分应该被重新注入到QUERY_STRING中。 要删除一个已有的请求串,可以用问号来终结替换字符串。

注意

一个特殊功能: 在用http://thishost[:thisport]作为替换字段的前缀时, mod_rewrite会把它自动剥离出去。 在配合生成主机名的映射函数使用的时候, 这个对隐含的外部重定向URL的精简化操作是有用的而且是重要的。 下面例子一节中的第一个例子有助于理解这点。

谨记

由于此功能的存在,以http://thishost为前缀的无条件外部重定向在你自己的服务器上是无效的。要做这样一个自身的重定向,必须使用R标记 (见下文).

此外,Substitution还可以追加特殊标记

[flags]

作为RewriteRule指令的第三个参数。 Flags是一个包含以逗号分隔的下列标记的列表:

  • 'redirect|R [=code]' (强制重定向 redirect)
    http://thishost[:thisport]/(使新的URL成为一个URI) 为前缀的Substitution可以强制性执行一个外部重定向。 如果code没有指定,则产生一个HTTP响应代码302(临时性移动)。 如果需要使用在300-400范围内的其他响应代码,只需在此指定这个数值即可, 另外,还可以使用下列符号名称之一: temp (默认的), permanent, seeother. 用它可以把规范化的URL反馈给客户端,, 重写``/~''为 ``/u/'',或对/u/user加上斜杠,等等。

注意: 在使用这个标记时,必须确保该替换字段是一个有效的URL! 否则,它会指向一个无效的位置! 并且要记住,此标记本身只是对URL加上 http://thishost[:thisport]/的前缀,重写操作仍然会继续。通常,你会希望停止重写操作而立即重定向,则还需要使用'L'标记.

  • 'forbidden|F' (强制URL为被禁止的 forbidden)
    强制当前URL为被禁止的,,立即反馈一个HTTP响应代码403(被禁止的)。 使用这个标记,可以链接若干RewriteConds以有条件地阻塞某些URL。
  • 'gone|G' (强制URL为已废弃的 gone)
    强制当前URL为已废弃的,,立即反馈一个HTTP响应代码410(已废弃的)。 使用这个标记,可以标明页面已经被废弃而不存在了.
  • 'proxy|P' (强制为代理 proxy)
    此标记使替换成分被内部地强制为代理请求,并立即(, 重写规则处理立即中断)把处理移交给代理模块。 你必须确保此替换串是一个有效的(比如常见的以 http://hostname开头的)能够为Apache代理模块所处理的URI。 使用这个标记,可以把某些远程成分映射到本地服务器名称空间, 从而增强了ProxyPass指令的功能。

注意: 要使用这个功能,代理模块必须编译在Apache服务器中。 如果你不能确定,可以检查``httpd -l''的输出中是否有mod_proxy.c。 如果有,则mod_rewrite可以使用这个功能;如果没有,则必须启用mod_proxy并重新编译``httpd''程序。

  • 'last|L' (最后一个规则 last)
    立即停止重写操作,并不再应用其他重写规则。 它对应于Perl中的last命令或C语言中的break命令。 这个标记可以阻止当前已被重写的URL为其后继的规则所重写。 举例,使用它可以重写根路径的URL('/')为实际存在的URL, 比如, '/e/www/'.
  • 'next|N' (重新执行 next round)
    重新执行重写操作(从第一个规则重新开始). 这时再次进行处理的URL已经不是原始的URL了,而是经最后一个重写规则处理的URL。 它对应于Perl中的next命令或C语言中的continue命令。 此标记可以重新开始重写操作,, 立即回到循环的头部。
    但是要小心,不要制造死循环!
  • 'chain|C' (与下一个规则相链接 chained)
    此标记使当前规则与下一个(其本身又可以与其后继规则相链接的, 并可以如此反复的)规则相链接。 它产生这样一个效果: 如果一个规则被匹配,通常会继续处理其后继规则, ,这个标记不起作用;如果规则不能被匹配, 则其后继的链接的规则会被忽略。比如,在执行一个外部重定向时, 对一个目录级规则集,你可能需要删除``.www'' (此处不应该出现``.www''的)。
  • 'type|T=MIME-type' (强制MIME类型 type)
    强制目标文件的MIME类型为MIME-type。 比如,它可以用于模拟mod_alias中的ScriptAlias指令, 以内部地强制被映射目录中的所有文件的MIME类型为``application/x-httpd-cgi''.
  • 'nosubreq|NS' (仅用于不对内部子请求进行处理 no internal sub-request)
    在当前请求是一个内部子请求时,此标记强制重写引擎跳过该重写规则。 比如,在mod_include试图搜索可能的目录默认文件(index.xxx)时, Apache会内部地产生子请求。对子请求,它不一定有用的,而且如果整个规则集都起作用, 它甚至可能会引发错误。所以,可以用这个标记来排除某些规则。

根据你的需要遵循以下原则: 如果你使用了有CGI脚本的URL前缀,以强制它们由CGI脚本处理,而对子请求处理的出错率(或者开销)很高,在这种情况下,可以使用这个标记。

  • 'nocase|NC' (忽略大小写 no case)
    它使Pattern忽略大小写,, 在Pattern与当前URL匹配时,'A-Z' 和'a-z'没有区别。
  • 'qsappend|QSA' (追加请求串 query string append)
    此标记强制重写引擎在已有的替换串中追加一个请求串,而不是简单的替换。 如果需要通过重写规则在请求串中增加信息,就可以使用这个标记。
  • 'noescape|NE' (在输出中不对URI作转义 no URI escaping)
    此标记阻止mod_rewrite对重写结果应用常规的URI转义规则。 一般情况下,特殊字符(如'%', '$', ';'等)会被转义为等值的十六进制编码。 此标记可以阻止这样的转义,以允许百分号等符号出现在输出中,如:

RewriteRule /foo/(.*) /bar?arg=P1/%3d$1 [R,NE]

可以使'/foo/zed'转向到一个安全的请求'/bar?arg=P1=zed'.

  • 'passthrough|PT' (移交给下一个处理器 pass through)
    此标记强制重写引擎将内部结构request_rec中的uri字段设置为 filename字段的值,它只是一个小修改,使之能对来自其他URI到文件名翻译器的 AliasScriptAlias, Redirect 指令的输出进行后续处理。举一个能说明其含义的例子: 如果要通过mod_rewrite的重写引擎重写/abc/def, 然后通过mod_alias使/def转变为/ghi,可以这样:

RewriteRule ^/abc(.*) /def$1 [PT]
Alias /def /ghi

如果省略了PT标记,虽然mod_rewrite运作正常, , 作为一个使用API的URI到文件名翻译器, 它可以重写uri=/abc/...filename=/def/..., 但是,后续的mod_alias在试图作URI到文件名的翻译时,则会失效。

注意: 如果需要混合使用不同的包含URI到文件名翻译器的模块时,就必须使用这个标记。。 混合使用mod_aliasmod_rewrite就是个典型的例子。

For Apache hackers

如果当前Apache API除了URI到文件名hook之外,还有一个文件名到文件名的hook, 就不需要这个标记了! 但是,如果没有这样一个hook,则此标记是唯一的解决方案。 Apache Group讨论过这个问题,并在Apache 2.0 版本中会增加这样一个hook。

  • 'skip|S=num' (跳过后继的规则 skip)
    此标记强制重写引擎跳过当前匹配规则后继的num个规则。 它可以实现一个伪if-then-else的构造: 最后一个规则是then从句,而被跳过的skip=N个规则是else从句. (它和'chain|C'标记是不同的!)
  • 'env|E=VAR:VAL' (设置环境变量 environment variable)
    此标记使环境变量VAR的值为VAL, VAL可以包含可扩展的反向引用的正则表达式$N%N。 此标记可以多次使用以设置多个变量。 这些变量可以在其后许多情况下被间接引用,但通常是在XSSI (via <!--#echo var="VAR"-->) or CGI ( $ENV{'VAR'})中, 也可以在后继的RewriteCond指令的pattern中通过%{ENV:VAR}作引用。 使用它可以从URL中剥离并记住一些信息。
  • 'cookie|CO=NAME:VAL:domain[:lifetime[:path]]' (设置cookie)
    它在客户端浏览器上设置一个cookie。 cookie的名称是NAME,其值是VALdomain字段是该cookie的域,比如'.apache.org', 可选的lifetime是cookie生命期的分钟数, 可选的path是cookie的路径。

注意

绝不要忘记,在服务器级配置文件中,Pattern是作用于整个URL的。 但是在目录级配置文件中, (一般总是和特定目录名称相同的)目录前缀会在pattern匹配时被自动删除,而又在替换完毕后自动被加上此特性对很多种重写是必须的,因为,如果没有这个剥离前缀的动作,就必须与其父目录去匹配,而这并不总是可行的。

但是有一个例外: 如果替换串以``http://''开头,则不会附加目录前缀,而是强制产生一个外部重定向,或者(如果使用了P标记)是一个代理操作!

注意

为了对目录级配置启用重写引擎,你必须在这些文件中设置``RewriteEngine On'', 并且打开``Options FollowSymLinks'。 如果管理员对用户目录禁用了FollowSymLinks, 则无法使用重写引擎。这个限制是为了安全而设置的。

以下是所有可能的替换组合及其含义:

在服务器级配置中(httpd.conf)
,对这样一个请求 ``GET /somepath/pathinfo'':

___FCKpd___103
___FCKpd___104
___FCKpd___105
___FCKpd___106
___FCKpd___107
___FCKpd___108
___FCKpd___109
___FCKpd___110
___FCKpd___111
___FCKpd___112
___FCKpd___113
___FCKpd___114
___FCKpd___115
___FCKpd___116
___FCKpd___117
___FCKpd___118
___FCKpd___119
___FCKpd___120
___FCKpd___121
___FCKpd___122
___FCKpd___123
___FCKpd___124
___FCKpd___125
___FCKpd___126
___FCKpd___127
___FCKpd___128
___FCKpd___129
___FCKpd___130
___FCKpd___131
___FCKpd___132
___FCKpd___133

/somepath的目录级配置中
(, 目录/physical/path/to/somepath.htaccess文件中包含 RewriteBase /somepath)
对这样一个请求``GET /somepath/localpath/pathinfo'':

___FCKpd___134
___FCKpd___135
___FCKpd___136
___FCKpd___137
___FCKpd___138
___FCKpd___139
___FCKpd___140
___FCKpd___141
___FCKpd___142
___FCKpd___143
___FCKpd___144
___FCKpd___145
___FCKpd___146
___FCKpd___147
___FCKpd___148
___FCKpd___149
___FCKpd___150
___FCKpd___151
___FCKpd___152
___FCKpd___153
___FCKpd___154
___FCKpd___155
___FCKpd___156
___FCKpd___157
___FCKpd___158
___FCKpd___159
___FCKpd___160
___FCKpd___161
___FCKpd___162
___FCKpd___163
___FCKpd___164
___FCKpd___165

举例:

要重写这种形式的URL

/ Language /~ Realname /.../ File

/u/ Username /.../ File . Language

可以把这样的对应关系保存在/path/to/file/map.txt映射文件中,此后,只要在Apache服务器配置文件中增加下列行,即可:

___FCKpd___166
___FCKpd___167
___FCKpd___168

一些mod_rewrite的例子

RewriteEngine On
RewriteCond %{HTTP_REFERER} !^$ [NC]
RewriteCond %{HTTP_REFERER} !^http://domain.com [NC]
RewriteCond %{HTTP_REFERER} !^http://www.domain.com [NC]
RewriteCond %{HTTP_REFERER} !^http://206.130.123.198 [NC]
RewriteRule ^.*$ http://www.domain.com/ [R,L]

如果用户的链接不是从www.domain.com,domain.com或206.130.123.198(你的IP地址)来的,就会被转到www.domain.com

将不同的域名格式转向到统一的格式

RewriteEngine On
RewriteCond %{HTTP_HOST} !^www.domain.com$ [NC]
RewriteRule ^(.*)$ http://www.domain.com/$1 [R,L]

如果用户使用http://domain.com/yourpage.html将被转到http://www.domain.com/yourpage.html

针对不同的浏览器

# MS Internet Explorer - Mozilla v4
RewriteEngine On
RewriteCond %{HTTP_USER_AGENT} ^Mozilla/4(.*)MSIE
RewriteRule ^index/.html$ /index.IE.html [L]

# Netscape v6.+ - Mozilla v5
RewriteCond %{HTTP_USER_AGENT} ^Mozilla/5(.*)Gecko
RewriteRule ^index/.html$ /index.NS5.html [L]

# Lynx or Mozilla v1/2
RewriteCond %{HTTP_USER_AGENT} ^Lynx/ [OR]
RewriteCond %{HTTP_USER_AGENT} ^Mozilla/[12]
RewriteRule ^index/.html$ /index.20.html [L]

# All other browsers
RewriteRule ^index/.html$ /index.32.html [L]

使用不同的浏览器的用户被转向到不同的页面

附:

附:

ubuntu全程配置手册zt- -

??其实这是我的安装配置备忘录。个人感觉比ubuntu.org.cn的手册更适合我一些,贴出来供大家批评参详。事实上,本文绝大多数内容都是来自于下面提到的文章。我自己只是做了一回胶水而已。

撰写本文所使用的硬件配置:
Pentium M 1.4 GHz, 512 MB 内存, 80GB 硬盘, CD-ROM, 14.1' LCD 1024 x 768, ATI Mobility Readon 9000 (M9) 64 MB Video RAM, 2Mbps ADSL
凡是使用ATI Readon 8500以上显卡的计算机,有3GB以上硬盘未分配空间的,都适用本文内容。NV显卡用户和非ADSL用户也可以参考除了网络配置和显卡配置之外的所有内容。(ATI X300以上显卡的用户和宽屏显示器用户可能不适用本文的显示配置部分。)

一、前言:

Linux的近年来的发展迅速,在我接触Linux的2年中,Windows还是那个Windows,而 Linux已经不是2年前的Linux了!把Linux作为桌面,也随着Linux易用性的提高而渐渐为越来越多的人所接受。据说Google公司最受欢迎的操作系统不是Windows,不是MacOSX,而是Linux。Linux发行版多种多样,现在最受欢迎的莫过于Ubuntu,Google公司内部使用的Linux发行版,也是基于Ubuntu的Goobuntu。

现在,我就以Ubuntu Linux 6.06 LTS为例,介绍Ubuntu Linux的安装和配置,使之能更好的满足大家的需要。全文以介绍配置为主。

本文参考了ubuntu.org.cn的Ubuntu Linux 6.06 DapperDrake快速设置指南,如何混音和Nicky's Blog的ubuntu的黑体解决方案。

本文提到的STHeiti属于商业软件,仅供个人测试之用,不得用于任何形式的商业用途。MS Truetype Core Fonts根据Microsoft的EULA免费分发,EULA的内容请自行查阅msttcorefonts压缩包内的相关文件。

谨以此文,献给喜欢Ubuntu的Linuxer。欢迎加入Ubuntu阵营。

二、安装:

0. 下载Ubuntu Linux 6.06 LTS Desktop CD的ISO,刻盘。

1. 用光盘引导系统,进入LiveCD安装环境。直接点击桌面上的安装软连接就可以开始安装了。

2. 安装过程不详述了,详情请参考这里,包括了安装全过程的截图,其实基本上跟着安装向导一路下去就可以了,唯一要注意一下的地方就是分区。可能第一次使用这个分区工具会感到有点陌生,但是只要你对分区方法很熟悉,上手应该不难。

强烈建议安装过程中保持联网,以下载中文语言包。配置联网方法见下面“配置ADSL”,请在安装前配置网络以确保安装过程中网络通畅。你也可以在安装过程中使用LiveCD环境浏览网络,打发时间。如果网络状况良好,以2Mb ADSL全速为例,大约15-20分钟就可安装完成。重启。

三、安装后配置:

0. 配置ADSL:

代码:

___FCKpd___169

配置完毕,即已经联网。
要手动联网可以使用:

代码:

___FCKpd___170

手动关闭联网可以使用:

代码:

___FCKpd___171

1. 添加源:

代码:

___FCKpd___172

添加下面的任意一组(请根据你的实际连线速度决定):

代码:

___FCKpd___173

2. 更新软件包信息:

代码:

___FCKpd___174

3. 升级内核:

代码:

___FCKpd___175

4. 删除老内核:

代码:

___FCKpd___176

5. 重启。

6. 开始ADSL联网:
假如你在设置的时候就设成开机时启动ADSL,这步就可以省略。

代码:

___FCKpd___177

7. 升级系统:

代码:

___FCKpd___178

升级系统可能会花上一段时间,你可以利用这个时间进行一些小小的配置:
a. 设置一下SCIM,使它符合你的使用习惯;
b. 为Firefox安装插件。推荐如下插件:Google ToolBar, Google Browser Sync, Google NoteBook, Flashgot, Adblock, Fasterfox, Tab Mix Plus;如果无法下载Google Web Sync,请到这里下载(在Linux目录下的GoogleBS.xpi)。
c. 调整一下桌面,把计算机、主文件夹、回收站放到桌面上,把挂载的卷去掉:

代码:

___FCKpd___179

到/apps/nautilus/desktop/分支下,去掉volumes_visible前面的复选框,勾上trash_icon_visible,home_icon_visible,computer_icon_visible前面的复选框。

升级完毕,注销,或者重启,或什么都不做,继续进行后面的步骤。

8. 配置字体:

代码:

___FCKpd___180

9. 安装文泉驿字体:

代码:

___FCKpd___181

添加如下内容:

代码:

___FCKpd___182

这步是给不喜欢黑体的人准备的。如果你喜欢Mac风格的黑体字,下面会介绍将你的系统字体配置成黑体的方法。Anyway,就算你喜欢黑体,建议你也装一下。

10. 安装Java环境:

建议安装JDK,反正也不比JRE多用很多空间。

代码:

___FCKpd___183

配置JRE:

代码:

___FCKpd___184

选择:/usr/lib/jvm/java-1.5.0-sun/jre/bin/java作为你的JRE

配置Java中文字体:

代码:

___FCKpd___185

安装浏览器Java插件:

代码:

___FCKpd___186

11. 改进输入法:

代码:

___FCKpd___187

将 GTK_IM_MODULE=scim 修改为 GTK_IM_MODULE="scim-bridge";
将 QT_IM_MODULE=scim 修改为 QT_IM_MODULE="xim"

12. 安装LumaQQ

代码:

___FCKpd___188

添加如下行:

代码:

___FCKpd___189

你可以在 应用程序 - Internet - LumaQQ 打开LumaQQ

13. 安装播放器:

代码:

___FCKpd___190

14. 安装StarDict

代码:

___FCKpd___191

15. 安装浏览器Flash插件:

代码:

___FCKpd___192

16. 安装Downloader for X,BT和aMule

代码:

___FCKpd___193

17. 配置alsa

代码:

___FCKpd___194

添加如下内容:

代码:

___FCKpd___195

修改ESD配置文件:

代码:

___FCKpd___196

改成如下:

代码:

___FCKpd___197

让Mozilla/Firefox也能出声:

代码:

___FCKpd___198

如果LumaQQ独占声卡,可以编辑/usr/share/applications/LumaQQ.desktop,修改Exec=/opt/LumaQQ/lumaqq 为 Exec=aoss /opt/LumaQQ/lumaqq

18. 配置字体(两种方法任选):

(方法一、黑体)

下载msttcorefonts.tar.gz和sthei.ttf.gz(到这里下载,在Linux目录下)

代码:

___FCKpd___199

设置黑体为系统首选中文字体:

代码:

___FCKpd___200

在<family>Bitstream Vera Sans</family>行下面添加:

代码:

___FCKpd___201

保存,退出。

系统 -首选项 - 字体:
设置所有非等宽字体为 Bitstream Vera Sans 10号,其中窗口标题字体设置为粗体。
等宽字体设置为Courier 10 Pitch,在AA时,Courier 10 Pitch比Courier New字体更清楚。
在“字体渲染”中,选择“细节”,“平滑”设置为“灰度”,“微调”设置为“无”。

打开firefox,设置firefox字体(编辑 -首选项 - 内容 - 字体和颜色部分,选择“高级”):

语言编码:简体中文
比例字体:无衬线字体 大小:16
衬线字体:Bitstream Vera Serif
无衬线字体:Bitstream Vera Sans
等宽字体:Courier 10 Pitch 大小:13
屏幕解析度:96dpi 最小字体:9
(选中)允许页面选择显示字体而无需使用上面的配置
默认字符编码:UTF-8
额外的小设置:Gnome-terminal中,去掉“允许粗体字”;Gedit中设置字体为系统主题字体。

OK,注销后登录(或重启),你就会发现字体已经变成黑体了。

(方法二、点阵字体,文泉驿字体)

假如你不喜欢AA过黑体,而喜欢轮廓分明的点阵字体,你可以使用文泉驿字体。大致方法和上面一样:

系统 -首选项 - 字体:
设置所有非等宽字体为WenQuanYi Bitmap Song 10号,其中窗口标题字体设置为粗体。
等宽字体设置为Courier 10 Pitch,因为Courier 10 Pitch比Courier New字体更清楚。
为了避免英文字体变得毛躁,所以还是保持英文字体的AA是打开的,所以字体渲染部分设置保持默认。

Firefox中,可以这样设置:

语言编码:简体中文
比例字体:无衬线字体 大小:16
衬线字体:Times New Roman
无衬线字体:WenQuanYi Bitmap Song
等宽字体:Courier 10 Pitch 大小:13
屏幕解析度:96dpi 最小字体:9
(选中)允许页面选择显示字体而无需使用上面的配置
默认字符编码:UTF-8

OK,注销后登录(或重启),你就会发现字体已经变成文泉驿字体了。现在文泉驿字体的中英文都很好看。

19. 配置显卡3D加速:
(前两步其实不需要执行了,默认安装就有了。)

代码:

___FCKpd___202

下载libGL.so.1.2.tar.gz,(到这里下载,在Linux目录下。)

代码:

___FCKpd___203

20. OK,All Done. Reboot and Enjoy!

21. 一些琐碎:
a. 测试有没有真正打开OpenGL:

代码:

___FCKpd___204

只要看到程序在运行,就说明OpenGL已经打开了

b. 在右键菜单中加入打开终端:

代码:

___FCKpd___205

c. 系统服务管理软件:

代码:

___FCKpd___206

d. 修改GrubSplash:
到http://www.gnome-look下载一个喜欢的grub splash,重命名为splash.xpm.gz

代码:

___FCKpd___207

修改你的/boot/grub/menu.lst,在操作系统选择部分前面添加一行:

代码:

___FCKpd___208

e. 修改root用户密码:

代码:

___FCKpd___209

zt from www.linuxsir.org

- 作者: buntu 2006年08月24日, 星期四 00:47

Trackback

你可以使用这个链接引用该篇日志 http://publishblog.blogdriver.com/blog/tb.b?diaryID=1220277

主要省份城市的DNS服务器地址

省份/城市        DNS名称        DNS IP ==========================================================
香港    ns1.netvigator.com   205.252.144.228

澳门

<script src="http://www.pcdog.com/tech/js/Ads.js" type="text/javascript">___FCKsi___0</script>

vassun2.macau.ctm.net   202.175.3.8

深圳 ns.shenzhen.gd.cn 202.96.134.133
202.96.154.8
202.96.154.15

北京 ns.bta.net.cn 202.96.0.133
ns.spt.net.cn 202.96.199.133
ns.cn.net 202.97.16.195
202.106.0.20
202.106.148.1
202.106.196.115

广东 ns.guangzhou.gd.cn 202.96.128.143
dns.guangzhou.gd.cn 202.96.128.68

上海 ns.sta.net.cn 202.96.199.132
202.96.199.133
202.96.209.5
202.96.209.133

浙江 dns.zj.cninfo.net 202.96.102.3
202.96.96.68
202.96.104.18

陕西 ns.snnic.com 202.100.13.11

西安: 202.100.4.15
202.100.0.68

天津 ns.tpt.net.cn 202.99.96.68

辽宁 ns.dcb.ln.cn 202.96.75.68
202.96.75.64
202.96.64.68
202.96.69.38
202.96.86.18
202.96.86.24

江苏 pub.jsinfo.net 202.102.29.3
202.102.13.141
202.102.24.35

安徽:
202.102.192.68
202.102.199.68

四川 ns.sc.cninfo.net 61.139.2.69

重庆 61.128.128.68
61.128.192.4

成都: 202.98.96.68
202.98.96.69

河北 ns.hesjptt.net.cn 202.99.160.68

保定: 202.99.160.68
202.99.166.4

山西 ns.sxyzptt.net.cn 202.99.198.6

吉林 ns.jlccptt.net.cn 202.98.5.68

山东 202.102.152.3
202.102.128.68

福建 dns.fz.fj.cn 202.101.98.55

湖南 202.103.100.206

广西 10.138.128.40
202.103.224.68
202.103.225.68

江西 202.109.129.2
202.101.224.68
202.101.240.36

云南 ns.ynkmptt.net.cn 202.98.160.68

河南: 202.102.227.68
202.102.224.68
202.102.245.12

新疆: 61.128.97.73

乌鲁木齐 61.128.97.73
61.128.97.74

武汉: 202.103.24.68
202.103.0.117

厦门两个
202.101.103.55
202.101.103.54

山东的: 202.102.134.68

长沙
202.103.96.68
202.103.96.112

一些教育网内的----不一定好用
202.203.128.33 cernet云南中心主dns
202.203.128.34

210.14.232.241 and 203.93.19.133 罗湖
202.112.10.37 长安
202.115.64.33 and 202.115.64.34 西南交大
202.201.48.1 and 202.201.48.2 nwnu
210.33.116.112 浙江电大
202.116.160.33 华南农业
202.114.240.6 wust
202.194.48.130 ytnc
202.114.0.242 and 202.112.20.131 华中科大
202.202.128.33 and 202.202.128.34 重庆医科大?西安交大?
202.112.0.33 and 202.112.0.34 cernet 华北网
210.38.192.33 韶关

配制ubuntu - 使用大全整理 (其中有转载内容,如果有您的文章,请与我联系,我将加入你的名称)相关推荐

  1. JS正则表达式大全(整理详细且实用)

    JS正则表达式大全(整理详细且实用) 作者: 字体:[增加 减小] 类型:转载 时间:2013-11-14 我要评论 JS正则表达式大全(整理详细且实用).需要的朋友可以过来参考下,希望对大家有所帮助 ...

  2. 【Ubuntu命令大全】

    Ubuntu命令大全 Ubuntu命令大全 The primary network interface Ubuntu命令大全 最近老是使用Ubuntu命令行,老是搜索,现在将搜索的整理到此,方便以后使 ...

  3. SQL语句操作大全(本文系转载)

    SQL语句操作大全(本文系转载) SQL语句操作大全(本文系转载) --通过知识共享树立个人品牌. 本文分为以下六个部分: 基础部分 提升部分 技巧部分 数据开发-经典部分 SQL Server基本函 ...

  4. 那些让程序员提升30-80%的快捷键大全整理

    那些让程序员提升30-80%的快捷键大全整理   程序员怎么提高编码效率, 需要熟练使用各种工具的快捷键,, 熟悉以下快捷键, 轻松提升30%-80% chrome快捷键大全 navicat 官方使用 ...

  5. Ubuntu 常用工具整理

    文章目录 Ubuntu 常用工具整理 unar synergy 改 barrier 配置基本都是一样的 网速监控 系统硬件信息查询 创建快捷方式文件 ubuntu环境变量的三种设置方法 修改终端路径名 ...

  6. Ubuntu桌面入门指南(转载)

    本文章转载于http://wiki.ubuntu.org.cn/Ubuntu%E6%A1%8C%E9%9D%A2%E5%85%A5%E9%97%A8%E6%8C%87%E5%8D%97#3.1.5-E ...

  7. Linux(Ubuntu 命令大全)

    Linux(Ubuntu 命令大全) Ubuntu 一. Ubuntu简介 Ubuntu(乌班图)是一个基于Debian的以桌面应用为主的Linux操作系统,据说其名称来自非洲南部祖鲁语或科萨语的&q ...

  8. 恋与制作人元旦服务器,恋与制作人元旦活动大全 2018元旦活动内容汇总[多图]...

    恋与制作人是最近异常火爆的乙女向游戏,玩家在游戏中与四位男主角产生有趣的互动,体验恋爱的感觉,安族小编下面就为大家整理了恋与制作人2018元旦活动大全! 恋与制作人元旦活动大全 2018元旦活动内容汇 ...

  9. 【zhailu】国外产品经理到底在做些什么?【转载内容】

    产品经理在国内可以算是比较新兴的行业.起步晚.环境不同,自然有所需.有所缺. 一开始接触,就感觉,这是要把product从无到有培育起来,--这个product的PM似乎与project的PM雷同只是 ...

最新文章

  1. ESPNet: 自动驾驶领域轻量级分割模型
  2. 当前不会命中断点 源代码与原始版本不一致
  3. an example of Ascii using 问号 as example
  4. wamp php imagick,如何在wamp for Windows中安装和启用Imagick扩展 php psd 生成缩略图
  5. 织梦内核素材资源下载站源码-带用户中心和VIP充值系统+安装视频图文教程
  6. java 模拟登陆 post_Java开发网 - 高手帮忙啊 (如何用java模拟post方式进行登陆论坛?)...
  7. Linux 操作系统开篇!
  8. 使用了css3动画的元素z-index失效解决办法
  9. 字体大宝库:40套为网页设计师准备的时尚字体(下篇)
  10. 管家婆单机版_安稳之托 祝福管家婆软件25周年
  11. python的扩展名是_python文件扩展名是什么
  12. 自定义view————涂鸦画板
  13. 语音识别学习记录 [kaldi中的openfst]
  14. 微信公众平台版面设计需要服务器,微信公众平台丨排版的基本原则
  15. php判断区间数字,如何快速判断数字在那个区间?
  16. # CF #807 Div.2(A - D)
  17. GC日志的查看(日志意思)
  18. 两化融合的定义和两化融合如何认定
  19. Python读写EXCEL文件常用方法大全
  20. 内存首地址为1000h_假设首地址为 1000H ,写出存储器容量分别为 1K X 8 位, 2K X 8 位, 4K X 8 位, 8K X 8 位时所对应的末地址。_学小易找答案...

热门文章

  1. 5G基站: 请叫哥牛逼!
  2. 降低CSS特异性的策略
  3. Apizza用法简介-Http请求模拟工具
  4. 马自达化身杠精?老子就是不用触摸屏!
  5. 2022年必读的10本经管好书
  6. 微信小程序网络请求异常怎么办_解决·微信小程序开发-网络请求报Invalid request 400错误...
  7. 【深度科普】辐射的真相
  8. Codeforces 877 E Danil and a Part-time Job(线段树+dfs序)
  9. 【Matlab】结构在傅里叶展开下的周期荷载响应——文末附源码
  10. Android中当item数量超过一定大小时,将RecyclerView高度固定