欢迎访问 生活随笔!

尊龙游戏旗舰厅官网

当前位置: 尊龙游戏旗舰厅官网 > 运维知识 > ubuntu >内容正文

ubuntu

配制ubuntu -尊龙游戏旗舰厅官网

发布时间:2023/12/15 ubuntu 137 豆豆
尊龙游戏旗舰厅官网 收集整理的这篇文章主要介绍了 配制ubuntu - 使用大全整理 (其中有转载内容,如果有您的文章,请与我联系,我将加入你的名称) 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

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

apt-cache showpkg

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
就可以将时间调整为1011日凌晨155

比如将系统时间设定成200588日的命令如下。

#date -s 2005/08/08
将系统时间设定成下午8120秒的命令如下。
#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,wx),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
用户:系统唯一,是真实的,可以登录系统,可以操作系统任何文件和命令,拥有最高权限;
虚拟用户:这类用户也被称之为伪用户或假用户,与真实用户区分开来,这类用户不具有登录系统的能力,但却是系统运行不可缺少的用户,比如bindaemonadmftpmail等;这类用户都系统自身拥有的,而非后来添加的,当然我们也可以添加虚拟用户;
普通真实用户:这类用户能登录系统,但只能操作自己家目录的内容;权限有限;这类用户都是系统管理员自行添加的;

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

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


1
、用户(user)的概念;

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

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

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

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

一对一:某个用户可以是某个组的唯一成员;
多对一:多个用户可以是某个唯一的组的成员,不归属其它用户组;比如beinanlinuxsir两个用户只归属于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
注:查看用户的uidgid及所归属的用户组
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
文件是当创建用户时的一些规划,比如创建用户时,是否需要家目录,uidgid的范围;用户的期限等等,这个文件是可以通过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
注:最小uid500 ,也就是说添加用户时,uid 是从500开始的;
uid_max 60000
注:最大uid60000
#
# 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置为该文件的文件属主。方式“us”设置文件的用户id位,“gs”设置组id位。

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

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

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

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

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

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

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

2. 数字设定法

  我们必须首先了解用数字表示的属性的含义:0表示没有权限,1表示可执行权限,2表示可写权限,4表示可读权限,然后将其相加。所以数字属性的格式应为3个从07的八进制数,其顺序是(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或者脚本(shellperl或者特定的配置语言)。使用这些工具能够简化iptables的配置减少配置的错误。关于iptables的知识请参考rusty russell写的linux iptables howto



使用命令行配置iptables的困难


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

我们看一下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的优点,尤其是netfilteripchains具有的优势。



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


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是一个大约30kshell脚本。目前,主要适用于基于主机的保护,因为一些基于网络的选项正在开发中。这个脚本的界面(例如:给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如下规则:允许向外的sshdns报文通过;阻塞所有的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(kde1kde2两个版本)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蠕虫是中国人写的。(读到这里,您可能会感到莫名其妙,已经抄起鸡蛋、西红柿了,但是请相信:我没有发烧,绝对是有感而发,通过这种方式表达自己的愤怒而已)'

 

说明:

提供了一个基于规则的实时转向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)配置都有效, 还可以生成最终请求串。此重写操作的结果可以是内部子处理,也可以是外部请求的转向,甚至还可以是内部代理处理。

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

此模块从19977月起为apache group所专用,由以下这些人创建于19964

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唯一的实现方法。 记住以下两点,会有助于更好地理解:

  • 虽然mod_rewrite可以重写urlurl,重写url为文件名, 甚至重写文件名为文件名,但是目前api只提供一个url到文件名的hook apache 2.0 中,增加了两个丢失hook以使处理过程更清晰。 但是,这样做并没有给用户带来麻烦,只需记住这样一个事实: apache借助url到文件名的hook而比api设计的目标功能更强大。
  • 难以置信的是,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指令。 条件之后的重写规则仅在当前uripattern匹配并且符合这些条件的时候才会起作用。

    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

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

    特别注意事项:

  • script_filenamerequest_filename包含的值是相同的,, apache服务器的内部request_rec结构中的filename字段。 第一个其实就是大家都知道的cgi变量名,而第二个则是( 包含了request_rec结构中的uri字段的)request_uri的一个副本,
  • 特殊形式: %{env:variable} 其中的variable可以是任何环境变量。 它是通过查找apache内部结构得到的, 或者(如果没找到的话)是由apache服务器进程通过getenv()得到的。
  • 特殊形式: %{http:header} 其中的header可以是任何http mime头的名称。 它是通过查找http请求得到的。比如: %{http:proxy-connection}就是http ``proxy-connection:''的值.
  • 特殊形式 %{la-u:variable} 它是一个预设的值, variable的最终值在执行一个内部的(基于url)子请求后决定。 在重写需要使用一个尚未有效的但是会在之后的api程序段中设置的变量的时候,就会使用这个方法。 比如,需要在服务器级配置(httpd.conf文件)中重写remote_user变量, 则,必须使用%{la-u:remote_user},因为此变量是由认证程序段设置的, 而这个程序段是在mod_rewrite所在的url转译程序段之后才执行的。 但是,因为mod_rewrite是通过api修正程序段来实现目录级(.htaccess file)配置的, 而这个程序段在认证程序段之前就执行了,所以用%{remote_user}就可以了。
  • 特殊形式: %{la-f:variable} 它是一个预设的值, variable的最终值在执行一个内部的(基于文件名的)子请求后决定。 大多数情况下和上述的la-u是相同的.
  • condpattern是条件pattern, , 一个应用于当前实例teststring的正则表达式, , teststring将会被计算然后与condpattern匹配.

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

  • 可以在pattern串中使用'!' 字符(惊叹号)来实现匹配的反转
  • condpatterns有若干特殊的变种。除了正则表达式的标准用法,还有下列用法:
    • '' (词典顺序的小于)
      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服务器速度急剧下降! 重写日志使用大于2level值只用于调试!

    举例

    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是一个纯文本文件,包含空行、注释行(以字符'#'打头), 以及每行一个的替换对,如下。

    matchingkeysubstvalue

    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, ndbmdb,由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 (�, 'ndbm_file', $dbmmap,o_rdwr|o_trunc|o_creat, 0644)   or die "couldn't create $dbmmap!/n";   while () {   next if (/^/s*#/ or /^/s*$/);   $db{$1} = $2 if (/^/s*(/s )/s (/s )/); }   untie �; 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 () {     # ...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

    apt-cache showpkg

    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
    就可以将时间调整为1011日凌晨155

    比如将系统时间设定成200588日的命令如下。

    #date -s 2005/08/08
    将系统时间设定成下午8120秒的命令如下。
    #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,wx),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
    用户:系统唯一,是真实的,可以登录系统,可以操作系统任何文件和命令,拥有最高权限;
    虚拟用户:这类用户也被称之为伪用户或假用户,与真实用户区分开来,这类用户不具有登录系统的能力,但却是系统运行不可缺少的用户,比如bindaemonadmftpmail等;这类用户都系统自身拥有的,而非后来添加的,当然我们也可以添加虚拟用户;
    普通真实用户:这类用户能登录系统,但只能操作自己家目录的内容;权限有限;这类用户都是系统管理员自行添加的;

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

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


    1
    、用户(user)的概念;

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

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

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

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

    一对一:某个用户可以是某个组的唯一成员;
    多对一:多个用户可以是某个唯一的组的成员,不归属其它用户组;比如beinanlinuxsir两个用户只归属于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
    注:查看用户的uidgid及所归属的用户组
    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
    文件是当创建用户时的一些规划,比如创建用户时,是否需要家目录,uidgid的范围;用户的期限等等,这个文件是可以通过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
    注:最小uid500 ,也就是说添加用户时,uid 是从500开始的;
    uid_max 60000
    注:最大uid60000
    #
    # 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置为该文件的文件属主。方式“us”设置文件的用户id位,“gs”设置组id位。

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

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

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

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

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

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

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

    2. 数字设定法

      我们必须首先了解用数字表示的属性的含义:0表示没有权限,1表示可执行权限,2表示可写权限,4表示可读权限,然后将其相加。所以数字属性的格式应为3个从07的八进制数,其顺序是(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或者脚本(shellperl或者特定的配置语言)。使用这些工具能够简化iptables的配置减少配置的错误。关于iptables的知识请参考rusty russell写的linux iptables howto



    使用命令行配置iptables的困难


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

    我们看一下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的优点,尤其是netfilteripchains具有的优势。



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


    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是一个大约30kshell脚本。目前,主要适用于基于主机的保护,因为一些基于网络的选项正在开发中。这个脚本的界面(例如:给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如下规则:允许向外的sshdns报文通过;阻塞所有的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(kde1kde2两个版本)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蠕虫是中国人写的。(读到这里,您可能会感到莫名其妙,已经抄起鸡蛋、西红柿了,但是请相信:我没有发烧,绝对是有感而发,通过这种方式表达自己的愤怒而已)'

     

    说明:

    提供了一个基于规则的实时转向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)配置都有效, 还可以生成最终请求串。此重写操作的结果可以是内部子处理,也可以是外部请求的转向,甚至还可以是内部代理处理。

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

    此模块从19977月起为apache group所专用,由以下这些人创建于19964

    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唯一的实现方法。 记住以下两点,会有助于更好地理解:

  • 虽然mod_rewrite可以重写urlurl,重写url为文件名, 甚至重写文件名为文件名,但是目前api只提供一个url到文件名的hook apache 2.0 中,增加了两个丢失hook以使处理过程更清晰。 但是,这样做并没有给用户带来麻烦,只需记住这样一个事实: apache借助url到文件名的hook而比api设计的目标功能更强大。
  • 难以置信的是,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指令。 条件之后的重写规则仅在当前uripattern匹配并且符合这些条件的时候才会起作用。

    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

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

    特别注意事项:

  • script_filenamerequest_filename包含的值是相同的,, apache服务器的内部request_rec结构中的filename字段。 第一个其实就是大家都知道的cgi变量名,而第二个则是( 包含了request_rec结构中的uri字段的)request_uri的一个副本,
  • 特殊形式: %{env:variable} 其中的variable可以是任何环境变量。 它是通过查找apache内部结构得到的, 或者(如果没找到的话)是由apache服务器进程通过getenv()得到的。
  • 特殊形式: %{http:header} 其中的header可以是任何http mime头的名称。 它是通过查找http请求得到的。比如: %{http:proxy-connection}就是http ``proxy-connection:''的值.
  • 特殊形式 %{la-u:variable} 它是一个预设的值, variable的最终值在执行一个内部的(基于url)子请求后决定。 在重写需要使用一个尚未有效的但是会在之后的api程序段中设置的变量的时候,就会使用这个方法。 比如,需要在服务器级配置(httpd.conf文件)中重写remote_user变量, 则,必须使用%{la-u:remote_user},因为此变量是由认证程序段设置的, 而这个程序段是在mod_rewrite所在的url转译程序段之后才执行的。 但是,因为mod_rewrite是通过api修正程序段来实现目录级(.htaccess file)配置的, 而这个程序段在认证程序段之前就执行了,所以用%{remote_user}就可以了。
  • 特殊形式: %{la-f:variable} 它是一个预设的值, variable的最终值在执行一个内部的(基于文件名的)子请求后决定。 大多数情况下和上述的la-u是相同的.
  • condpattern是条件pattern, , 一个应用于当前实例teststring的正则表达式, , teststring将会被计算然后与condpattern匹配.

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

  • 可以在pattern串中使用'!' 字符(惊叹号)来实现匹配的反转
  • condpatterns有若干特殊的变种。除了正则表达式的标准用法,还有下列用法:
    • '' (词典顺序的小于)
      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服务器速度急剧下降! 重写日志使用大于2level值只用于调试!

    举例

    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是一个纯文本文件,包含空行、注释行(以字符'#'打头), 以及每行一个的替换对,如下。

    matchingkeysubstvalue

    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, ndbmdb,由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 (�, 'ndbm_file', $dbmmap,o_rdwr|o_trunc|o_creat, 0644)   or die "couldn't create $dbmmap!/n";   while () {   next if (/^/s*#/ or /^/s*$/);   $db{$1} = $2 if (/^/s*(/s )/s (/s )/); }   untie �; 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 () {     # ...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

    兼容性:

    maxredirectsapache 2.0.45以及更新的版本中有效

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

    inherit

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

    maxredirects=number

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

    rewriterule 指令

    说明:

    为重写引擎定义规则

    语法:

    rewriterule pattern substitution

    上下文:

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

    覆盖项:

    fileinfo

    状态:

    extension

    模块:

    mod_rewrite

    兼容性:

    cookie-flagapache 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的反转。 比如:``如果当前urlpattern相匹配''. 它用于使用否pattern较容易描述的需要排除的某些情况,或者作为最后一条规则。

    注意

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

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

  • $n 反向引用rewriterulepattern
  • %n 反向引用最后匹配的rewritecond pattern
  • 规则条件测试字符串中(%{varname})的服务器变量
  • 映射函数调用(${mapname:key|default})
  • 反向引用的$n (n=0..9) 是指用pattern所匹配的第n组的内容去替换url。 服务器变量与rewritecond指令的teststring相同。映射函数由rewritemap指令所决定,其说明也参见该指令。 这三种类型变量按上面列表中的顺序被扩展。

    如上所述,所有的重写规则都是(按配置文件中的定义顺序)作用于substitution的。 urlsubstitution完全地替换,并继续处理直到所有规则处理完毕, 除非用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, 比如, '/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/=$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运作正常, , 作为一个使用apiuri到文件名翻译器, 它可以重写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 ) or cgi ( $env{'var'})中, 也可以在后继的rewritecond指令的pattern中通过%{env:var}作引用。 使用它可以从url中剥离并记住一些信息。
    • 'cookie|co=name:val:domain[:lifetime[:path]]' (设置cookie)
      它在客户端浏览器上设置一个cookie cookie的名称是name,其值是val domain字段是该cookie的域,比如'.apache.org', 可选的lifetimecookie生命期的分钟数, 可选的pathcookie的路径。

    注意

    绝不要忘记,在服务器级配置文件中,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

     

    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.com206.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
    的近年来的发展迅速,在我接触linux2年中,windows还是那个windows,而 linux已经不是2年前的linux了!把linux作为桌面,也随着linux易用性的提高而渐渐为越来越多的人所接受。据说google公司最受欢迎的操作系统不是windows,不是macosx,而是linuxlinux发行版多种多样,现在最受欢迎的莫过于ubuntugoogle公司内部使用的linux发行版,也是基于ubuntugoobuntu

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

    本文参考了ubuntu.org.cnubuntu linux 6.06 dapperdrake快速设置指南如何混音nicky's blogubuntu的黑体尊龙游戏旗舰厅官网的解决方案

    本文提到的stheiti属于商业软件,仅供个人测试之用,不得用于任何形式的商业用途。ms truetype core fonts根据microsofteula免费分发,eula的内容请自行查阅msttcorefonts压缩包内的相关文件。

    谨以此文,献给喜欢ubuntulinuxer。欢迎加入ubuntu阵营。

    二、安装:

    0.
    下载ubuntu linux 6.06 lts desktop cd的iso,刻盘。

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

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

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

    三、安装后配置:

    0.
    配置adsl: