2006/03/14

php中截获错误 php,error,error handler

php中截获错误
tags:php,error,error handler
$old_error_handler = set_error_handler("myErrorHandler");
function myErrorHandler($errno, $errstr, $errfile, $errline)
{
switch($errno)
{
case 2048: break;
default:
echo "[$errno] $errstr in line $errline of file $errfile<br />\n";
}
}
--
[:p] --飞扬.轻狂 [fallseir.lee]
http://fallseir.livejournal.com
http://feed.feedsky.com/fallseir

2006/03/13

url转向实例

url转向实例
tags:url转向,apache
#config in httpd.conf in apache2/conf
#1、启用转向功能
LoadModule rewrite_module modules/mod_rewrite.so
#2、设定起始目录
DocumentRoot "D:/htdocs/php"
#3、设定起始页
DirectoryIndex index.html index.html.var index.php
#4、添加页面处理类型
AddType application/x-httpd-php .php
#5、启用目录层次的配置控制
AccessFileName .htaccess
<Directory "D:/htdocs/php">
#...允许.htaccess配置文件
AllowOverride All
#...
</Directory>

#6、配置D:/htdocs/php目录下的.htaccess,
#win下创建此文件需使用cmd模式下的命令行方式echo create > .htaccess
#起始页
DirectoryIndex index.php
#启用重定向引擎
RewriteEngine on
#设定重定向规则
RewriteRule ^feed/([a-zA-Z0-9]*)$ /feedreader/renderfeed.php?brn=$1 [L]
#设定默认处理字符集格式
php_value default_charset UTF-8


--
[:p] --飞扬.轻狂 [fallseir.lee]
http://fallseir.livejournal.com
http://feed.feedsky.com/fallseir

2006/03/10

code:awk 实例解析 使用wget和awk对blogcn的十万数据进行测试分析

使用wget和awk对***站点的十万数据进行测试分析
结果和过程如下
tags:awk,wget,shell,linux,code
wget 采用 --spider 非下载式任务
-------------------------------------------------------------
测试结果分析
----------------------------------------------------
wget效率
>>> 100003.0/((10*60+53)*60+4)
2.5521386280114333
请求成功率
>>> 99983/100003.0
0.99980000599982
页面成功率
>>> 93496/100003.0
0.93493195204143875
短数据
>>> 2821/100003.0
0.02820915372538824
<10k
>>> 65654/100003.0
0.65652030439086828
<20k
>>> 31732/100003.0
0.31731048068557943
----------------------------------------------------
测试结果汇总
------------------------------------------------------
url xac xab sum
-------------------------------------------------
任务数 8391 41612 50000 100003
时间 1:15:32 7:59:25 8:38:7 10:53:04
请求数 8391 41617 50003 100011
请求成功数 8389 41611 49983 99983
获取失败数 数据长度为零 612 2837 3038 6487
成功数 数据长度不为零 7777 38774 46945 93496
短数据数 数据长度小于1k 108 945 1768 2821
<10k 6898 31631 27125 65654
<30k 0 0 0 0
=2xk 3737 16541 11454 31732
=1xk 3161 15090 15671 33992
awk 实例解析
#将获取的url列表改名
$ cp xxx.xxx.xxx_abc.txt url.ls
#查看一下列表
$ less url.ls #u,p,q --向上翻页,向下翻页,推出
laviniahsiao
ostrich
wolingwu_2002
weizi
xingxingyu
congolin
inkstone
iui
yuyan
bluemoor
...
#截断进行测试
$ sed -n "20,30p" url.ls > sub.ls
#拼接相对url为绝对url地址
# -- 此处不使用 -B base 是因为 -B只能用在比较简单的替换上
#建立干净的工作环境
$ mkdir awk_wget
$ mv url.ls awk_wget/
$ mv sub.* awk_wget/
$ cd awk_wget/
$ ll
-rw-rw-r-- 1 tester tester 100 Mar 8 23:40 sub.ls
-rw-rw-r-- 1 tester tester 496 Mar 8 23:43 sub.wg
-rw-rw-r-- 1 tester tester 997676 Mar 8 23:31 url.ls
#获取分析数据 log.txt
$ wget -i sub.wg -o log.txt -x -P wglist &
# 使用wget根据-i sub.wg中提供的url列表获取网络数据,输出wget操作日志到-o log.txt中,数据保存到-x根据 url 在-P wglist目录下创建子目录
下 & 命令在后台运行
# 使用非下载模式
$ wget -i sub.wg -o log_sp.txt --spider & #--spider 不下载数据
# 使用简单信息模式
$ wget -i sub.wg -o log_nv.txt -nv --spider & # -nv 不记录详细信息
$ tail -f log.txt #查看log.txt文件的最后十行数据,并-f实时反映log.txt的最新更新
# 需求
1、测试目标地址正确率 2xx
2、测试目标地址错误率 !2xx
3、分析目标地址出错原因 4xx 5xx
4、分析目标地址跳转情况 3xx
# end
任务一、以最快的效率测试正确率
# 测试 跳转地址的 -nv 日志

$ wget https://mail.google.com -nv --spider
200 OK

$ wget https://mail.google.com --spider
--00:02:27-- https://mail.google.com/...
HTTP request sent, awaiting response... 302 Moved Temporarily ...

# 结论 使用 -nv 可以最快的方式完成测试 但
$ date --date='2002-08-28 23:55:32 +0800' +'hello %Y/%m/%d %H:%M:%S %z'
hello 2002/08/28 23:55:32 +0800
$date --date='2002-08-28 23:55:32 +0800' +'%x %T'
08/28/2002 23:55:32
#!没找到毫秒郁闷
#呵呵 发现可以使用time 进行效率分析
$ time wget -i sub.wg -o log_nv.txt -nv --spider &
real 0m12.760s
user 0m0.003s
sys 0m0.024s
$ time wget -i sub.wg -o log_sp.txt --spider &
real 0m5.073s
user 0m0.002s
sys 0m0.024s
$ time wget -i sub.wg -o log.txt -x -P down &
real 0m17.110s
user 0m0.007s
sys 0m0.038s
#跑了好几次发现工作环境的网络太不稳定了 所以数据不大可靠,等有时间进行一次大数据量的测试吧
#不过通过输出来傻瓜式分析,效率最高的是-nv --spider, --spider, -nv ,不带 -nv和 --spider

#

$ wc url.ls
100000 100000 997676 url.ls

$ time awk '{print "http://www. *** .com/rss2.asp?blog="$1}' url.ls >url.wg

real 0m0.210s
user 0m0.164s
sys 0m0.046s

$ wc url.wg
100000 100000 4597676 url.wg
# 过滤每个任务的开始时间
$ awk '/--[0-9]/{print $1}' log_url.txt >time.txt
# 获取已完成的任务数
$ wc -l time.txt
1510 time.txt
# 获取开始的时间
$ head -n 5 time.txt
--01:19:34--
--01:19:35--
--01:19:35--
--01:19:35--
--01:19:36--
# 获取结束的时间
$ tail -n 5 time.txt
--01:37:01--
--01:37:02--
--01:37:02--
--01:37:02--
--01:37:03--
# 计算平均间隔
#使用python 当计算器
python
>>> b=(1*60+19)*60+34 #begin second
>>> e=(1*60+37)*60+1

2006/03/09

learn:使用wget使用手册

tags:learn,wget,shell
使用wget
$ wget http://www.feedsky.com #获取网页
--19:50:05-- http://www.feedsky.com/ #开始时间 地址
=> `index.html' # 保存位置
Resolving www.feedsky.com... 211.154.171.184 #解析主机
Connecting to www.feedsky.com[211.154.171.184]:80... connected. #建立连接
HTTP request sent, awaiting response... 200 OK #请求 状态
Length: 7,237 [text/html] #文件大小 类型

100%[====================================>] 7,237 --.--K/s #完成信息

19:50:05 (183.45 KB/s) - `index.html' saved [7,237/7,237] #结束时间 状态
---- 查看文件状态
$ file index.html
index.html: UTF-8 Unicode HTML document text, with CRLF line terminators
--------------------------------------------------------
-b 后台运行
$ wget -b http://www.feedsky.com #后台运行
Continuing in background, pid 5230. #后台运行信息
Output will be written to `wget-log'. #日志文件
------ 查看日志文件
$ cat wget-log #
--19:58:23-- http://www.feedsky.com/
=> `index.html.1' #如果默认名称文件已存在,wget将自动使用下一个扩展名
Resolving www.feedsky.com... 211.154.171.184
Connecting to www.feedsky.com[211.154.171.184]:80 ... connected.
HTTP request sent, awaiting response... 200 OK
Length: 7,237 [text/html]

0K ....... 100% 162.60 KB/s #此处同屏幕输出有细微差别

19:58:23 (162.60 KB/s) - `index.html.1' saved [7,237/7,237]

--------------------------------------------------------
* 记录和输入文件
============================
-o 指定日志文件
-a 追加日志文件
wget -b http://www.feedsky.com -o wget.log #将日志文件输出到指定的文件 wget.log中 日志格式同-b没有区别
wget -b http://www.feedsky.com -a wget.log #追加日志到已存在的文件 wget.log中, 如果指定的文件不存在将创建之。
$ cat wget.log #查看日志文件
--20:10:46-- http://www.feedsky.com/
=> `index.html.1'
Resolving www.feedsky.com... 211.154.171.184
Connecting to www.feedsky.com[211.154.171.184]:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 7,237 [text/html]

0K ....... 100% 227.98 KB/s

20:10:46 (227.98 KB/s) - `index.html.1' saved [7,237/7,237]

--20:12:31-- http://www.feedsky.com/
=> `index.html.2'
Resolving www.feedsky.com... 211.154.171.184
Connecting to www.feedsky.com[211.154.171.184]:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 7,237 [text/html]

0K ....... 100% 215.51 KB/s

20:12:36 (215.51 KB/s) - `index.html.2' saved [7,237/7,237]

$ #查看每条记录的格式以便于后期对日志文件进行分析

--------------------------------------------------------
-d 调试输出
$ wget http://www.feedsky.com -d #调试输出
DEBUG output created by Wget 1.9+cvs-stable (Red Hat modified) on linux-gnu.

--20:21:16-- http://www.feedsky.com/
=> `index.html.4'
Resolving www.feedsky.com... 211.154.171.184
Caching www.feedsky.com => 211.154.171.184
Connecting to www.feedsky.com[211.154.171.184]:80 ... connected.
Created socket 3. #创建连接
Releasing 0x8642158 (new refcount 1).
---request begin--- #开始请求
GET / HTTP/1.0 #请求方式
User-Agent: Wget/1.9+cvs-stable (Red Hat modified) #user agent
Host: www.feedsky.com #请求主机
Accept: */* #类型
Connection: Keep-Alive #连接方式

---request end--- #结束请求
HTTP request sent, awaiting response... HTTP/1.1 200 OK #回应状态
Server: Microsoft-IIS/5.0 #服务器信息
Date: Thu, 09 Mar 2006 03:29:25 GMT #时间
X-Powered-By: ASP.NET #其他头信息
Connection: keep-alive #连接方式
X-AspNet-Version: 2.0.50727 #其他头信息
Set-Cookie: ASP.NET_SessionId=p2cqnf451rulex551k5luv55; path=/; HttpOnly #cookie

Stored cookie www.feedsky.com 80 / nonpermanent 0 <undefined> ASP.NET_SessionId p2cqnf451rulex551k5luv55
Cache-Control: private #缓存
Content-Type: text/html; charset=utf-8 #内容类型
Content-Length: 7237 #文件大小


Found www.feedsky.com in host_name_addresses_map (0x8642158) #已存在的主机映射
Registered fd 3 for persistent reuse.
Length: 7,237 [text/html]

100%[====================================>] 7,237 --.--K/s

20:21:21 (249.56 KB/s) - `index.html.4' saved [7,237/7,237]

--------------------------------------------------------
-q 安静模式 ,没有日志输出
$ wget http://www.feedsky.com -q -o wget.log
$ cat wget.log
$
--------------------------------------------------------
-v 输出详细日志 默认方式
-nv 不输出详细日志
$ wget http://www.feedsky.com/abc -nv -a wget.log
$ wget http://www.feedsky.com/ -nv -a wget.log
$ wget http://www.feedsky.com/400 -nv -a wget.log
$ cat wget.log
http://www.feedsky.com/abc:
20:36:35 ERROR 404: Not Found.
20:36:39 URL:http://www.feedsky.com/ [7,237/7,237] -> "index.html.6" [1]
http://www.feedsky.com/400 :
20:36:43 ERROR 404: Not Found.
--------------------------------------------------------
-i 下载指定的文件中的urls
-F 将输入文件当作html来对待
-B 指定baseurl
# 组合-iFB 可以从一个指定的html获取到页面中的所有链接

$ wget -i wgetscr/list.wget
--20:40:35-- http://www.feedsky.com/
=> `index.html'
Resolving www.feedsky.com... 211.154.171.184
Connecting to www.feedsky.com[211.154.171.184]:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 7,237 [text/html]

100%[====================================>] 7,237 --.--K/s

20:40:35 (262.14 KB/s) - `index.html' saved [7,237/7,237]

--20:40:35-- http://www.feedsky.com/404
=> `404'
Reusing connection to www.feedsky.com:80.
HTTP request sent, awaiting response... 404 Not Found
20:40:35 ERROR 404: Not Found.

--20:40:35-- http://www.china.com/
=> `index.html.1'
Resolving www.china.com... 61.151.243.108 , 61.151.243.109, 61.151.243.197, ...
Connecting to www.china.com[61.151.243.108]:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 1,114 [text/html]

100%[====================================>] 1,114 --.--K/s

20:40:36 (10.62 MB/s) - `index.html.1' saved [1,114/1,114]

--20:40:36-- http://www.china.com/404
=> `404'
Reusing connection to www.china.com:80.
HTTP request sent, awaiting response... 404 Not Found
20:40:36 ERROR 404: Not Found.


FINISHED --20:40:36--
Downloaded: 8,351 bytes in 2 files

---输出到日志文件

$ wget -i wgetscr/list.wget -o wget.log
[tester@localhost wget_test]$ cat wget.log
--20:44:27-- http://www.feedsky.com/
=> `index.html.2'
Resolving www.feedsky.com... 211.154.171.184
Connecting to www.feedsky.com[211.154.171.184]:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 7,237 [text/html]

0K ....... 100% 233.60 KB/s

20:44:32 (233.60 KB/s) - `index.html.2' saved [7,237/7,237]

--20:44:32-- http://www.feedsky.com/404
=> `404'
Reusing connection to www.feedsky.com:80.
HTTP request sent, awaiting response... 404 Not Found
20:44:33 ERROR 404: Not Found.

--20:44:33-- http://www.china.com/
=> `index.html.3'
Resolving www.china.com... 61.151.243.218 , 61.151.243.226, 61.151.243.245, ...
Connecting to www.china.com[61.151.243.218]:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 1,114 [text/html]

0K . 100% 10.62 MB/s

20:44:38 (10.62 MB/s) - `index.html.3' saved [1,114/1,114]

--20:44:38-- http://www.china.com/404
=> `404'
Reusing connection to www.china.com:80.
HTTP request sent, awaiting response... 404 Not Found
20:44:38 ERROR 404: Not Found.


FINISHED --20:44:38--
Downloaded: 8,351 bytes in 2 files

--------------------------------------------------------
* 下载
============================
-t 设定尝试连接次数
$ wget -i wgetscr/list.wget -t 3
-O 设定输出文件位置
$ wget -i wgetscr/list.wget -O test
$ll
-rw-rw-r-- 1 tester tester 7237 Mar 8 20:40 index.html
-rw-rw-r-- 1 tester tester 1114 Mar 8 20:40 index.html.1
-rw-rw-r-- 1 tester tester 8351 Mar 8 20:55 test
$ wget -i wgetscr/list.wget -O test
$ll
...
-rw-rw-r-- 1 tester tester 8351 Mar 8 20:56 test
#如果使用-i输入一组url ,则下载的数据经被以追加写入同一个-O指定的文件test中
#wget执行后会将test中原有的数据覆盖
--------------------------------------------------------
-nc 不覆盖已存在的文件

$ wget -i wgetscr/list.wget -nc -o wget.log
$ cat wget.log
File `index.html' already there, will not retrieve.
--21:08:24-- http://www.feedsky.com/404
=> `404'
Resolving www.feedsky.com... 211.154.171.184
Connecting to www.feedsky.com[211.154.171.184]:80 ... connected.
HTTP request sent, awaiting response... 404 Not Found
21:08:29 ERROR 404: Not Found.

File `index.html' already there, will not retrieve.
--21:08:29-- http://www.china.com/404
=> `404'
Resolving www.china.com ... 61.151.243.197, 61.151.243.207, 61.151.243.218, ...
Connecting to www.china.com[61.151.243.197]:80... connected.
HTTP request sent, awaiting response... 404 Not Found
21:08:29 ERROR 404: Not Found.

#如果本地同名的文件已存在则不再进行连接
--------------------------------------------------------
-c 接着下载没下载完的文件

$ wget -i wgetscr/list.wget -c
--21:10:50-- http://www.feedsky.com/
=> `index.html'
Resolving www.feedsky.com... 211.154.171.184
Connecting to www.feedsky.com[211.154.171.184]:80... connected.
HTTP request sent, awaiting response... 200 OK

The file is already fully retrieved; nothing to do.

--21:10:51-- http://www.feedsky.com/404
=> `404'
Connecting to www.feedsky.com[211.154.171.184]:80 ... connected.
HTTP request sent, awaiting response... 404 Not Found
21:10:51 ERROR 404: Not Found.

--21:10:51-- http://www.china.com/
=> `index.html'
Resolving www.china.com... 61.151.243.108 , 61.151.243.109, 61.151.243.197, ...
Connecting to www.china.com[61.151.243.108]:80... connected.
HTTP request sent, awaiting response... 200 OK

The file is already fully retrieved; nothing to do.

--21:10:57-- http://www.china.com/404
=> `404'
Connecting to www.china.com[61.151.243.108]:80 ... connected.
HTTP request sent, awaiting response... 404 Not Found
21:10:58 ERROR 404: Not Found.

#查看日志 表明 使用 -c 参数时 wget只会使用本地同名文件进行检测
--------------------------------------------------------
-N 判断 lastmodify 标记,如果远端没有本地的文件新就不用重新获取
$ wget -i wgetscr/list.wget -N
...
--21:17:10-- http://www.china.com/
=> `index.html'
Resolving www.china.com... 61.151.243.207 , 61.151.243.218, 61.151.243.226, ...
Connecting to www.china.com[61.151.243.207]:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 1,114 [text/html]
Last-modified header missing -- time-stamps turned off.
--21:17:11-- http://www.china.com/
=> `index.html'
Connecting to www.china.com[61.151.243.207]:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 1,114 [text/html]
...

$ wget -i wgetscr/list.wget -N -nv
Last-modified header missing -- time-stamps turned off.
21:20:35 URL:http://www.feedsky.com/ [7,237/7,237] -> "index.html" [1]
http://www.feedsky.com/404:
21:20:35 ERROR 404: Not Found.
Last-modified header missing -- time-stamps turned off.
21:20:40 URL:http://www.china.com/ [1,114/1,114] -> " index.html" [1]
http://www.china.com/404:
21:20:40 ERROR 404: Not Found.

FINISHED --21:20:40--
Downloaded: 8,351 bytes in 2 files

#日志表明 如果服务器端不支持lastmodify 将不启用此标记
#进行二次连接以对更新了的文件进行抓取

-------------------------------------------------------- -S 输出服务器回应信息

$ wget -i wgetscr/list.wget -N -S
--21:22:08-- http://www.feedsky.com/
=> `index.html'
Resolving www.feedsky.com... 211.154.171.184
Connecting to www.feedsky.com[211.154.171.184]:80... connected.
HTTP request sent, awaiting response...
1 HTTP/1.1 200 OK
2 Server: Microsoft-IIS/5.0
3 Date: Thu, 09 Mar 2006 04:37:36 GMT
4 X-Powered-By: ASP.NET
5 Connection: keep-alive
6 X-AspNet-Version: 2.0.50727
7 Set-Cookie: ASP.NET_SessionId=dcrsn555fatsrlutzarox455 ; path=/; HttpOnly
8 Cache-Control: private
9 Content-Type: text/html; charset=utf-8
10 Content-Length: 7237
Last-modified header missing -- time-stamps turned off.
--21:22:08-- http://www.feedsky.com/
=> `index.html'
Connecting to www.feedsky.com[211.154.171.184]:80... connected.
HTTP request sent, awaiting response...
1 HTTP/1.1 200 OK
2 Server: Microsoft-IIS/5.0
3 Date: Thu, 09 Mar 2006 04:37:36 GMT
4 X-Powered-By: ASP.NET
5 Connection: keep-alive
6 X-AspNet-Version: 2.0.50727
7 Cache-Control: private
8 Content-Type: text/html; charset=utf-8
9 Content-Length: 7237

100%[====================================>] 7,237 --.--K/s

21:22:08 (199.91 KB/s) - `index.html' saved [7,237/7,237]
...

--------------------------------------------------------
--spider 不下载任何文件

$ wget -i wgetscr/list.wget --spider
--21:27:58-- http://www.feedsky.com/
=> `index.html.6'
Resolving www.feedsky.com ... 211.154.171.184
Connecting to www.feedsky.com[211.154.171.184]:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 7,237 [text/html]
200 OK

--21:27:59-- http://www.feedsky.com/404
=> `404'
Connecting to www.feedsky.com[211.154.171.184]:80 ... connected.
HTTP request sent, awaiting response... 404 Not Found
21:27:59 ERROR 404: Not Found.

--21:27:59-- http://www.china.com/
=> `index.html.6'
Resolving www.china.com... 61.151.243.226 , 61.151.243.245, 61.151.243.247, ...
Connecting to www.china.com[61.151.243.226]:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 1,114 [text/html]
200 OK

--21:27:59-- http://www.china.com/404
=> `404'
Connecting to www.china.com[61.151.243.226]:80 ... connected.
HTTP request sent, awaiting response... 404 Not Found
21:28:00 ERROR 404: Not Found.

--------------------------------------------------------
-T 设定响应超时的秒数
-w 两次尝试之间间隔SECONDS秒
--limit-rate=RATE 限定下载输率
--------------------------------------------------------
* 目录
============================
-nd --no-directories 不创建层次目录 默认
-x, --force-directories 强制创建目录
-nH, --no-host-directories 不创建主机目录
-P, --directory-prefix=PREFIX 将文件保存到目录 PREFIX/...
--cut-dirs=NUMBER 忽略 NUMBER层远程目录

--- 测试跳转

$ wget -iwgetscr/list2.wget
...
--22:47:11-- https://mail.google.com/
=> ` index.html.2'
Resolving mail.google.com... 66.249.83.19, 66.249.83.83
Connecting to mail.google.com[66.249.83.19 ]:443... connected.
HTTP request sent, awaiting response... 302 Moved Temporarily
Location: /mail/ [following]
--22:47:12-- https://mail.google.com/mail/
=> `index.html.2'
Connecting to mail.google.com[66.249.83.19]:443... connected.
HTTP request sent, awaiting response... 302 Moved Temporarily
Location: https://www.google.com/accounts/ServiceLogin?service=mail&passive=true&rm=false&continue=https%3A%2F%2Fmail.google.com%2Fmail%2F%3Fui%3Dhtml%26zy%3Dl&ltmpl=yj_blanco<mplcache=2 [following]
--22:47:14-- https://www.google.com/accounts/ServiceLogin?service=mail&passive=true&rm=false&continue=https%3A%2F%2Fmail.google.com%2Fmail%2F%3Fui%3Dhtml%26zy%3Dl&ltmpl=yj_blanco<mplcache=2
=> `ServiceLogin?service=mail&passive=true&rm=false&continue=https:%2F%2Fmail.google.com%2Fmail%2F?ui=html&amp;zy=l<mpl=yj_blanco&ltmplcache=2'
Resolving www.google.com... 66.249.89.104, 66.249.89.99
Connecting to www.google.com[66.249.89.104]:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 14,345 [text/html]

100%[====================================>] 14,345 56.56K/s

22:47:20 (56.51 KB/s) - `ServiceLogin?service=mail&passive=true&rm=false&continue=https:%2F%2Fmail.google.com%2Fmail%2F?ui=html&amp;zy=l<mpl=yj_blanco&ltmplcache=2' saved [14,345/14,345]

...

#如果服务器进行跳转后最终文件的存储地址将不再同原始url存在对应关系

-x 创建目录

$ wget -iwgetscr/list2.wget -x
--22:58:44-- https://mail.google.com/
=> `mail.google.com/index.html'
Resolving mail.google.com... 66.249.83.19, 66.249.83.83
Connecting to mail.google.com[66.249.83.19]:443... connected.
HTTP request sent, awaiting response... 302 Moved Temporarily
Location: /mail/ [following]
--22:58:50-- https://mail.google.com/mail/
=> `mail.google.com/mail/index.html'
Connecting to mail.google.com[ 66.249.83.19]:443... connected.
HTTP request sent, awaiting response... 302 Moved Temporarily
Location: https://www.google.com/accounts/ServiceLogin?service=mail&passive=true&rm=false&continue=https%3A%2F%2Fmail.google.com%2Fmail%2F%3Fui%3Dhtml%26zy%3Dl&ltmpl=yj_blanco<mplcache=2 [following]
--22:58:52-- https://www.google.com/accounts/ServiceLogin?service=mail&passive=true&rm=false&continue=https%3A%2F%2Fmail.google.com%2Fmail%2F%3Fui%3Dhtml%26zy%3Dl&ltmpl=yj_blanco<mplcache=2
=> `www.google.com/accounts/ServiceLogin?service=mail&passive=true&rm=false&continue=https:%2F%2Fmail.google.com%2Fmail%2F?ui=html&amp;zy=l<mpl=yj_blanco&ltmplcache=2'
Resolving www.google.com... 66.249.89.99, 66.249.89.104
Connecting to www.google.com[66.249.89.99]:443 ... connected.
HTTP request sent, awaiting response... 200 OK
Length: 14,345 [text/html]

100%[====================================>] 14,345 45.14K/s

22:58:53 (44.92 KB/s) - `www.google.com/accounts/ServiceLogin?service=mail&passive=true&rm=false&continue=https:%2F%2Fmail.google.com%2Fmail%2F?ui=html&amp;zy=l<mpl=yj_blanco&ltmplcache=2' saved [14,345/14,345]

-nH 不创建主机目录
-P 保存起始目录
$ wget -iwgetscr/list2.wget -x -nH -P down
-----------
=> `down/index.html'
=> `down/accounts/ServiceLogin?service=mail&passive=true&rm=false&continue=https:%2F%2Fmail.google.com%2Fmail%2F?ui=html&amp;zy=l<mpl=yj_blanco&ltmplcache=2'
-----------
#-nH需要同-x合用,同名文件将被覆盖
--------------------------------------------------------
忽略n条暂时用不上的指令
--------------------------------------------------------
参考:
chedong:linux在线手册
咖啡时光 :wget中文使用手册

wget
wget是一个从网络上自动下载文件的自由工具。它支持HTTP,HTTPS和FTP协议,可以使用HTTP代理.
所谓的自动下载是指,wget可以在用户退出系统的之后在后台执行。这意味这你可以登录系统,启动一个wget下载任务,然后退出系统,wget将在后台执行直到任务完成,相对于其它大部分浏览器在下载大量数据时需要用户一直的参与,这省去了极大的麻烦。
wget可以跟踪HTML页面上的链接依次下载来创建远程服务器的本地版本,完全重建原始站点的目录结构。这又常被称作"递归下载"。在递归下载的时候,wget遵循Robot Exclusion标准(/robots.txt). wget可以在下载的同时,将链接转换成指向本地文件,以方便离线浏览。
wget非常稳定,它在带宽很窄的情况下和不稳定网络中有很强的适应性.如果是由于网络的原因下载失败,wget会不断的尝试,直到整个文件下载完毕。如果是服务器打断下载过程,它会再次联到服务器上从停止的地方继续下载。这对从那些限定了链接时间的服务器上下载大文件非常有用。
wget的常见用法
wget的使用格式
Usage: wget [OPTION]... [URL]...
* 用wget做站点镜像:
wget -r -p -np -k http://dsec.pku.edu.cn/~usr_name/
# 或者
wget -m http://dsec.pku.edu.cn/~usr_name/
* 在不稳定的网络上下载一个部分下载的文件,以及在空闲时段下载
wget -t 0 -w 31 -c http://dsec.pku.edu.cn/BBC.avi -o down.log &
# 或者从filelist读入要下载的文件列表
wget -t 0 -w 31 -c -B ftp://dsec.pku.edu.cn/linuxsoft -i filelist.txt -o down.log &
上面的代码还可以用来在网络比较空闲的时段进行下载。我的用法是:在mozilla中将不方便当时下载的URL链接拷贝到内存中然后粘贴到文件filelist.txt中,在晚上要出去系统前执行上面代码的第二条。
* 使用代理下载
wget -Y on -p -k https://sourceforge.net/projects/wvware/
代理可以在环境变量或wgetrc文件中设定
# 在环境变量中设定代理
export PROXY= http://211.90.168.94:8080/
# 在~/.wgetrc中设定代理
http_proxy = http://proxy.yoyodyne.com:18023/
ftp_proxy = http://proxy.yoyodyne.com:18023/
wget各种选项分类列表
* 启动
-V, --version 显示wget的版本后退出
-h, --help 打印语法帮助
-b, --background 启动后转入后台执行
-e, --execute=COMMAND 执行`.wgetrc'格式的命令,wgetrc格式参见/etc/wgetrc或~/.wgetrc
* 记录和输入文件
-o, --output-file=FILE 把记录写到FILE文件中
-a, --append-output=FILE 把记录追加到FILE文件中
-d, --debug 打印调试输出
-q, --quiet 安静模式(没有输出)
-v, --verbose 冗长模式(这是缺省设置)
-nv, --non-verbose 关掉冗长模式,但不是安静模式
-i, --input-file=FILE 下载在FILE文件中出现的URLs
-F, --force-html 把输入文件当作HTML格式文件对待
-B, --base=URL 将URL作为在-F -i参数指定的文件中出现的相对链接的前缀
--sslcertfile=FILE 可选客户端证书
--sslcertkey=KEYFILE 可选客户端证书的KEYFILE
--egd-file=FILE 指定EGD socket的文件名
* 下载
--bind-address=ADDRESS 指定本地使用地址(主机名或IP,当本地有多个IP或名字时使用)
-t, --tries=NUMBER 设定最大尝试链接次数(0 表示无限制).
-O --output-document=FILE 把文档写到FILE文件中
-nc, --no-clobber 不要覆盖存在的文件或使用.#前缀
-c, --continue 接着下载没下载完的文件
--progress=TYPE 设定进程条标记
-N, --timestamping 不要重新下载文件除非比本地文件新
-S, --server-response 打印服务器的回应
--spider 不下载任何东西
-T, --timeout=SECONDS 设定响应超时的秒数
-w, --wait=SECONDS 两次尝试之间间隔SECONDS秒
--waitretry=SECONDS 在重新链接之间等待1...SECONDS秒
--random-wait 在下载之间等待0...2*WAIT秒
-Y, --proxy=on/off 打开或关闭代理
-Q, --quota=NUMBER 设置下载的容量限制
--limit-rate=RATE 限定下载输率
* 目录
-nd --no-directories 不创建目录
-x, --force-directories 强制创建目录
-nH, --no-host-directories 不创建主机目录
-P, --directory-prefix=PREFIX 将文件保存到目录 PREFIX/...
--cut-dirs=NUMBER 忽略 NUMBER层远程目录
* HTTP 选项
--http-user=USER 设定HTTP用户名为 USER.
--http-passwd=PASS 设定http密码为 PASS.
-C, --cache=on/off 允许/不允许服务器端的数据缓存 (一般情况下允许).
-E, --html-extension 将所有text/html文档以.html扩展名保存
--ignore-length 忽略 `Content-Length'头域
--header=STRING 在headers中插入字符串 STRING
--proxy-user=USER 设定代理的用户名为 USER
--proxy-passwd=PASS 设定代理的密码为 PASS
--referer=URL 在HTTP请求中包含 `Referer: URL'头
-s, --save-headers 保存HTTP头到文件
-U, --user-agent=AGENT 设定代理的名称为 AGENT而不是 Wget/VERSION.
--no-http-keep-alive 关闭 HTTP活动链接 (永远链接).
--cookies=off 不使用 cookies.
--load-cookies=FILE 在开始会话前从文件 FILE中加载cookie
--save-cookies=FILE 在会话结束后将 cookies保存到 FILE文件中
* FTP 选项
-nr, --dont-remove-listing 不移走 `.listing'文件
-g, --glob=on/off 打开或关闭文件名的 globbing机制
--passive-ftp 使用被动传输模式 (缺省值).
--active-ftp 使用主动传输模式
--retr-symlinks 在递归的时候,将链接指向文件(而不是目录)
* 递归下载
-r, --recursive 递归下载--慎用!
-l, --level=NUMBER 最大递归深度 (inf 或 0 代表无穷).
--delete-after 在现在完毕后局部删除文件
-k, --convert-links 转换非相对链接为相对链接
-K, --backup-converted 在转换文件X之前,将之备份为 X.orig
-m, --mirror 等价于 -r -N -l inf -nr.
-p, --page-requisites 下载显示HTML文件的所有图片
* 递归下载中的包含和不包含(accept/reject)
-A, --accept=LIST 分号分隔的被接受扩展名的列表
-R, --reject=LIST 分号分隔的不被接受的扩展名的列表
-D, --domains=LIST 分号分隔的被接受域的列表
--exclude-domains=LIST 分号分隔的不被接受的域的列表
--follow-ftp 跟踪HTML文档中的FTP链接
--follow-tags=LIST 分号分隔的被跟踪的HTML标签的列表
-G, --ignore-tags=LIST 分号分隔的被忽略的HTML标签的列表
-H, --span-hosts 当递归时转到外部主机
-L, --relative 仅仅跟踪相对链接
-I, --include-directories=LIST 允许目录的列表
-X, --exclude-directories=LIST 不被包含目录的列表
-np, --no-parent 不要追溯到父目录
问题
在递归下载的时候,遇到目录中有中文的时候,wget创建的本地目录名会用URL编码规则处理。如"天网防火墙"会被存为"%CC%EC%CD%F8%B7%C0%BB%F0%C7%BD",这造成阅读上的极大不方便。

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

2006/03/08

linux shell 常用指令收集 (一)

tags: linux,shell,command
配置linux系统
ifconfig 查看ip
ntsysv 系统服务配置 采用交互形式进行系统配置
setup 工具设置程序 采用交互形式进行系统配置
poweroff #关机
reboot #重新启动系统
shutdown #关闭系统
sudo command 使用超级用户身份执行命令
如果使用非root帐户,由于配置的环境变量不同,可能需要指定命令的全路径
使用 whereis command 可以查看命令位置
使用 which command 可以查看当前运行的命令是哪个
修改系统的语言配置
cd /etc/sysconfig #进入系统配置信息目录
ll i* #查找i18n配置文件
cp i18n i18n.orgi #备份原始配置文件
vi i18n #使用 vi进行编辑
LANG="en_US" #修改LANG为 en_US,使用<insert>键进行切换插入和修改
<esc> :x #保存退出 <esc> 将焦点定位到命令输入
:q! #不保存直接退出
修改$HOME/.i18n文件可以只更改用户自己的语言配置,如果.i18n文件不存在,可以将系统的i18n文件拷贝过去。
df -h //查看分区
pstree //进程的树状视图
useradd username //创建用户
passwd username //修改指定用户的密码
ssh username@domain //通过ssh登陆
env 查看当前环境变量
wc -l *.php 查看所有.php文件的代码行数 -l 行数 -m chars -c bytes
sudo more /etc/sudoers 查看具有sudo权限的用户 sudo 需要超级用户的身份才能查看 more 分页查看
ls -la//查看目录下的子项列表 l 列表查看 a 显示隐藏
ll //等同于 ls -l
find . -name "php" //在当前目录下查找文件文件名中包含 php 的文件
Ctrl-z //停止当前进程的运行
bg //将停止的进程放置到后台运行
jobs //查看后台执行的任务
find . -name "php" &//&用于将进程在后台运行
sudo xxx//使用超级用户身份运行xxx命令 需要出示当前用户的密码
ps //查看正在运行的进程
ps -A//查看所有运行的进程
kill dddd// 关掉 dddd 指定的pid的进程
killall command// 关掉所有 command 指定的进程
echo $PATH //查看当前环境变量
ll |grep "matchstr" //| 将,grep查找含有matchstr的行 可以使用正则
whereis chkconfig //whereis 查找 chkconfig的位置
chkconfig //服务配置程序
# chkconfig --list > chkconfig.orig //备份原始配置信息
//查找打开的服务并生成关闭这些服务的脚本
# chkconfig --list | grep 3 n | awk '{print "chkconfig "$1" off"}' >close.sh
# chkconfig --list|awk '{if($5~/3:on/){print "chkconfig",$1,"off"}}' >close.sh
cat file.txt -n|grep "findstr" //cat 打开文件并标记行号,grep查找含有字符"findstr"的行 可以使用正则
emacs file.txt //打开配置文件
ESC - ` 在emacs中打开菜单栏
e=> g=> g 行号 //goto 到指定的行
CTRL - x,CTRL - c //推出 如果保存修改 在提示后输入y
CTRL - z //直接结束 emacs 不保存
ln -s org/dir tardir //建立连接 操作 tardir 如同操作 org/dir 一样
diff dir1 dir2 //比较两个目录的不同
技巧:对代码进行备份时
使用ln连接方式建立虚拟数据访问环境,这样修改数据位置可以不必更改代码
而且对代码进行备份的时候也可以只备份代码文件

2006/03/06

learn:php学习笔记,语法,异常处理

tags:learn,php,php5,学习笔记,语法,异常处理
PHP 5 添加了类似于其它语言的异常处理模块,可以在 PHP 内检测(try)、抛出(throw)和捕获(catch)异常。一个 try 至少要有一个与之对应的 catch。定义多个 catch 可以捕获不同的对象。PHP 会按这些 catch 被定义的顺序执行,直到完成最后一个为止。而在这些 catch 内,又可以抛出新的异常。
当一个异常被抛出时,其后(译者注:指抛出异常时所在的代码块)的代码将不会继续执行,而 PHP 就会尝试查找第一个能与之匹配的 catch。如果一个异常没有被捕获,而且又没用使用 set_exception_handler() 作相应的处理的话,那么 PHP 将会产生一个严重的错误,并且输出未能捕获异常的提示信息。

learn:rewrite in apache

tags:apache,learn,rewrite,mod_rewrite,学习笔记
mod_rewrite模块提供一个基于正则的(使用正则表达式分析器的)实时的URL重定向引擎。
支持不限量规则以及附加条件规则的灵活且强大的URL操作机制。
URL处理方式可以取决于对各种参数的决策,如服务器变量、环境变量、HTTP头、时间戳,及各种格式的用于匹配URL组成部分的数据库查询。
mod_rewrite模块可以操作URL的所有部分(包括路径信息部分),
支持在服务器级(httpd.conf)或目录级(.htaccess)进行配置,并且可以生成在最终结果中生成query-string 。
重定向的目标可以指向内部子处理,也可以重定向到外部url,或者可以是一个内部代理处理。
API Phases(程序段)
首先,需要了解Apache是通过Phases处理Http请求的。 Apache API 对每个Phases提供了一个hook(句柄,钩子)。
Mod_rewrite使用其中的两个hooks完成重定向处理:
一,URL-to-filename 转换 hook,在读取HTTP请求之后,authorization 开始之前触发;
二,Fixup hook ,在authorization 处理和读取(.htaccess)之后, 内容处理器激活之前触发。

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

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

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


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

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可以重写URL为URL,重写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来调用(见下述), 并且,在Substitution和TestString中都有效。 Figure 2 说明了反向引用被转换扩展的位置。


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

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


环境变量
mod_rewrite模块会跟踪两个额外的(非标准的)CGI/SSI环境变量, SCRIPT_URL和SCRIPT_URI。 他们包含了当前资源的逻辑的网络状态, 而标准的CGI/SSI变量SCRIPT_NAME和 SCRIPT_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 指令

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

在对一个新的URL进行替换时,mod_rewrite模块必须把这个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指令定义了一个规则的条件,即,在一个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中。mod_rewrite模块版本对应于正在使用的Apache的版本 (比如,在Apache 1.3.14的发行版中,这个值是19990320:10)。 通常,对它感兴趣的是模块的作者。
THE_REQUEST
这是由浏览器发送给服务器的完整的HTTP请求行。(比如, "GET /index.html HTTP/1.1"). 它不包含任何浏览器发送的附加头信息。
REQUEST_URI
这是在HTTP请求行中所请求的资源。(比如上述例子中的"/index.html".)
REQUEST_FILENAME
这是与请求相匹配的完整的本地文件系统的文件路径名或描述.
特别注意事项:

SCRIPT_FILENAME和REQUEST_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' (词典顺序的小于)
将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)
它使测试忽略大小写, 即, 扩展后的TestString和CondPattern中, 'A-Z' 和'a-z'是没有区别的。此标记仅作用于TestString和CondPattern的比较, 而对文件系统和子请求的测试不起作用。
'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指令打开或关闭运行时刻的重写引擎。 如果设置为off,则mod_rewrite模块不执行任何运行时刻的重写操作, 甚至也不更新SCRIPT_URx环境变量。

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

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


RewriteLock 指令

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


RewriteLog 指令

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

如果要关闭对重写操作的记录,不推荐把Filename设置为/dev/null, 因为,虽然重写引擎不能输出记录了,但仍会内部地建立这个日志文件, 它会使服务器速度降低,而且对管理员毫无益处! 要关闭日志,可以删除或注解RewriteLog指令, 或者使用RewriteLogLevel 0!
安全
参见Apache Security Tips,其中讲述了, 为什么如果存放日志的目录对除了启动服务器以外的用户是可写的会带来安全隐患。
举例
RewriteLog "/usr/local/var/apache/logs/rewrite.log"


RewriteLogLevel 指令

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

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

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


RewriteMap 指令

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

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

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

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

可以使用下列MapType和MapSource的组合:

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

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

但是必须注意:

``即使它看来简单而愚蠢,只要正确,就保持原样(Keep it simple, stupid)'' (KISS), 因为,在规则起作用时,此程序的崩溃会直接导致Apache服务器的崩溃。
避免犯一个常见的错误: 绝不要对stdout做缓冲I/O! 它会导致死循环! 所以上述例子中才会有``$|=1''...
使用RewriteLock指令定义一个加锁文件, 用于同步mod_rewrite和此程序之间的通讯。缺省时是没有同步操作的。
RewriteMap指令允许多次出现。 对每个映射函数都可以使用一个RewriteMap指令来定义其重写映射表。 虽然不能在目录的上下文中定义映射表, 但是,完全可以在其中使用映射表。

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

RewriteOptions 指令

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

inherit
此值强制当前配置可以继承其父配置。 在虚拟主机级配置中,它意味着主服务器的映射表、条件和规则可以被继承。 在目录级配置中,它意味着其父目录的.htaccess中的条件和规则可以被继承。
MaxRedirects=number
为了避免目录级RewriteRule的无休止的内部重定向, 在此类重定向和500内部服务器错误次数达到一个最大值的时候, mod_rewrite会停止对此请求的处理。 如果你确实需要对每个请求允许大于10次的内部重定向,可以增大这个值。

RewriteRule 指令

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相匹配时,用以替代(或替换)的字符串。 除了纯文本,还可以使用

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

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

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

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

注意
一个特殊功能: 在用[url]http://thishost[/url][:thisport]作为替换字段的前缀时, mod_rewrite会把它自动剥离出去。 在配合生成主机名的映射函数使用的时候, 这个对隐含的外部重定向URL的精简化操作是有用的而且是重要的。 下面例子一节中的第一个例子有助于理解这点。
谨记
由于此功能的存在,以[url]http://thishost[/url]为前缀的无条件外部重定向在你自己的服务器上是无效的。 要做这样一个自身的重定向,必须使用R标记 (见下文).
此外,Substitution还可以追加特殊标记

[flags]

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

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

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

'forbidden|F' (强制URL为被禁止的 forbidden)
强制当前URL为被禁止的,即,立即反馈一个HTTP响应代码403(被禁止的)。 使用这个标记,可以链接若干RewriteConds以有条件地阻塞某些URL。
'gone|G' (强制URL为已废弃的 gone)
强制当前URL为已废弃的,即,立即反馈一个HTTP响应代码410(已废弃的)。 使用这个标记,可以标明页面已经被废弃而不存在了.
'proxy|P' (强制为代理 proxy)
此标记使替换成分被内部地强制为代理请求,并立即(即, 重写规则处理立即中断)把处理移交给代理模块。 你必须确保此替换串是一个有效的(比如常见的以 [url]http://hostname[/url]开头的)能够为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到文件名翻译器的 Alias,ScriptAlias, 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_alias和mod_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,其值是VAL。 domain字段是该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] [url]http://thishost/otherpath/pathinfo[/url]
via external redirection

^/somepath(.*) /otherpath$1 [P] not supported, because silly!
---------------------------------------------- ----------------------------------
^/somepath(.*) [url]http://thishost/otherpath$1[/url] /otherpath/pathinfo

^/somepath(.*) [url]http://thishost/otherpath$1[/url] [R] [url]http://thishost/otherpath/pathinfo[/url]
via external redirection

^/somepath(.*) [url]http://thishost/otherpath$1[/url] [P] not supported, because silly!
---------------------------------------------- ----------------------------------
^/somepath(.*) [url]http://otherhost/otherpath$1[/url] [url]http://otherhost/otherpath/pathinfo[/url]
via external redirection

^/somepath(.*) [url]http://otherhost/otherpath$1[/url] [R] [url]http://otherhost/otherpath/pathinfo[/url]
via external redirection
(the [R] flag is redundant)

^/somepath(.*) [url]http://otherhost/otherpath$1[/url] [P] [url]http://otherhost/otherpath/pathinfo[/url]
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] [url]http://thishost/somepath/otherpath/pathinfo[/url]
via external redirection

^localpath(.*) otherpath$1 [P] not supported, because silly!
---------------------------------------------- ----------------------------------
^localpath(.*) /otherpath$1 /otherpath/pathinfo

^localpath(.*) /otherpath$1 [R] [url]http://thishost/otherpath/pathinfo[/url]
via external redirection

^localpath(.*) /otherpath$1 [P] not supported, because silly!
---------------------------------------------- ----------------------------------
^localpath(.*) [url]http://thishost/otherpath$1[/url] /otherpath/pathinfo

^localpath(.*) [url]http://thishost/otherpath$1[/url] [R] [url]http://thishost/otherpath/pathinfo[/url]
via external redirection

^localpath(.*) [url]http://thishost/otherpath$1[/url] [P] not supported, because silly!
---------------------------------------------- ----------------------------------
^localpath(.*) [url]http://otherhost/otherpath$1[/url] [url]http://otherhost/otherpath/pathinfo[/url]
via external redirection

^localpath(.*) [url]http://otherhost/otherpath$1[/url] [R] [url]http://otherhost/otherpath/pathinfo[/url]
via external redirection
(the [R] flag is redundant)

^localpath(.*) [url]http://otherhost/otherpath$1[/url] [P] [url]http://otherhost/otherpath/pathinfo[/url]
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

异步调用窗体上的控件

异步调用窗体上的控件
/// <summary>
/// Write a string to the trace window
/// </summary>
/// <param name="message">The string to write</param>
public override void Write(string message)
{
if ( textBox.InvokeRequired ) //控件的属性
textBox.BeginInvoke( new AppendTextDelegate( textBox.AppendText ), new object[] { message } );
else
textBox.AppendText( message );
}

--
[:p] --飞扬.轻狂 [fallseir.lee]
http://fallseir.livejournal.com
http://feed.feedsky.com/fallseir

2006/03/03

搜集:linux指令大全(完整篇)

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

linux指令大全(完整篇)- -

关键词linux

cat cd
chmod chown
cp cut

名称:cat
使用权限:所有使用者
使用方式:cat [-AbeEnstTuv] [--help] [--version] fileName
说明:把档案串连接后传到基本输出(萤幕或加 > fileName 到另一个档案)
参数:
-n 或 --number 由 1 开始对所有输出的行数编号
-b 或 --number-nonblank 和 -n 相似,只不过对于空白行不编号
-s 或 --squeeze-blank 当遇到有连续两行以上的空白行,就代换为一行的空白行
-v 或 --show-nonprinting

范例:
cat -n textfile1 > textfile2 把 textfile1 的档案内容加上行号后输入 textfile2 这个档案里
cat -b textfile1 textfile2 >> textfile3 把 textfile1 和 textfile2 的档案内容加上行号(空白行不加)之后将内容附加到 textfile3

名称 : cd
使用权限 : 所有使用者

使用方式 : cd [dirName]

说明 : 变换工作目录至 dirName。 其中 dirName 表示法可为绝对路径或相对路径。若目录名称省略,则变换至使用者的 home directory (也就是刚 login 时所在的目录)。

另外,"~" 也表示为 home directory 的意思,"." 则是表示目前所在的目录,".." 则表示目前目录位置的上一层目录。

范例 : 跳到 /usr/bin/ :
cd /usr/bin

跳到自己的 home directory :
cd ~

跳到目前目录的上上两层 :
cd ../..



指令名称 : chmod
使用权限 : 所有使用者

使用方式 : chmod [-cfvR] [--help] [--version] mode file...

说明 : Linux/Unix 的档案存取权限分为三级 : 档案拥有者、群组、其他。利用 chmod 可以藉以控制档案如何被他人所存取。

把计 :

mode : 权限设定字串,格式如下 : [ugoa...][+-=][rwxX]...][,...],其中u 表示该档案的拥有者,g 表示与该档案的拥有者属于同一个群体(group)者,o 表示其他以外的人,a 表示这三者皆是。
+ 表示增加权限、- 表示取消权限、= 表示唯一设定权限。
r 表示可读取,w 表示可写入,x 表示可执行,X 表示只有当该档案是个子目录或者该档案已经被设定过为可执行。
-c : 若该档案权限确实已经更改,才显示其更改动作
-f : 若该档案权限无法被更改也不要显示错误讯息
-v : 显示权限变更的详细资料
-R : 对目前目录下的所有档案与子目录进行相同的权限变更(即以递回的方式逐个变更)
--help : 显示辅助说明
--version : 显示版本

范例 :将档案 file1.txt 设为所有人皆可读取 :
chmod ugo+r file1.txt

将档案 file1.txt 设为所有人皆可读取 :
chmod a+r file1.txt

将档案 file1.txt 与 file2.txt 设为该档案拥有者,与其所属同一个群体者可写入,但其他以外的人则不可写入 :
chmod ug+w,o-w file1.txt file2.txt

将 ex1.py 设定为只有该档案拥有者可以执行 :
chmod u+x ex1.py

将目前目录下的所有档案与子目录皆设为任何人可读取 :
chmod -R a+r *

此外chmod也可以用数字来表示权限如 chmod 777 file
语法为:chmod abc file

其中a,b,c各为一个数字,分别表示User、Group、及Other的权限。

r=4,w=2,x=1
若要rwx属性则4+2+1=7;
若要rw-属性则4+2=6;
若要r-x属性则4+1=7。

范例:
chmod a=rwx file


chmod 777 file

效果相同
chmod ug=rwx,o=x file


chmod 771 file

效果相同





若用chmod 4755 filename可使此程式具有root的权限


指令名称 : chown
使用权限 : root

使用方式 : chmod [-cfhvR] [--help] [--version] user[:group] file...

说明 : Linux/Unix 是多人多工作业系统,所有的档案皆有拥有者。利用 chown 可以将档案的拥有者加以改变。一般来说,这个指令只有是由系统管理者(root)所使用,一般使用者没有权限可以改变别人的档案拥有者,也没有权限可以自己的档案拥有者改设为别人。只有系统管理者(root)才有这样的权限。

把计 :

user : 新的档案拥有者的使用者 IDgroup : 新的档案拥有者的使用者群体(group)-c : 若该档案拥有者确实已经更改,才显示其更改动作-f : 若该档案拥有者无法被更改也不要显示错误讯息-h : 只对于连结(link)进行变更,而非该 link 真正指向的档案-v : 显示拥有者变更的详细资料-R : 对目前目录下的所有档案与子目录进行相同的拥有者变更(即以递回的方式逐个变更)--help : 显示辅助说明--version : 显示版本

范例 :
将档案 file1.txt 的拥有者设为 users 群体的使用者 jessie :
chown jessie:users file1.txt

将目前目录下的所有档案与子目录的拥有者皆设为 users 群体的使用者 lamport :
chmod -R lamport:users *


名称:cp
使用权限:所有使用者

使用方式:

cp [options] source dest
cp [options] source... directory

说明:将一个档案拷贝至另一档案,或将数个档案拷贝至另一目录。

把计

-a 尽可能将档案状态、权限等资料都照原状予以复制。
-r 若 source 中含有目录名,则将目录下之档案亦皆依序拷贝至目的地。
-f 若目的地已经有相同档名的档案存在,则在复制前先予以删除再行复制。
范例:
将档案 aaa 复制(已存在),并命名为 bbb :
cp aaa bbb

将所有的C语言程式拷贝至 Finished 子目录中 :
cp *.c Finished



名称:cut

使用权限:所有使用者

用法:cut -cnum1-num2 filename

说明:显示每行从开头算起 num1 到 num2 的文字。

范例:

shell>> cat example
test2
this is test1
shell>> cut -c0-6 example ## print 开头算起前 6 个字元
test2
this i


名称 : find
用法 : find
使用说明 :

将档案系统内符合 expression 的档案列出来。你可以指要档案的名称、类别、时间、大小、权限等不同资讯的组合,只有完全相符的才会被列出来。

find 根据下列规则判断 path 和 expression,在命令列上第一个 - ( ) , ! 之前的部份为 path,之后的是 expression。如果 path 是空字串则使用目前路径,如果 expression 是空字串则使用 -print 为预设 expression

expression 中可使用的选项有二三十个之多,在此只介绍最常用的部份。

-mount, -xdev : 只检查和指定目录在同一个档案系统下的档案,避免列出其它档案系统中的档案
-amin n : 在过去 n 分钟内被读取过
-anewer file : 比档案 file 更晚被读取过的档案
-atime n : 在过去 n 天过读取过的档案
-cmin n : 在过去 n 分钟内被修改过
-cnewer file :比档案 file 更新的档案
-ctime n : 在过去 n 天过修改过的档案
-empty : 空的档案-gid n or -group name : gid 是 n 或是 group 名称是 name
-ipath p, -path p : 路径名称符合 p 的档案,ipath 会忽略大小写
-name name, -iname name : 档案名称符合 name 的档案。iname 会忽略大小写
-size n : 档案大小 是 n 单位,b 代表 512 位元组的区块,c 表示字元数,k 表示 kilo bytes,w 是二个位元组。-type c : 档案类型是 c 的档案。
d: 目录
c: 字型装置档案
b: 区块装置档案
p: 具名贮列
f: 一般档案
l: 符号连结
s: socket
-pid n : process id 是 n 的档案

你可以使用 ( ) 将运算式分隔,并使用下列运算。
exp1 -and exp2
! expr
-not expr
exp1 -or exp2
exp1, exp2
范例:
将目前目录及其子目录下所有延伸档名是 c 的档案列出来。
# find . -name "*.c"


将目前目录其其下子目录中所有一般档案列出
# find . -ftype f


将目前目录及其子目录下所有最近 20 分钟内更新过的档案列出
# find . -ctime -20



名称:less

使用权限:所有使用者

使用方式:

less [Option] filename

说明:
less 的作用与 more 十分相似,都可以用来浏览文字档案的内容,不同的是 less 允许使用者往回卷动
以浏览已经看过的部份,同时因为 less 并未在一开始就读入整个档案,因此在遇上大型档案的开启时,会比一般的文书编辑器(如 vi)来的快速。


范例:


指令名称 : ln
使用权限 : 所有使用者

使用方式 : ln [options] source dist,其中 option 的格式为 :

[-bdfinsvF] [-S backup-suffix] [-V {numbered,existing,simple}]
[--help] [--version] [--]
说明 : Linux/Unix 档案系统中,有所谓的连结(link),我们可以将其视为档案的别名,而连结又可分为两种 : 硬连结(hard link)与软连结(symbolic link),硬连结的意思是一个档案可以有多个名称,而软连结的方式则是产生一个特殊的档案,该档案的内容是指向另一个档案的位置。硬连结是存在同一个档案系统中,而软连结却可以跨越不同的档案系统。
ln source dist 是产生一个连结(dist)到 source,至于使用硬连结或软链结则由参数决定。

不论是硬连结或软链结都不会将原本的档案复制一份,只会占用非常少量的磁碟空间。


-f : 链结时先将与 dist 同档名的档案删除-d : 允许系统管理者硬链结自己的目录-i : 在删除与 dist 同档名的档案时先进行询问-n : 在进行软连结时,将 dist 视为一般的档案-s : 进行软链结(symbolic link)-v : 在连结之前显示其档名-b : 将在链结时会被覆写或删除的档案进行备份-S SUFFIX : 将备份的档案都加上 SUFFIX 的字尾-V METHOD : 指定备份的方式--help : 显示辅助说明--version : 显示版本
范例 :
将档案 yy 产生一个 symbolic link : zz
ln -s yy zz

将档案 yy 产生一个 hard link : zz
ln yy xx



名称:locate
使用权限:所有使用者
使用方式: locate [-q] [-d ] [--database=]
locate [-r ] [--regexp=]
locate [-qv] [-o ] [--output=]
locate [-e ] [-f ] <[-l ] [-c]
<[-U ] [-u]>
locate [-Vh] [--version] [--help]
说明:
locate 让使用者可以很快速的搜寻档案系统内是否有指定的档案。其方法是先建立一个包括系统内所有档案名称及路径的资料库,之后当寻找时就只需查询这个资料库,而不必实际深入档案系统之中了。

在一般的 distribution 之中,资料库的建立都被放在 contab 中自动执行。一般使用者在使用时只要用

# locate your_file_name

的型式就可以了。 参数:
-u
-U

建立资料库,-u 会由根目录开始,-U 则可以指定开始的位置。

-e


排除在寻找的范围之外。

-l
如果 是 1.则启动安全模式。在安全模式下,使用者不会看到权限无法看到的档案。这会始速度减慢,因为 locate 必须至实际的档案系统中取得档案的权限资料。

-f
将特定的档案系统排除在外,例如我们没有到理要把 proc 档案系统中的档案放在资料库中。

-q
安静模式,不会显示任何错误讯息。

-n
至多显示 个输出。

-r
使用正规运算式 做寻找的条件。

-o
指定资料库存的名称。

-d

指定资料库的路径

-h
显示辅助讯息

-v
显示更多的讯息

-V
显示程式的版本讯息 范例:

locate chdrv : 寻找所有叫 chdrv 的档案
locate -n 100 a.out : 寻找所有叫 a.out 的档案,但最多只显示 100 个
locate -u : 建立资料库


名称 : ls
使用权限 : 所有使用者

使用方式 : ls [-alrtAFR] [name...]

说明 : 显示指定工作目录下之内容(列出目前工作目录所含之档案及子目录)。


-a 显示所有档案及目录 (ls内定将档案名或目录名称开头为"."的视为隐藏档,不会列出)
-l 除档案名称外,亦将档案型态、权限、拥有者、档案大小等资讯详细列出
-r 将档案以相反次序显示(原定依英文字母次序)
-t 将档案依建立时间之先后次序列出
-A 同 -a ,但不列出 "." (目前目录) 及 ".." (父目录)
-F 在列出的档案名称后加一符号;例如可执行档则加 "*", 目录则加 "/"
-R 若目录下有档案,则以下之档案亦皆依序列出

范例:
列出目前工作目录下所有名称是 s 开头的档案,愈新的排愈后面 :
ls -ltr s*

将 /bin 目录以下所有目录及档案详细资料列出 :
ls -lR /bin

列出目前工作目录下所有档案及目录;目录于名称后加 "/", 可执行档于名称后加 "*" :
ls -AF

名称:more
使用权限:所有使用者
使用方式:more [-dlfpcsu] [-num] [+/pattern] [+linenum] [fileNames..]
说明:类似 cat ,不过会以一页一页的显示方便使用者逐页阅读,而最基本的指令就是按空白键(space)就往下一页显示,按 b 键就会往回(back)一页显示,而且还有搜寻字串的功能(与 vi 相似),使用中的说明文件,请按 h 。
参数:-num 一次显示的行数
-d 提示使用者,在画面下方显示 [Press space to continue, q to quit.] ,如果使用者按错键,则会显示 [Press h for instructions.] 而不是 哔 声
-l 取消遇见特殊字元 ^L(送纸字元)时会暂停的功能
-f 计算行数时,以实际上的行数,而非自动换行过后的行数(有些单行字数太长的会被扩展为两行或两行以上)
-p 不以卷动的方式显示每一页,而是先清除萤幕后再显示内容
-c 跟 -p 相似,不同的是先显示内容再清除其他旧资料
-s 当遇到有连续两行以上的空白行,就代换为一行的空白行
-u 不显示下引号 (根据环境变数 TERM 指定的 terminal 而有所不同)
+/ 在每个档案显示前搜寻该字串(pattern),然后从该字串之后开始显示
+num 从第 num 行开始显示
fileNames 欲显示内容的档案,可为复数个数
范例:
more -s testfile 逐页显示 testfile 之档案内容,如有连续两行以上空白行则以一行空白行显示。
more +20 testfile 从第 20 行开始显示 testfile 之档案内容。


名称:mv
使用权限:所有使用者

使用方式:

mv [options] source dest
mv [options] source... directory
说明:将一个档案移至另一档案,或将数个档案移至另一目录。
参数:-i 若目的地已有同名档案,则先询问是否覆盖旧档。

范例:

将档案 aaa 更名为 bbb :
mv aaa bbb

将所有的C语言程式移至 Finished 子目录中 :
mv -i *.c



名称:rm
使用权限:所有使用者

使用方式:rm [options] name...

说明:删除档案及目录。

把计

-i 删除前逐一询问确认。
-f 即使原档案属性设为唯读,亦直接删除,无需逐一确认。
-r 将目录及以下之档案亦逐一删除。
范例:
删除所有C语言程式档;删除前逐一询问确认 :
rm -i *.c

将 Finished 子目录及子目录中所有档案删除 :
rm -r Finished



名称:rmdir
使用权限:于目前目录有适当权限的所有使用者

使用方式: rmdir [-p] dirName

说明: 删除空的目录。

参数: -p 是当子目录被删除后使它也成为空目录的话,则顺便一并删除。

范例:

将工作目录下,名为 AAA 的子目录删除 :
rmdir AAA

在工作目录下的 BBB 目录中,删除名为 Test 的子目录。若 Test 删除后,BBB 目录成为空目录,则 BBB 亦予删除。
rmdir -p BBB/Test



名称:split
使用权限:所有使用者

使用方式:split [OPTION] [INPUT [PREFIX]

说明:

将一个档案分割成数个。而从 INPUT 分割输出成固定大小的档案,其档名依序为 PREFIXaa, PREFIXab...;PREFIX 预设值为 `x。若没有 INPUT 档或为 `-,则从标准输入读进资料。

匡兜

-b, --bytes=SIZE

SIZE 值为每一输出档案的大小,单位为 byte。
-C, --line-bytes=SIZE

每一输出档中,单行的最大 byte 数。
-l, --lines=NUMBER

NUMBER 值为每一输出档的列数大小。
-NUMBER

与 -l NUMBER 相同。
--verbose

于每个输出档被开启前,列印出侦错资讯到标准错误输出。
--help

显示辅助资讯然后离开。
--version

列出版本资讯然后离开。
SIZE 可加入单位: b 代表 512, k 代表 1K, m 代表 1 Meg。

范例:

PostgresSQL 大型资料库备份与回存:

因 Postgres 允许表格大过你系统档案的最大容量,所以要将表格 dump 到单一的档案可能会有问题,使用 split进行档案分割。


% pg_dump dbname split -b 1m - filename.dump .



重新载入


% createdb dbname
% cat filename.dump.* pgsql dbname



名称:touch
使用权限:所有使用者

使用方式:
touch [-acfm]
[-r reference-file] [--file=reference-file]
[-t MMDDhhmm[CC]YY][.ss]
[-d time] [--date=time] [--time={atime,access,use,mtime,modify}]
[--no-create] [--help] [--version]
file1 [file2 ...]


说明:
touch 指令改变档案的时间记录。 ls -l 可以显示档案的时间记录。


参数:
a 改变档案的读取时间记录。
m 改变档案的修改时间记录。
c 假如目的档案不存在,不会建立新的档案。与 --no-create 的效果一样。
f 不使用,是为了与其他 unix 系统的相容性而保留。
r 使用参考档的时间记录,与 --file 的效果一样。
d 设定时间与日期,可以使用各种不同的格式。
t 设定档案的时间记录,格式与 date 指令相同。
--no-create 不会建立新档案。
--help 列出指令格式。
--version 列出版本讯息。


范例:


最简单的使用方式,将档案的时候记录改为现在的时间。若档案不存在,系统会建立一个新的档案。

touch file
touch file1 file2

将 file 的时间记录改为 5 月 6 日 18 点 3 分,公元两千年。时间的格式可以参考 date 指令,至少需输入 MMDDHHmm ,就是月日时与分。

touch -c -t 05061803 file
touch -c -t 050618032000 file

将 file 的时间记录改变成与 referencefile 一样。

touch -r referencefile file

将 file 的时间记录改成 5 月 6 日 18 点 3 分,公元两千年。时间可以使用 am, pm 或是 24 小时的格式,日期可以使用其他格式如 6 May 2000 。

touch -d "6:03pm" file
touch -d "05/06/2000" file
touch -d "6:03pm 05/06/2000" file
名称 : at
使用权限 : 所有使用者

使用方式 : at -V [-q queue] [-f file] [-mldbv] TIME

说明 : at 可以让使用者指定在 TIME 这个特定时刻执行某个程式或指令,TIME 的格式是 HH:MM其中的 HH 为小时,MM 为分钟,甚至你也可以指定 am, pm, midnight, noon, teatime(就是下午 4 点锺)等口语词。

如果想要指定超过一天内的时间,则可以用 MMDDYY 或者 MM/DD/YY 的格式,其中 MM 是分钟,DD 是第几日,YY 是指年份。另外,使用者甚至也可以使用像是 now + 时间间隔来弹性指定时间,其中的时间间隔可以是 minutes, hours, days, weeks

另外,使用者也可指定 today 或 tomorrow 来表示今天或明天。当指定了时间并按下 enter 之后,at 会进入交谈模式并要求输入指令或程式,当你输入完后按下 ctrl+D 即可完成所有动作,至于执行的结果将会寄回你的帐号中。

把计 :

-V : 印出版本编号
-q : 使用指定的伫列(Queue)来储存,at 的资料是存放在所谓的 queue 中,使用者可以同时使用多个 queue,而 queue 的编号为 a, b, c... z 以及 A, B, ... Z 共 52 个
-m : 即使程式/指令执行完成后没有输出结果, 也要寄封信给使用者
-f file : 读入预先写好的命令档。使用者不一定要使用交谈模式来输入,可以先将所有的指定先写入档案后再一次读入
-l : 列出所有的指定 (使用者也可以直接使用 atq 而不用 at -l)
-d : 删除指定 (使用者也可以直接使用 atrm 而不用 at -d)
-v : 列出所有已经完成但尚未删除的指定

例子 :
三天后的下午 5 点锺执行 /bin/ls :
at 5pm + 3 days /bin/ls

三个星期后的下午 5 点锺执行 /bin/ls :
at 5pm + 2 weeks /bin/ls

明天的 17:20 执行 /bin/date :
at 17:20 tomorrow /bin/date

1999 年的最后一天的最后一分钟印出 the end of world !
at 23:59 12/31/1999 echo the end of world !




名称:cal

使用权限:所有使用者

使用方式:cal [-mjy] [month [year]

说明:

显示日历。若只有一个参数,则代表年份(1-9999),显示该年的年历。年份必须全部写出:``cal 89 将不会是显示 1989 年的年历。使用两个参数,则表示月份及年份。若没有参数则显示这个月的月历。
1752 年 9 月第 3 日起改用西洋新历,因这时大部份的国家都采用新历,有 10 天被去除,所以该月份的月历有些不同。在此之前为西洋旧历。

匡兜

-m : 以星期一为每周的第一天方式显示。
-j : 以凯撒历显示,即以一月一日起的天数显示。
-y : 显示今年年历。

范例:

cal : 显示本月的月历。



[root@mylinux /root]# date
Tue Aug 15 08:00:18 CST 2000
[root@mylinux /root]# cal
August 2000
Su Mo Tu We Th Fr Sa
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31

[root@mylinux /root]#


cal 2001 : 显示公元 2001 年年历。

[root@mylinux /root]# cal 2001
2001

January February March
Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa
1 2 3 4 5 6 1 2 3 1 2 3
7 8 9 10 11 12 13 4 5 6 7 8 9 10 4 5 6 7 8 9 10
14 15 16 17 18 19 20 11 12 13 14 15 16 17 11 12 13 14 15 16 17
21 22 23 24 25 26 27 18 19 20 21 22 23 24 18 19 20 21 22 23 24
28 29 30 31 25 26 27 28 25 26 27 28 29 30 31

April May June
Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa
1 2 3 4 5 6 7 1 2 3 4 5 1 2
8 9 10 11 12 13 14 6 7 8 9 10 11 12 3 4 5 6 7 8 9
15 16 17 18 19 20 21 13 14 15 16 17 18 19 10 11 12 13 14 15 16
22 23 24 25 26 27 28 20 21 22 23 24 25 26 17 18 19 20 21 22 23
29 30 27 28 29 30 31 24 25 26 27 28 29 30

July August September
Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa
1 2 3 4 5 6 7 1 2 3 4 1
8 9 10 11 12 13 14 5 6 7 8 9 10 11 2 3 4 5 6 7 8
15 16 17 18 19 20 21 12 13 14 15 16 17 18 9 10 11 12 13 14 15
22 23 24 25 26 27 28 19 20 21 22 23 24 25 16 17 18 19 20 21 22
29 30 31 26 27 28 29 30 31 23 24 25 26 27 28 29
30
October November December
Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa
1 2 3 4 5 6 1 2 3 1
7 8 9 10 11 12 13 4 5 6 7 8 9 10 2 3 4 5 6 7 8
14 15 16 17 18 19 20 11 12 13 14 15 16 17 9 10 11 12 13 14 15
21 22 23 24 25 26 27 18 19 20 21 22 23 24 16 17 18 19 20 21 22
28 29 30 31 25 26 27 28 29 30 23 24 25 26 27 28 29
30 31

[root@mylinux /root]#





cal 5 2001 : 显示公元 2001 年 5 月月历。



[root@mylinux /root]# cal 5 2001
May 2001
Su Mo Tu We Th Fr Sa
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31

[root@mylinux /root]#





cal -m : 以星期一为每周的第一天方式,显示本月的月历。



[root@mylinux /root]# cal -m
August 2000
Mo Tu We Th Fr Sa Su
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31

[root@mylinux /root]#





cal -jy : 以一月一日起的天数显示今年的年历。



[root@mylinux /root]# cal -jy
2000

January February
Sun Mon Tue Wed Thu Fri Sat Sun Mon Tue Wed Thu Fri Sat
1 32 33 34 35 36
2 3 4 5 6 7 8 37 38 39 40 41 42 43
9 10 11 12 13 14 15 44 45 46 47 48 49 50
16 17 18 19 20 21 22 51 52 53 54 55 56 57
23 24 25 26 27 28 29 58 59 60
30 31
March April
Sun Mon Tue Wed Thu Fri Sat Sun Mon Tue Wed Thu Fri Sat
61 62 63 64 92
65 66 67 68 69 70 71 93 94 95 96 97 98 99
72 73 74 75 76 77 78 100 101 102 103 104 105 106
79 80 81 82 83 84 85 107 108 109 110 111 112 113
86 87 88 89 90 91 114 115 116 117 118 119 120
121
May June
Sun Mon Tue Wed Thu Fri Sat Sun Mon Tue Wed Thu Fri Sat
122 123 124 125 126 127 153 154 155
128 129 130 131 132 133 134 156 157 158 159 160 161 162
135 136 137 138 139 140 141 163 164 165 166 167 168 169
142 143 144 145 146 147 148 170 171 172 173 174 175 176
149 150 151 152 177 178 179 180 181 182

July August
Sun Mon Tue Wed Thu Fri Sat Sun Mon Tue Wed Thu Fri Sat
183 214 215 216 217 218
184 185 186 187 188 189 190 219 220 221 222 223 224 225
191 192 193 194 195 196 197 226 227 228 229 230 231 232
198 199 200 201 202 203 204 233 234 235 236 237 238 239
205 206 207 208 209 210 211 240 241 242 243 244
212 213
September October
Sun Mon Tue Wed Thu Fri Sat Sun Mon Tue Wed Thu Fri Sat
245 246 275 276 277 278 279 280 281
247 248 249 250 251 252 253 282 283 284 285 286 287 288
254 255 256 257 258 259 260 289 290 291 292 293 294 295
261 262 263 264 265 266 267 296 297 298 299 300 301 302
268 269 270 271 272 273 274 303 304 305

November December
Sun Mon Tue Wed Thu Fri Sat Sun Mon Tue Wed Thu Fri Sat
306 307 308 309 336 337
310 311 312 313 314 315 316 338 339 340 341 342 343 344
317 318 319 320 321 322 323 345 346 347 348 349 350 351
324 325 326 327 328 329 330 352 353 354 355 356 357 358
331 332 333 334 335 359 360 361 362 363 364 365
366

[root@mylinux /root]#




名称 : crontab
使用权限 : 所有使用者

使用方式 :

crontab [ -u user ] filecrontab [ -u user ] { -l -r -e }
说明 :
crontab 是用来让使用者在固定时间或固定间隔执行程式之用,换句话说,也就是类似使用者的时程表。-u user 是指设定指定 user 的时程表,这个前提是你必须要有其权限(比如说是 root)才能够指定他人的时程表。如果不使用 -u user 的话,就是表示设定自己的时程表。

餐数 :

-e : 执行文字编辑器来设定时程表,内定的文字编辑器是 VI,如果你想用别的文字编辑器,则请先设定 VISUAL 环境变数来指定使用那个文字编辑器(比如说 setenv VISUAL joe)
-r : 删除目前的时程表
-l : 列出目前的时程表

时程表的格式如下 :
f1 f2 f3 f4 f5 program

其中 f1 是表示分钟,f2 表示小时,f3 表示一个月份中的第几日,f4 表示月份,f5 表示一个星期中的第几天。program 表示要执行的程式。
当 f1 为 * 时表示每分钟都要执行 program,f2 为 * 时表示每小时都要执行程式,其余类推
当 f1 为 a-b 时表示从第 a 分钟到第 b 分钟这段时间内要执行,f2 为 a-b 时表示从第 a 到第 b 小时都要执行,其余类推
当 f1 为 */n 时表示每 n 分钟个时间间隔执行一次,f2 为 */n 表示每 n 小时个时间间隔执行一次,其余类推
当 f1 为 a, b, c,... 时表示第 a, b, c,... 分钟要执行,f2 为 a, b, c,... 时表示第 a, b, c...个小时要执行,其余类推

使用者也可以将所有的设定先存放在档案 file 中,用 crontab file 的方式来设定时程表。
例子 :

每月每天每小时的第 0 分钟执行一次 /bin/ls :
0 7 * * * /bin/ls

在 12 月内, 每天的早上 6 点到 12 点中,每隔 20 分钟执行一次 /usr/bin/backup :
0 6-12/3 * 12 * /usr/bin/backup

周一到周五每天下午 5:00 寄一封信给
alex@domain.name :
0 17 * * 1-5 mail -s "hi"
alex@domain.name < /tmp/maildata

每月每天的午夜 0 点 20 分, 2 点 20 分, 4 点 20 分....执行 echo "haha"
20 0-23/2 * * * echo "haha"

注意 :

当程式在你所指定的时间执行后,系统会寄一封信给你,显示该程式执行的内容,若是你不希望收到这样的信,请在每一行空一格之后加上 > /dev/null 2>&1 即可。

名称 : date
使用权限 : 所有使用者

使用方式 :

date [-u] [-d datestr] [-s datestr] [--utc] [--universal] [--date=datestr] [--set=datestr] [--help] [--version] [+formAT] [MMDDhhmm[CC]YY][.ss]

说明 :

date 可以用来显示或设定系统的日期与时间,在显示方面,使用者可以设定欲显示的格式,格式设定为一个加号后接数个标记,其中可用的标记列表如下 :

时间方面 :

% : 印出 %
%n : 下一行
%t : 跳格
%H : 小时(00..23)
%I : 小时(01..12)
%k : 小时(0..23)
%l : 小时(1..12)
%M : 分钟(00..59)
%p : 显示本地 AM 或 PM
%r : 直接显示时间 (12 小时制,格式为 hh:mm:ss [AP]M)
%s : 从 1970 年 1 月 1 日 00:00:00 UTC 到目前为止的秒数
%S : 秒(00..61)
%T : 直接显示时间 (24 小时制)
%X : 相当于 %H:%M:%S
%Z : 显示时区

日期方面 :
%a : 星期几 (Sun..Sat)
%A : 星期几 (Sunday..Saturday)
%b : 月份 (Jan..Dec)
%B : 月份 (January..December)
%c : 直接显示日期与时间
%d : 日 (01..31)
%D : 直接显示日期 (mm/dd/yy)
%h : 同 %b
%j : 一年中的第几天 (001..366)
%m : 月份 (01..12)
%U : 一年中的第几周 (00..53) (以 Sunday 为一周的第一天的情形)
%w : 一周中的第几天 (0..6)
%W : 一年中的第几周 (00..53) (以 Monday 为一周的第一天的情形)
%x : 直接显示日期 (mm/dd/yy)
%y : 年份的最后两位数字 (00.99)
%Y : 完整年份 (0000..9999)

若是不以加号作为开头,则表示要设定时间,而时间格式为 MMDDhhmm[CC]YY][.ss],其中 MM 为月份,DD 为日,hh 为小时,mm 为分钟,CC 为年份前两位数字,YY 为年份后两位数字,ss 为秒数
把计 :

-d datestr : 显示 datestr 中所设定的时间 (非系统时间)
--help : 显示辅助讯息
-s datestr : 将系统时间设为 datestr 中所设定的时间
-u : 显示目前的格林威治时间
--version : 显示版本编号

例子 :
显示时间后跳行,再显示目前日期 :
date +%T%n%D

显示月份与日数 :
date +%B %d

显示日期与设定时间(12:34:56) :
date --date 12:34:56

注意 :

当你不希望出现无意义的 0 时(比如说 1999/03/07),则可以在标记中插入 - 符号,比如说 date +%-H:%-M:%-S 会把时分秒中无意义的 0 给去掉,像是原本的 08:09:04 会变为 8:9:4。另外,只有取得权限者(比如说 root)才能设定系统时间。

当你以 root 身分更改了系统时间之后,请记得以 clock -w 来将系统时间写入 CMOS 中,这样下次重新开机时系统时间才会持续抱持最新的正确值。


名称 : sleep
使用权限 : 所有使用者

使用方式 : sleep [--help] [--version] number[smhd]

说明 : sleep 可以用来将目前动作延迟一段时间

参数说明 :

--help : 显示辅助讯息
--version : 显示版本编号
number : 时间长度,后面可接 s、m、h 或 d
其中 s 为秒,m 为 分钟,h 为小时,d 为日数

例子 :
显示目前时间后延迟 1 分钟,之后再次显示时间 :
date;sleep 1m;date



名称: time
使用权限: 所有使用者

使用方式: time [options] COMMAND [arguments]

说明: time 指令的用途,在于量测特定指令执行时所需消耗的时间及系统资源等资讯。例如 CPU 时间、记忆体、输入输出等等。需要特别注意的是,部分资讯在 Linux 上显示不出来。这是因为在 Linux 上部分资源的分配函式与 time 指令所预设的方式并不相同,以致于 time 指令无法取得这些资料。

把计

-o or --output=FILE
设定结果输出档。这个选项会将 time 的输出写入 所指定的档案中。如果档案已经存在,系统将覆写其内容。
-a or --append
配合 -o 使用,会将结果写到档案的末端,而不会覆盖掉原来的内容。
-f formAT or --format=formAT
以 formAT 字串设定显示方式。当这个选项没有被设定的时候,会用系统预设的格式。不过你可以用环境变数 time 来设定这个格式,如此一来就不必每次登入系统都要设定一次。
一般设定上,你可以用
t
表示跳栏,或者是用
n
表示换行。每一项资料要用 % 做为前导。如果要在字串中使用百分比符号,就用 。(学过 C 语言的人大概会觉得很熟悉)
time 指令可以显示的资源有四大项,分别是:

Time resources
Memory resources
IO resources
Command info

详细的内容如下:


Time Resources
E 执行指令所花费的时间,格式是:[hour]:minute:second。请注意这个数字并不代表实际的 CPU 时间。
e 执行指令所花费的时间,单位是秒。请注意这个数字并不代表实际的 CPU 时间。
S 指令执行时在核心模式(kernel mode)所花费的时间,单位是秒。
U 指令执行时在使用者模式(user mode)所花费的时间,单位是秒。
P 执行指令时 CPU 的占用比例。其实这个数字就是核心模式加上使用者模式的 CPU 时间除以总时间。


Memory Resources
M 执行时所占用的实体记忆体的最大值。单位是 KB
t 执行时所占用的实体记忆体的平均值,单位是 KB
K 执行程序所占用的记忆体总量(stack+data+text)的平均大小,单位是 KB
D 执行程序的自有资料区(unshared data area)的平均大小,单位是 KB
p 执行程序的自有堆叠(unshared stack)的平均大小,单位是 KB
X 执行程序间共享内容(shared text)的平均值,单位是 KB
Z 系统记忆体页的大小,单位是 byte。对同一个系统来说这是个常数


IO Resources
F 此程序的主要记忆体页错误发生次数。所谓的主要记忆体页错误是指某一记忆体页已经置换到置换档(swap file)中,而且已经分配给其他程序。此时该页的内容必须从置换档里再读出来。
R 此程序的次要记忆体页错误发生次数。所谓的次要记忆体页错误是指某一记忆体页虽然已经置换到置换档中,但尚未分配给其他程序。此时该页的内容并未被破坏,不必从置换档里读出来
W 此程序被交换到置换档的次数
c 此程序被强迫中断(像是分配到的 CPU 时间耗尽)的次数
w 此程序自愿中断(像是在等待某一个 I/O 执行完毕,像是磁碟读取等等)的次数
I 此程序所输入的档案数
O 此程序所输出的档案数
r 此程序所收到的 Socket Message
s 此程序所送出的 Socket Message
k 此程序所收到的信号 ( Signal )数量


Command Info
C 执行时的参数以及指令名称
x 指令的结束代码 ( Exit Status )




-p or --portability
这个选项会自动把显示格式设定成为:
real %e
user %U
sys %S
这么做的目的是为了与 POSIX 规格相容。
-v or --verbose
这个选项会把所有程式中用到的资源通通列出来,不但如一般英文语句,还有说明。对不想花时间去熟习格式设定或是刚刚开始接触这个指令的人相当有用。

范例:
利用下面的指令
time -v ps -aux

我们可以获得执行 ps -aux 的结果和所花费的系统资源。如下面所列的资料:
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.4 1096 472 ? S Apr19 0:04 init
root 2 0.0 0.0 0 0 ? SW Apr19 0:00 [kflushd]
root 3 0.0 0.0 0 0 ? SW Apr19 0:00 [kpiod]
......
root 24269 0.0 1.0 2692 996 pts/3 R 12:16 0:00 ps -aux

Command being timed: "ps -aux"
User time (seconds): 0.05
System time (seconds): 0.06
Percent of CPU this job got: 68%
Elapsed (wall clock) time (h:mm:ss or m:ss): 0: 00.16
Average shared text size (kbytes): 0
Average unshared data size (kbytes): 0
Average stack size (kbytes): 0
Average total size (kbytes): 0
Maximum resident set size (kbytes): 0
Average resident set size (kbytes): 0
Major (requiring I/O) page faults: 238
Minor (reclaiming a frame) page faults: 46
Voluntary context switches: 0
Involuntary context switches: 0
Swaps: 0
File system inputs: 0
File system outputs: 0
Socket messages sent: 0
Socket messages received: 0
Signals delivered: 0
Page size (bytes): 4096
Exit status: 0



名称: uptime
使用权限: 所有使用者
使用方式: uptime [-V]
说明: uptime 提供使用者下面的资讯,不需其他参数:

现在的时间
系统开机运转到现在经过的时间
连线的使用者数量
最近一分钟,五分钟和十五分钟的系统负载
参数: -V 显示版本资讯。
范例: uptime
其结果为:
10:41am up 5 days, 10 min, 1 users, load average: 0.00, 0.00, 1.99

名称:chfn

使用权限:所有使用者

用法:shell>> chfn

说明:提供使用者更改个人资讯,用于 finger and mail username

范例:

shell>> chfn
Changing finger information for user
Password: [del]
Name[]:Johnney Huang ### 提供 finger 时的资料
Office[]:NCCU
Office Phone[]: [del]
Home Phone[]: [del]


名称:chsh

使用权限:所有使用者

用法:shell>> chsh

说明:更改使用者 shell 设定

范例:

shell>> chsh
Changing fihanging shell for user1
Password: [del]
New shell [/bin/tcsh]: ### [是目前使用的 shell]
[del]

shell>> chsh -l ### 展示 /etc/shells 档案内容
/bin/bash
/bin/sh
/bin/ash
/bin/bsh
/bin/tcsh
/bin/csh



" finger [返回]
名称: finger
使用权限: 所有使用者

使用方式: finger [options] user[@address]

说明:finger 可以让使用者查询一些其他使用者的资料。会列出来的资料有:

Login Name
User Name
Home directory
Shell
Login status
mail status
.plan
.project
.forward

其中 .plan ,.project 和 .forward 就是使用者在他的 Home Directory 里的 .plan , .project 和 .forward 等档案里的资料。如果没有就没有。finger 指令并不限定于在同一伺服器上查询,也可以寻找某一个远端伺服器上的使用者。只要给一个像是 E-mail address 一般的地址即可。
把计

-l
多行显示。

-s
单行显示。这个选项只显示登入名称,真实姓名,终端机名称,闲置时间,登入时间,办公室号码及电话号码。如果所查询的使用者是远端伺服器的使用者,这个选项无效。

范例:下列指令可以查询本机管理员的资料:
finger root

其结果如下:
Login: root Name: root
Directory: /root Shell: /bin/bash
Never logged in.
No mail.
No Plan.




名称:last

使用权限:所有使用者

使用方式:shell>> last [options]

说明:显示系统开机以来获是从每月初登入者的讯息

把计

-R 省略 hostname 的栏位
-num 展示前 num 个
username 展示 username 的登入讯息
tty 限制登入讯息包含终端机代号

范例:

shell>> last -R -2
johnney pts/1 Mon Aug 14 20:42 still logged in
johnney pts/0 Mon Aug 14 19:59 still logged in

wtmp begins Tue Aug 1 09:01:10 2000 ### /var/log/wtmp


shell>> last -2 minery
minery pts/0 140.119.217.115 Mon Aug 14 18:37 - 18:40 (00:03)
minery pts/0 140.119.217.115 Mon Aug 14 17:22 - 17:24 (00:02)

wtmp begins Tue Aug 1 09:01:10 2000




名称:login

这个命令都不会就不要干算了!呵呵我也不在这里多费笔墨耽误大家美好青春了^_^



名称:passwd

使用权限:所有使用者

使用方式:passwd [-k] [-l] [-u [-f] [-d] [-S] [username]

说明:用来更改使用者的密码

参数:
-k

-l

-u

-f

-d 关闭使用者的密码认证功能, 使用者在登入时将可以不用输入密码, 只有具备 root 权限的使用者方可使用.

-S 显示指定使用者的密码认证种类, 只有具备 root 权限的使用者方可使用.

[username] 指定帐号名称.

名称 : who
使用权线 : 所有使用者都可使用

使用方式 : who - [husfV] [user]

说明 : 显示系统中有那些使用者正在上面,显示的资料包含了使用者 ID,使用的终端机,从那边连上来的,上线时间,呆滞时间,CPU 使用量,动作等等。

把计 :

-h : 不要显示标题列
-u : 不要显示使用者的动作/工作
-s : 使用简短的格式来显示
-f : 不要显示使用者的上线位置
-V : 显示程式版本
名称:/etc/aliases
使用权限:系统管理者
使用方式: 请用 newaliases 更新资料库
说明:
sendmail 会使用一个在 /etc/aliases 中的档案做使用者名称转换的动作。当 sendmail 收到一个要送给 xxx 的信时,它会依据 aliases档的内容送给另一个使用者。这个功能可以创造一个只有在信件系统内才有效的使用者。例如 mailing list 就会用到这个功能,在 mailinglist 中,我们可能会创造一个叫 redlinux@link.ece.uci.edu 的 mailinglist,但实际上并没有一个叫 redlinux 的使用者。实际 aliases 档的内容是将送给这个使用者的信都收给 mailing list 处理程式负责分送的工作。

/etc/aliases 是一个文字模式的档案,sendmail 需要一个二进位格式的 /etc/aliases.db。newaliases 的功能传是将 /etc/aliases 转换成一个 sendmail 所能了解的资料库。范例:
# newaliases

下面命令会做相同的事,
# sendmail -bi

相关命令:
mail, mailq, newaliases, sendmail

" mail [返回]
名称:mail

使用权限:所有使用者


使用方式:mail [-iInv] [-s subject] [-c cc-addr] [-b bcc-addr] user1 [user 2 ...]


说明:
mail 不仅只是一个指令, mail 还是一个电子邮件程式,不过利用 mail 来读信的人应该很少吧!对于系统管理者来说 mail 就很有用,因为管理者可以用 mail 写成 script ,定期寄一些备忘录提醒系统的使用者。


参数:
i 忽略 tty 的中断讯号。 (interrupt)
I 强迫设成互动模式。 (Interactive)
v 列印出讯息,例如送信的地点、状态等等。 (verbose)
n 不读入 mail.rc 设定档。
s 邮件标题。
c cc 邮件地址。
b bcc 邮件地址。


范例:


将信件送给一个或以上的电子邮件地址,由于没有加入其他的选项,使用者必须输入标题与信件的内容等。而 user2 没有主机位置,就会送给邮件伺服器的 user2 使用者。

mail user1@email.address
mail user1@email.address user2

将 mail.txt 的内容寄给 user2 同时 cc 给 user1 。如果将这一行指令设成 cronjob 就可以定时将备忘录寄给系统使用者。

mail -s 标题 -c user1 user2 < mail.txt

指令:mesg
使用权限 : 所有使用者

使用方式 : mesg [yn]

说明 : 决定是否允许其他人传讯息到自己的终端机介面


把计 

y : 允许讯息传到终端机介面上。
n : 不允许讯息传到终端机介面上 。
如果没有设定,则讯息传递与否则由终端机界面目前状态而定。

例子 :
改变目前讯息设定,改成不允许讯息传到终端机介面上 :
mesg n


与 mesg 相关的指令有: talk,write,wall。


名称:/etc/aliases
使用权限:系统管理者
使用方式: newaliases
说明:
sendmail 会使用一个在 /etc/aliases 中的档案做使用者名称转换的动作。当 sendmail 收到一个要送给 xxx 的信时,它会依据 aliases档的内容送给另一个使用者。这个功能可以创造一个只有在信件系统内才有效的使用者。例如 mailing list 就会用到这个功能,在 mailinglist 中,我们可能会创造一个叫 redlinux@link.ece.uci.edu 的 mailinglist,但实际上并没有一个叫 redlinux 的使用者。实际 aliases 档的内容是将送给这个使用者的信都收给 mailing list 处理程式负责分送的工作。

/etc/aliases 是一个文字模式的档案,sendmail 需要一个二进位格式的 /etc/aliases.db。newaliases 的功能传是将 /etc/aliases 转换成一个 sendmail 所能了解的资料库。

参数:没有任何参数。 范例:
# newaliases

下面命令会做相同的事,
# sendmail -bi

相关命令:
mail, mailq, newaliases, sendmail

名称 : talk
使用权限 : 所有使用者

使用方式 :

talk person [ttyname]
说明 : 与其他使用者对谈

把计 :

person : 预备对谈的使用者帐号,如果该使用者在其他机器上,则可输入 person@machine.name
ttyname : 如果使用者同时有两个以上的 tty 连线,可以自行选择合适的 tty 传讯息

例子.1 :

与现在机器上的使用者Rollaend对谈,此时 Rollaend 只有一个连线 :
talk Rollaend


接下来就是等Rollaend回应,若Rollaend接受,则Rollaend输入 `talk jzlee`即可开始对谈,结束请按 ctrl+c

例子.2 :与linuxfab.cx上的使用者Rollaend对谈,使用pts/2来对谈 :
talk Rollaend@linuxfab.cx pts/2


接下来就是等Rollaend回应,若Rollaend接受,则Rollaend输入 `talk jzlee@jzlee.home`即可开始对谈,结束请按 ctrl+c

注意 : 若萤幕的字会出现不正常的字元,试着按 ctrl+l 更新萤幕画面。


名称 : wall
使用权限 : 所有使用者

使用方式 :

wall [ message ]
使用说明:
wall 会将讯息传给每一个 mesg 设定为 yes 的上线使用者。当使用终端机介面做为标准传入时, 讯息结束时需加上 EOF (通常用 Ctrl+D)

例子 :

传讯息"hi" 给每一个使用者 :
wall hi


名称 : write
使用权限 : 所有使用者

使用方式 :

write user [ttyname]
说明 : 传讯息给其他使用者

把计 :

user : 预备传讯息的使用者帐号
ttyname : 如果使用者同时有两个以上的 tty 连线,可以自行选择合适的 tty 传讯息

例子.1 :

传讯息给 Rollaend,此时 Rollaend 只有一个连线 :
write Rollaend


接下来就是将讯息打上去,结束请按 ctrl+c

例子.2 :传讯息给 Rollaend,Rollaend 的连线有 pts/2,pts/3 :
write Rollaend pts/2


接下来就是将讯息打上去,结束请按 ctrl+c

注意 : 若对方设定 mesg n,则此时讯席将无法传给对方

名称:kill
使用权限:所有使用者

使用方式:

kill [ -s signal -p ] [ -a ] pid ...
kill -l [ signal ]
说明:kill 送出一个特定的信号 (signal) 给行程 id 为 pid 的行程根据该信号而做特定的动作, 若没有指定, 预设是送出终止 (TERM) 的信号
把计

-s (signal) : 其中可用的讯号有 HUP (1), KILL (9), TERM (15), 分别代表着重跑, 砍掉, 结束; 详细的信号可以用 kill -l
-p : 印出 pid , 并不送出信号
-l (signal) : 列出所有可用的信号名称
范例:

将 pid 为 323 的行程砍掉 (kill) :
kill -9 323

将 pid 为 456 的行程重跑 (restart) :
kill -HUP 456


名称:nice
使用权限:所有使用者

使用方式:nice [-n adjustment] [-adjustment] [--adjustment=adjustment] [--help] [--version] [command [arg...]]

说明:以更改过的优先序来执行程式, 如果未指定程式, 则会印出目前的排程优先序, 内定的 adjustment 为 10, 范围为 -20 (最高优先序) 到 19 (最低优先序)


把计

-n adjustment, -adjustment, --adjustment=adjustment 皆为将该原有优先序的增加 adjustment
--help 显示求助讯息
--version 显示版本资讯
范例:
将 ls 的优先序加 1 并执行 :
nice -n 1 ls

将 ls 的优先序加 10 并执行 :
nice ls将 ls 的优先序加 10 并执行

注意 : 优先序 (priority) 为作业系统用来决定 CPU 分配的参数,Linux 使用『回合制(round-robin)』的演算法来做 CPU 排程,优先序越高,所可能获得的 CPU时间就越多。

名称:ps
使用权限:所有使用者
使用方式:ps [options] [--help]
说明:显示瞬间行程 (process) 的动态
参数:
ps 的参数非常多, 在此仅列出几个常用的参数并大略介绍含义
-A 列出所有的行程
-w 显示加宽可以显示较多的资讯
-au 显示较详细的资讯
-aux 显示所有包含其他使用者的行程

au(x) 输出格式 :

USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
USER: 行程拥有者
PID: pid
%CPU: 占用的 CPU 使用率
%MEM: 占用的记忆体使用率
VSZ: 占用的虚拟记忆体大小
RSS: 占用的记忆体大小
TTY: 终端的次要装置号码 (minor device number of tty)
STAT: 该行程的状态:
D: 不可中断的静止 (通悸□□缜b进行 I/O 动作)
R: 正在执行中
S: 静止状态
T: 暂停执行
Z: 不存在但暂时无法消除
W: 没有足够的记忆体分页可分配
<: 高优先序的行程
N: 低优先序的行程
L: 有记忆体分页分配并锁在记忆体内 (即时系统或捱A I/O)
START: 行程开始时间
TIME: 执行的时间
COMMAND:所执行的指令

范例:

ps
PID TTY TIME CMD
2791 ttyp0 00:00:00 tcsh
3092 ttyp0 00:00:00 ps
% ps -A
PID TTY TIME CMD
1 ? 00:00:03 init
2 ? 00:00:00 kflushd
3 ? 00:00:00 kpiod
4 ? 00:00:00 kswapd
5 ? 00:00:00 mdrecoveryd
.......
% ps -aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.7 1096 472 ? S Sep10 0:03 init [3]
root 2 0.0 0.0 0 0 ? SW Sep10 0:00 [kflushd]
root 3 0.0 0.0 0 0 ? SW Sep10 0:00 [kpiod]
root 4 0.0 0.0 0 0 ? SW Sep10 0:00 [kswapd]
........

名称:pstree
使用权限:所有使用者
使用方式:
pstree [-a] [-c] [-h-Hpid] [-l] [-n] [-p] [-u] [-G-U] [piduser]
pstree -V
说明:将所有行程以树状图显示, 树状图将会以 pid (如果有指定) 或是以 init 这个基本行程为根 (root) ,如果有指定使用者 id , 则树状图会只显示该使用者所拥有的行程
参数:
-a 显示该行程的完整指令及参数, 如果是被记忆体置换出去的行程则会加上括号
-c 如果有重覆的行程名, 则分开列出 (预设值是会在前面加上 *
范例:

pstree

init-+-amd
-apmd
-atd
-httpd---10*[httpd]
%pstree -p
init(1)-+-amd(447)
-apmd(105)
-atd(339)
%pstree -c
init-+-amd
-apmd
-atd
-httpd-+-httpd
-httpd
-httpd
-httpd
....

名称:renice
使用权限:所有使用者

使用方式:renice priority [[-p] pid ...] [[-g] pgrp ...] [[-u] user ...]

说明:重新指定一个或多个行程(Process)的优先序(一个或多个将根据所下的参数而定)

把计

-p pid 重新指定行程的 id 为 pid 的行程的优先序
-g pgrp 重新指定行程群组(process group)的 id 为 pgrp 的行程 (一个或多个) 的优先序
-u user 重新指定行程拥有者为 user 的行程的优先序
范例:
将行程 id 为 987 及 32 的行程与行程拥有者为 daemon 及 root 的优先序号码加 1 :
renice +1 987 -u daemon root -p 32

注意 : 每一个行程(Process)都有一个唯一的 (unique) id

名称:top
使用权限:所有使用者

使用方式:top [-] [d delay] [q] [c] [S] [s] [i] [n] [b]

说明:即时显示 process 的动态

把计

d : 改变显示的更新速度,或是在交谈式指令列( interactive command)按 s
q : 没有任何延迟的显示速度,如果使用者是有 superuser 的权限,则 top 将会以最高的优先序执行
c : 切换显示模式,共有两种模式,一是只显示执行档的名称,另一种是显示完整的路径与名称S : 累积模式,会将己完成或消失的子行程 ( dead child process ) 的 CPU time 累积起来
s : 安全模式,将交谈式指令取消, 避免潜在的危机
i : 不显示任何闲置 (idle) 或无用 (zombie) 的行程
n : 更新的次数,完成后将会退出 top
b : 批次档模式,搭配 "n" 参数一起使用,可以用来将 top 的结果输出到档案内

范例:
显示更新十次后退出 ;
top -n 10

使用者将不能利用交谈式指令来对行程下命令 :
top -s

将更新显示二次的结果输入到名称为 top.log 的档案里 :
top -n 2 -b < top.log

名称:skill

使用权限:所有使用者

使用方式: skill [signal to send] [options] 选择程序的规则

说明:

送个讯号给正在执行的程序,预设的讯息为 TERM (中断) , 较常使用的讯息为 HUP , INT , KILL , STOP , CONT ,和 0

讯息有三种写法:分别为 -9 , -SIGKILL , -KILL , 可以使用 -l 或 -L 已列出可使用的讯息。

一般参数:

-f 快速模式/尚未完成

-i 互动模式/ 每个动作将要被确认

-v 详细输出/ 列出所选择程序的资讯

-w 智能警告讯息/ 尚未完成

-n 没有动作/ 显示程序代号

参数:选择程序的规则可以是, 终端机代号,使用者名称,程序代号,命令名称。

-t 终端机代号 ( tty 或 pty )

-u 使用者名称

-p 程序代号 ( pid )

-c 命令名称 可使用的讯号:

以下列出已知的讯号名称,讯号代号,功能。

名称 (代号) 功能/ 描述

ALRM 14 离开

HUP 1 离开

INT 2 离开

KILL 9 离开/ 强迫关闭

PIPE 13 离开

POLL 离开

PROF 离开

TERM 15 离开

USR1 离开

USR2 离开

VTALRM 离开

STKFLT 离开/ 只适用于i386, m68k, arm 和 ppc 硬体

UNUSED 离开/ 只适用于i386, m68k, arm 和 ppc 硬体

TSTP 停止 /产生与内容相关的行为

TTIN 停止 /产生与内容相关的行为

TTOU 停止 /产生与内容相关的行为

STOP 停止 /强迫关闭

CONT 从新启动 /如果在停止状态则从新启动,否则忽略

PWR 忽略 /在某些系统中会离开

WINCH 忽略

CHLD 忽略

ABRT 6 核心

FPE 8 核心

ILL 4 核心

QUIT 3 核心

SEGV 11 核心

TRAP 5 核心

SYS 核心 /或许尚未实作

EMT 核心 /或许尚未实作

BUS 核心 /核心失败

XCPU 核心 /核心失败

XFSZ 核心 /核心失败

范例:

停止所有在 PTY 装置上的程序
skill -KILL -v pts/*

停止三个使用者 user1 , user2 , user3
skill -STOP user1 user2 user3

其他相关的命令: kill

名称:expr

使用权限:所有使用者
### 字串长度

shell>> expr length "this is a test"
14

### 数字商数

shell>> expr 14 % 9
5

### 从位置处抓取字串

shell>> expr substr "this is a test" 3 5
is is

### 数字串 only the first character

shell>> expr index "testforthegame" e
2

### 字串真实重现

shell>> expr quote thisisatestformela
thisisatestformela


名称: tr

### 1.比方说要把目录下所有的大写档名换为小写档名?

似乎有很多方式,"tr"是其中一种:

#!/bin/sh

dir="/tmp/testdir";
files=`find $dir -type f`;
for i in $files
do
dir_name=`dirname $i`;
ori_filename=`basename $i`
new_filename=`echo $ori_filename tr [:upper:] [:lower:]` > /dev/null;
#echo $new_filename;
mv $dir_name/$ori_filename $dir_name/$new_filename
done


### 2.自己试验中...lowercase to uppercase

tr abcdef...[del] ABCDE...[del]
tr a-z A-Z
tr [:lower:] [:upper:]

shell>> echo "this is a test" tr a-z A-Z > www
shell>> cat www
THIS IS A TEST

### 3.去掉不想要的字串

shell>> tr -d this ### 去掉有关 t.e.s.t
this

man
man
test
e

### 4.取代字串

shell>> tr -s "this" "TEST"
this
TEST
th
TE


指令:clear
用途:清除萤幕用。

使用方法:在 console 上输入 clear。


名称: reset, tset
使用方法: tset [-IQqrs] [-] [-e ch] [-i ch] [-k ch] [-m mapping] [terminal]

使用说明:

reset 其实和 tset 是一同个命令,它的用途是设定终端机的状态。一般而言,这个命令会自动的从环境变数、命令列或是其它的组态档决定目前终端机的型态。如果指定型态是 ? 的话,这个程式会要求使用者输入终端机的型别。

由于这个程式会将终端机设回原始的状态,除了在 login 时使用外,当系统终端机因为程式不正常执行而进入一些奇怪的状态时,你也可以用它来重设终端机o 例如不小心把二进位档用 cat 指令进到终端机,常会有终端机不再回应键盘输入,或是回应一些奇怪字元的问题。此时就可以用 reset 将终端机回复至原始状态。选项说明:


-p
将终端机类别显示在萤幕上,但不做设定的动作。这个命令可以用来取得目前终端机的类别。
-e ch
将 erase 字元设成 ch
-i ch
将中断字元设成 ch
-k ch
将删除一行的字元设成 ch
-I
不要做设定的动作,如果没有使用选项 -Q 的话,erase、中断及删除字元的目前值依然会送到萤幕上。
-Q
不要显示 erase、中断及删除字元的值到萤幕上。
-r
将终端机类别印在萤幕上。
-s
将设定 TERM 用的命令用字串的型式送到终端机中,通常在 .login 或 .profile 中用
范例:
让使用者输入一个终端机型别并将终端机设到该型别的预设状态。
# reset ?

将 erase 字元设定 control-h
# reset -e ^B

将设定用的字串显示在萤幕上
# reset -s
Erase is control-B (^B).
Kill is control-U (^U).
Interrupt is control-C (^C).
TERM=xterm;

名称:compress

使用权限:所有使用者


使用方式:compress [-dfvcV] [-b maxbits] [file ...]


说明:
compress 是一个相当古老的 unix 档案压缩指令,压缩后的档案会加上一个 .Z 延伸档名以区别未压缩的档案,压缩后的档案可以以 uncompress 解压。若要将数个档案压成一个压缩档,必须先将档案 tar 起来再压缩。由于 gzip 可以产生更理想的压缩比例,一般人多已改用 gzip 为档案压缩工具。


参数:
c 输出结果至标准输出设备(一般指荧幕)
f 强迫写入档案,若目的档已经存在,则会被覆盖 (force)
v 将程式执行的讯息印在荧幕上 (verbose)
b 设定共同字串数的上限,以位元计算,可以设定的值为 9 至 16 bits 。由于值越大,能使用的共同字串就 越多,压缩比例就越大,所以一般使用预设值 16 bits (bits)
d 将压缩档解压缩
V 列出版本讯息


范例:


将 source.dat 压缩成 source.dat.Z ,若 source.dat.Z 已经存在,内容则会被压缩档覆盖。

compress -f source.dat

将 source.dat 压缩成 source.dat.Z ,并列印出压缩比例。
-v 与 -f 可以一起使用

compress -vf source.dat

将压缩后的资料输出后再导入 target.dat.Z 可以改变压缩档名。

compress -c source.dat > target.dat.Z

-b 的值越大,压缩比例就越大,范围是 9-16 ,预设值是 16 。

compress -b 12 source.dat

将 source.dat.Z 解压成 source.dat ,若档案已经存在,使用者按 y 以确定覆盖档案,若使用 -df 程式则会自动覆盖档案。由于系统会自动加入 .Z 为延伸档名,所以 source.dat 会自动当作 source.dat.Z 处理。

compress -d source.dat
compress -d source.dat.Z


名称: lpd

使用权限: 所有使用者

使用方式:lpd [-l] [#port]
lpd 是一个常驻的印表机管理程式,它会根据 /etc/printcap 的内容来管理本地或远端的印表机。/etc/printcap 中定义的每一个印表机必须在 /var/lpd 中有一个相对应的目录,目录中以 cf 开头的档案表示一个等待送到适当装置的印表工作。这个档案通常是由 lpr 所产生。

lpr 和 lpd 组成了一个可以离线工作的系统,当你使用 lpr 时,印表机不需要能立即可用,甚至不用存在。lpd 会自动监视印表机的状况,当印表机上线后,便立即将档案送交处理。这个得所有的应用程式不必等待印表机完成前一工作。

参数:


-l: 将一些除错讯息显示在标准输出上。
#port: 一般而言,lpd 会使用 getservbyname 取得适当的 TCP/IP port,你可以使用这个参数强迫 lpd 使用指定的 port。

范例:
这个程式通常是由 /etc/rc.d 中的程式在系统启始阶段执行。

名称 lpq
-- 显示列表机贮列中未完成的工作 用法

lpq [l] [P] [user]

说明
lpq 会显示由 lpd 所管理的列表机贮列中未完成的项目。

范例
范例 1. 显示所有在 lp 列表机贮列中的工作


# lpq -PlpRank Owner Job Files Total Size1st root 238 (standard input) 1428646 bytes


相关函数
lpr,lpc,lpd

名称: lpr

使用权限: 所有使用者

使用方式:lpr [ -P printer ]
将档案或是由标准输入送进来的资料送到印表机贮列之中,印表机管理程式 lpd 会在稍后将这个档案送给适当的程式或装置处理。lpr 可以用来将料资送给本地或是远端的主机来处理。

参数:


-p Printer: 将资料送至指定的印表机 Printer,预设值为 lp。

范例:
www.c 和 kkk.c 送到印表机 lp。
lpr -Plp www.c kkk.c


名称: lprm
-- 将一个工作由印表机贮列中移除 用法

/usr/bin/lprm [P] [file...]

说明
尚未完成的印表机工作会被放在印表机贮列之中,这个命令可用来将常未送到印表机的工作取消。由于每一个印表机都有一个独立的贮列,你可以用 -P 这个命令设定想要作用的印列机。如果没有设定的话,会使用系统预设的印表机。

这个命令会检查使用者是否有足够的权限删除指定的档案,一般而言,只有档案的拥有者或是系统管理员才有这个权限。

范例
将印表机 hpprinter 中的第 1123 号工作移除


lprm -Phpprinter 1123


将第 1011 号工作由预设印表机中移除


lprm 1011


名称: fdformat

使用权限: 所有使用者

使用方式:fdformat [-n] device

使用说明 :
对指定的软碟机装置进行低阶格式化。使用这个指令对软碟格式化的时候,最好指定像是下面的装置:


/dev/fd0d360 磁碟机 A: ,磁片为 360KB 磁碟
/dev/fd0h1440 磁碟机 A: ,磁片为 1.4MB 磁碟
/dev/fd1h1200 磁碟机 B: ,磁片为 1.2MB 磁碟
如果使用像是 /dev/fd0 之类的装置,如果里面的磁碟不是标准容量,格式化可能会失败。在这种情况之下,使用者可以用 setfdprm 指令先行指定必要参数。

参数:


-n 关闭确认功能。这个选项会关闭格式化之后的确认步骤。

范例:

fdformat -n /dev/fd0h1440

将磁碟机 A 的磁片格式化成 1.4MB 的磁片。并且省略确认的步骤。

名称: mformat

使用权限: 所有使用者

使用方式:

mformat [-t cylinders] [-h heads] [-s sectors] [-l volume_label] [-F] [-I fsVer-sion] [-S sizecode] [-2 sectors_on_track_0] [-M software_sector_size] [-a] [-X] [-C] [-H hidden_sectors] [-r root_sectors] [-B boot_sector] [-0 rate_on_track_0] [-A rate_on_other_tracks] [-1] [-k] drive:

在已经做过低阶格式化的磁片上建立 DOS 档案系统。如果在编译 mtools 的时候把 USE_2M 的参数打开,部分与 2M 格式相关的参数就会发生作用。否则这些参数(像是 S,2,1,M)不会发生作用。

参数:

-t 磁柱(synlider)数
-h 磁头(head)数
-s 每一磁轨的磁区数
-l 标签
-F 将磁碟格式化为 FAT32 格式,不过这个参数还在实验中。
-I 设定 FAT32 中的版本号。这当然也还在实验中。
-S 磁区大小代码,计算方式为 sector = 2^(大小代码+7)
-c 磁丛(cluster)的磁区数。如果所给定的数字会导致磁丛数超过 FAT 表的限制,mformat 会自动放大磁区数。
-s
-M 软体磁区大小。这个数字就是系统回报的磁区大小。通常是和实际的大小相同。
-a 如果加上这个参数,mformat 会产生一组 Atari 系统的序号给这块软碟。
-X 将软碟格式化成 XDF 格式。使用前必须先用 xdfcopy 指令对软碟作低阶格式化的动作。
-C 产生一个可以安装 MS-DOS 档案系统的磁碟影像档(disk image)。当然对一个实体磁碟机下这个参数是没有意义的。
-H 隐藏磁区的数目。这通常适用在格式化硬碟的分割区时,因为通常一个分割区的前面还有分割表。这个参数未经测试,能不用就不用。
-n 磁碟序号
-r 根目录的大小,单位是磁区数。这个参数只对 FAT12 和 FAT16 有效。
-B 使用所指定的档案或是设备的开机磁区做为这片磁片或分割区的开机磁区。当然当中的硬体参数会随之更动。
-k 尽量保持原有的开机磁区。
-0 第 0 轨的资料传输率
-A 第 0 轨以外的资料传输率
-2 使用 2m 格式
-1 不使用 2m 格式

范例:
mformat a:

这样会用预设值把 a: (就是 /dev/fd0)里的磁碟片格式化。

名称: mkdosfs

使用权限: 所有使用者

使用方式: mkdosfs [ -c -l filename ]
[ -f number_of_FATs ]
[ -F FAT_size ]
[ -i volume_id ]
[ -m message_file ]
[ -n volume_name ]
[ -r root_dir_entry ]
[ -s sector_per_cluster ]
[ -v ]
device
[ block_count ]

说明: 建立 DOS 档案系统。 device 指你想要建立 DOS 档案系统的装置代号。像是 /dev/hda1 等等。 block_count 则是你希望配置的区块数。如果 block_count 没有指定则系统会自动替你计算符合该装置大小的区块数。

参数:


-c 建立档案系统之前先检查是否有坏轨。
-l 从得定的档案中读取坏轨记录。
-f 指定档案配置表(FAT , File Allocation Table)的数量。预设值为 2 。目前 Linux 的 FAT 档案系统不支援超过 2 个 FAT 表。通常这个不需要改。
-F 指定 FAT 表的大小,通常是 12 或是 16 个位元组。12 位元组通常用于磁碟片,16 位元组用于一般硬碟的分割区,也就是所谓的 FAT16 格式。这个值通常系统会自己选定适当的值。在磁碟片上用 FAT16 通常不会发生作用,反之在硬碟上用 FAT12 亦然。
-i 指定 Volume ID。一般是一个 4 个位元组的数字,像是 2e203a47 。如果不给系统会自己产生。
-m 当使用者试图用这片磁片或是分割区开机,而上面没有作业系统时,系统会给使用者一段警告讯息。这个参数就是用来变更这个讯息的。你可以先用档案编辑好,然后用这个参数指定,或是用
-m -
这样系统会要求你直接输入这段文字。要特别注意的是,档案里的字串长度不要超过 418 个字,包括展开的跳栏符号(TAB)和换行符号(换行符号在 DOS 底下算两个字元!)
-n 指定 Volume Name,就是磁碟标签。如同在 DOS 底下的 format 指令一样,给不给都可以。没有预设值。
-r 指定根目录底下的最大档案数。这里所谓的档案数包括目录。预设值是在软碟上是 112 或是 224 ,在硬碟上是 512。没事不要改这个数字。
-s 每一个磁丛(cluster)的磁区数。必须是 2 的次方数。不过除非你知道你在作什么,这个值不要乱给。
-v 提供额外的讯息

范例:
mkdosfs -n Tester /dev/fd0 将 A 槽里的磁碟片格式化为 DOS 格式,并将标签设为 Tester


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

--
[:p] --飞扬.轻狂 [fallseir.lee]
http://fallseir.livejournal.com
http://feed.feedsky.com/fallseir