一 : Linux命令free的输出含义
[root@Linux /tmp]# free二 : Linux下fseek()ftell()rewind()lseek()fstat()的使用方法
fseek(移动文件流的读写位置)
相关函数 rewind,ftell,fgetpos,fsetpos,lseek
表头文件 #include
定义函数 int fseek(FILE * stream,long offset,int whence);
函数说明fseek()用来移动文件流的读写位置。参数stream为已打开的文件指针,参数offset为根据参数whence来移动读写位置的位移数。
参数 whence为下列其中1种:
SEEK_SET从距文件开头offset位移量为新的读写位置。SEEK_CUR以目前的读写位置往后增加offset个位移量。
SEEK_END将读写位置指向文件尾后再增加offset个位移量。
当whence值为SEEK_CUR 或SEEK_END时,参数offset允许负值的出现。
下列是较特别的使用方式:
1) 欲将读写位置移动到文件开头时:fseek(FILE *stream,0,SEEK_SET);
2) 欲将读写位置移动到文件尾时:fseek(FILE *stream,0,SEEK_END);
返回值 当调用成功时则返回0,若有错误则返回-1,errno会存放错误代码。
附加说明 fseek()不像lseek()会返回读写位置,因此必须使用ftell()来取得目前读写的位置。
范例
#include
int main(int argc,char *argv[])
{
FILE * stream;
long offset;
fpos_t pos;
stream=fopen(“/etc/passwd”,”r”);
fseek(stream,5,SEEK_SET);
printf(“offset=%d\n”,ftell(stream));
rewind(stream);
fgetpos(stream,&pos);
printf(“offset=%d\n”,pos);
pos=10;
fsetpos(stream,&pos);
printf(“offset = %d\n”,ftell(stream));
fclose(stream);
}
执行
offset = 5
offset =0
offset=10
ftell(取得文件流的读取位置)
相关函数 fseek,rewind,fgetpos,fsetpos
表头文件 #include
定义函数 long ftell(FILE * stream);
函数说明 ftell()用来取得文件流目前的读写位置。参数stream为已打开的文件指针。
返回值 当调用成功时则返回目前的读写位置,若有错误则返回-1,errno会存放错误代码。
错误代码 EBADF 参数stream无效或可移动读写位置的文件流。
范例 见上
rewind(重设文件流的读写位置为文件开头)
相关函数 fseek,ftell,fgetpos,fsetpos
表头文件 #include
定义函数 void rewind(FILE * stream);
函数说明rewind()用来把文件流的读写位置移至文件开头。参数stream为已打开的文件指针。此函数相当于调用fseek(stream,0,SEEK_SET)。
返回值 无返回值
范例 参考fseek()
lseek(移动文件的读写位置)
相关函数 dup,open,fseek
表头文件 #include #include
定义函数 off_t lseek(int fildes,off_t offset ,int whence);
函数说明每1个已打开的文件都有1个读写位置,当打开文件时通常其读写位置是指向文件开头,若是以附加的方式打开文件(如O_APPEND),则读写位置会指向文件尾。当read()或write()时,读写位置会随之增加,lseek()便是用来控制该文件的读写位置。参数fildes为已打开的文件描述词,参数offset 为根据参数whence来移动读写位置的位移数。
参数 whence为下列其中1种:
SEEK_SET 参数offset即为新的读写位置。
SEEK_CUR 以目前的读写位置往后增加offset个位移量。
SEEK_END 将读写位置指向文件尾后再增加offset个位移量。
当whence 值为SEEK_CUR 或SEEK_END时,参数offet允许负值的出现。
下列是教特别的使用方式:
1) 欲将读写位置移到文件开头时:lseek(int fildes,0,SEEK_SET);
2) 欲将读写位置移到文件尾时:lseek(int fildes,0,SEEK_END);
3) 想要取得目前文件位置时:lseek(int fildes,0,SEEK_CUR);
返回值 当调用成功时则返回目前的读写位置,也就是距离文件开头多少个字节。若有错误则返回-1,errno 会存放错误代码。
附加说明 Linux系统不允许lseek()对tty装置作用,此项动作会令lseek()返回ESPIPE。
fstat(由文件描述词取得文件状态)
相关函数 stat,lstat,chmod,chown,readlink,utime
表头文件 #include #include
定义函数 int fstat(int fildes,struct stat *buf);
函数说明 fstat()用来将参数fildes所指的文件状态,复制到参数buf所指的结构中(structstat)。Fstat()与stat()作用完全相同,不同处在于传入的参数为已打开的文件描述词。详细内容请参考stat()。
返回值 执行成功则返回0,失败返回-1,错误代码存于errno。
范例
#include
#include
#include
int main(int argc,char *argv[])
{
struct stat buf;
int fd;
fd = open (“/etc/passwd”,O_RDONLY);
fstat(fd,&buf);
printf(“/etc/passwd file size +%d\n “,buf.st_size);
}
执行
/etc/passwd file size = 705
http://hi.baidu.com/hp_roc/item/74905223706a653b94f62b92
三 : 如何利用多核CPU来加速你的Linux命令
你是否曾经有过要计算一个非常大的数据(几百GB)的需求?或在里面搜索,或其它操作——一些无法并行的操作。数据专家们,我是在对你们说。你可能有一个4核或更多核的CPU,但我们合适的工具,例如grep, bzip2, wc, awk, sed等等,都是单线程的,只能使用一个CPU内核。
借用卡通人物Cartman的话,“如何我能使用这些内核”?
要想让Linux命令使用所有的CPU内核,我们需要用到GNU Parallel命令,它让我们所有的CPU内核在单机内做神奇的map-reduce操作,当然,这还要借助很少用到的–pipes参数(也叫做–spreadstdin)。这样,你的负载就会平均分配到各CPU上,真的。
BZIP2
bzip2是比gzip更好的压缩工具,但它很慢!别折腾了,我们有办法解决这问题。
以前的做法:
- catbigfile.bin|bzip2--best>compressedfile.bz2
现在这样:
- catbigfile.bin|parallel--pipe--recend''-kbzip2--best>compressedfile.bz2
尤其是针对bzip2,GNU parallel在多核CPU上是超级的快。你一不留神,它就执行完成了。
GREP
如果你有一个非常大的文本文件,以前你可能会这样:
- greppatternbigfile.txt
现在你可以这样:
- catbigfile.txt|parallel--pipegrep'pattern'
或者这样:
- catbigfile.txt|parallel--block10M--pipegrep'pattern'
这第二种用法使用了 –block 10M参数,这是说每个内核处理1千万行——你可以用这个参数来调整每个CUP内核处理多少行数据。
AWK
下面是一个用awk命令计算一个非常大的数据文件的例子。
常规用法:
- catrands20M.txt|awk'{s+=$1}END{prints}'
现在这样:
- catrands20M.txt|parallel--pipeawk\'{s+=\$1}END{prints}\'|awk'{s+=$1}END{prints}'
这个有点复杂:parallel命令中的–pipe参数将cat输出分成多个块分派给awk调用,形成了很多子计算操作。这些子计算经过第二个管道进入了同一个awk命令,从而输出最终结果。第一个awk有三个反斜杠,这是GNU parallel调用awk的需要。
WC
想要最快的速度计算一个文件的行数吗?
传统做法:
- wc-lbigfile.txt
现在你应该这样:
- catbigfile.txt|parallel--pipewc-l|awk'{s+=$1}END{prints}'
非常的巧妙,先使用parallel命令‘mapping’出大量的wc -l调用,形成子计算,最后通过管道发送给awk进行汇总。
SED
想在一个巨大的文件里使用sed命令做大量的替换操作吗?
常规做法:
- seds^old^new^gbigfile.txt
现在你可以:
- catbigfile.txt|parallel--pipeseds^old^new^g
…然后你可以使用管道把输出存储到指定的文件里。
四 : dig命令的用法
Dig命令的用法
Dig是linux中的域名解析工具,功能比nslookup强很多,使用也很方便,不用象nslookup总是set不停。
Dig是domain information groper的缩写,知道了来源想必大家也就容易记住这条命令了。
Dig现在已经有人移植到了window上,可以在这里下载。
其使用方法如下:
看懂默认输出:
最简单最常见的查询是查询一台主机,但是默认情况下,Dig的输出信息很详细。你可能不需要所有的输出,
但是它确实值得知道。下面是一个带有注释的查询:
$ dig www.isc.org
上面是我调用dig 的命令行。
; <<>>DiG 9.2.3<<>>www.isc.org
;; global options: printcmd
Dig的部分输出告诉我们一些有关于它的版本信息(version 9.2.3)和全局的设置选项,如果+nocmd在命令行下
是第一个参数的话,那么这部分输出可以通过加+nocmd的方式查询出来。
;; Got answer:
;;->>HEADER<<-opcode: QUERY, status: NOERROR, id: 43071
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 3, ADDITIONAL:3
在这里,Dig告诉我们一些从DNS返回的技术信息,这段信息可以用选项 +[no]comments来控制显示,但是小心
,禁止掉comments也可能关闭一些其它的选项。
;; QUESTION SECTION:
;www.isc.org.INA
在这个查询段中,Dig显示出我们查询的输出,默认的查询是查询A记录,你可以显示或者禁止掉这些用+[no]
question选项
;; ANSWER SECTION:
www.isc.org.600INA204.152.184.88
最后,我们得到我们查询的结果。www.isc.org的地址是204.152.184.8,我不知道为什么你们更喜欢过滤掉
这些输出,但是你可以用+[no]answer保留这些选项。
;; AUTHORITY SECTION:
isc.org.2351INNSns-int.isc.org.
isc.org.2351INNSns1.gnac.com.
isc.org.2351INNSns-ext.isc.org.
这段权威说明告诉我们哪个DNS服务器给我们提供权威的答案。在这个例子中,isc.org有3个Name Server,你
可以用+[no]authority选项保留这段输出。
;; ADDITIONAL SECTION:
ns1.gnac.com.171551INA209.182.216.75
ns-int.isc.org.2351INA204.152.184.65
ns-int.isc.org.2351INAAAA2001:4f8:0:2::15
这些额外选项很有代表性地包含了列出的权威DNS的IP地址,这段输出可以用+[no]additional选项保留。
;; Query time: 2046 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Fri Aug 27 08:22:26 2004
;; MSG SIZE rcvd: 173
最后一段默认输出包含了查询的统计数据,可以用+[no]stats保留。
我们可以查询什么?
Dig可以让你有效地查询DNS,最常用的查询是A记录,TXT(文本注释),MX记录,NS记录,或者任意综合查询
。
查找yahoo.com的A记录:
dig yahoo.com A +noall +answer
查找yahoo.com MX记录的列表:
dig yahoo.com MX +noall +answer
查找yahoo.com的权威DNS:
dig yahoo.com NS +noall +answer
查询上面所有的记录:
dig yahoo.com ANY +noall +answer
在现在这种IPv4和IPV6混用的情况下,你也可以使用AAAA的选项查询主机的IPv6 AAAA记录:
dig www.isc.org AAAA +short
如果你要查询的域允许转发,你也可以查询到相关的信息,比如DNS记录在internet上的生存周期,但是,现
在只有很少的DNS允许无限制转发。
我们怎样查询?
获得精简答案?
当我们需要一个快速回答时,+short选项是你最好的朋友:
dig www.isc.org +short
204.152.184.88
获得一个不是十分精简的答案?
精简答案和只有一个答案是不一样的,获得没有附加信息的详细答案的方法是使用+noall选项,这样就只保留
你想要的输出。
下面是只有一个答案的精简查询,最后包含所有的配置信息,包括TTL数据,格式化的BIND配置信息。
$ dig fsf.org mx +short
20 mx20.gnu.org.
30 mx30.gnu.org.
10 mx10.gnu.org.
$ dig +nocmd fsf.org mx +noall +answer
fsf.org.3583INMX30 mx30.gnu.org.
fsf.org.3583INMX10 mx10.gnu.org.
fsf.org.3583INMX20 mx20.gnu.org.
获得一个详细答案?
通过它的man page,你可以通过+multiline选项获得冗长的多行模式人性化注释的DSN的SOA记录,一般来说,
用+multiline选项获得的信息可以显示很多,就像BIND配置文件一样。
$ dig +nocmd ogi.edu any +multiline +noall +answer
ogi.edu. 14267 IN A129.95.59.31
ogi.edu. 14267 IN MX 5cse.ogi.edu.
ogi.edu. 14267 IN MX 15hermes.admin.ogi.edu.
ogi.edu. 14267 IN SOAzeal.admin.ogi.edu. hostmaster.admin.ogi.edu. (
200408230 ; serial
14400; refresh (4 hours)
900; retry (15 minutes)
3600000 ;expire (5 weeks 6 days 16 hours)
14400; minimum (4 hours)
)
ogi.edu. 14267 IN NSzeal.admin.ogi.edu.
ogi.edu. 14267 IN NScse.ogi.edu.
ogi.edu. 14267 IN NSfork.admin.ogi.edu.
查找PTR记录?
可以用 -x的选项查找IP地址的主机名。
$ dig -x 204.152.184.167 +short
mx-1.isc.org.
在这个循环中,脚本很灵活地在给出的子网中映射出名字。
#!/bin/bash
NET=18.7.22
for n in $(seq 1 254); do
ADDR=${NET}.${n}
echo -e "${ADDR}\t$(dig -x ${ADDR}+short)"
done
查询一个不同的命名服务器?
查询命令如下:
dig @ns1.google.com www.google.com
使用/etc/resolv.conf里面的记录查询
主机将从/etc/resolv.conf文件里面自动查询DNS记录
$ host www
www.madboa.com has address65.102.49.170
但是,默认情况下,dig会产生出一些意想不到的输出。如果你想查询本地主机名而不是全域名时候,使用
+search 选项
dig www +search
处理大部分的查询?
如果你想查询大量的主机名,你可以把它们存放在一个文本文件中(一条记录一行),使用带-f参数的dig来依
次查询。
# 查询大量的主机名
dig -f /path/to/host-list.txt
# 相同的,更明确的输出
dig -f /path/to/host-list.txt +noall +answer
但是我要告诉你的是,dig 9.2.3以及以后的版本都不支持使用-f的选项反向查询了。
验证DNS映射
不正确的DNS配置会给你带来很多苦恼,你可以通过如下两种方式验证你的DNS配置:
1.每个主机名应该被解析到一个IP地址,而且那个IP地址也应该反指向那个主机名。
2.如果你子网上一个地址被反指向一个主机名,那么那个主机名也必须指向这个IP。
对于这两条规则来说,还有一些例外情况,比如CNAME应该首先解析到另外一个主机名,而且只能指向一个IP
,有时多个主机名指向了相同的IP地址,但是那个IP只能有一个PTR记录。
综上,这些有助于你检查你的DNS映射是否像你想象的那样工作。
你也可以编写一个测试脚本写入你已知的主机名,如下所示,内容很简单;它执行时当捕捉到一个CNAME时它
就会中断,如果多个主机名指向同一个IP地址它会报错。我们假设这个文件包含你的主机名叫做named-hosts
。
#!/bin/bash
#
# test DNS forward- and reverse-mapping
#
# edit this variable to reflect local class C subnet(s)
NETS="192.168.1 192.168.2"
# Test name to address to name validity
echo
echo -e "\tname -> address ->name"
echo '----------------------------------'
while read H; do
ADDR=$(dig $H +short)
if test -n "$ADDR"; then
HOST=$(dig-x $ADDR +short)
if test "$H"= "$HOST"; then
echo -e "ok\t$H -> $ADDR ->$HOST"
elif test -n"$HOST"; then
echo -e "fail\t$H -> $ADDR ->$HOST"
else
echo -e "fail\t$H -> $ADDR ->[unassigned]"
fi
else
echo -e"fail\t$H -> [unassigned]"
fi
done < named-hosts
# Test address to name to address validity
echo
echo -e "\taddress -> name ->address"
echo '-------------------------------------'
for NET in $NETS; do
for n in $(seq 1 254); do
A=${NET}.${n}
HOST=$(dig-x $A +short)
if test -n"$HOST"; then
ADDR=$(dig $HOST +short)
if test "$A" = "$ADDR"; then
echo -e "ok\t$A -> $HOST ->$ADDR"
elif test -n "$ADDR"; then
echo -e "fail\t$A -> $HOST ->$ADDR"
else
echo -e "fail\t$A -> $HOST ->[unassigned]"
fi
fi
done
done
有趣的dig
创建属于你自己的named.root文件
任何连接到internet的DNS服务器肯定会有InterNIC的named.root文件的拷贝,文件列出所有internet的根
DNS,如果你不怕麻烦的话,你可以经常从InterNIC的ftp服务器上把它下载下来,或者,你可以使用dig命令
创建属于你自己的时髦的named.root
# compare with ftp://ftp.internic.net/domain/named.root
dig +nocmd . NS +noall +answer +additional
你的TTL值在这边可能会很小,但是它是你找到最新的named.root文件!
跟踪dig的查询路径
你可能是个traceroute的狂热爱好者,经常喜欢查看如何从点A连接点B。那你可以使用dig +trace选项做类似
的事。
dig gentoo.de +trace
你可以在dig输出的头部分看到根DNS,然后找到负责解析所有*.de的DNS,最后找到gentoo.de的域名IP。
获取SOA记录
作为一个DNS管理员,我有时会(对DNS配置)做一些改变,并且想知道我的DNS解析是否推送的还是旧数据,
这个+nssearch选项可以给你的公众服务器提供清楚的统计信息。
# the unvarnished truth
dig cse.ogi.edu +nssearch
# the same, displaying only serial number and hostname
dig cse.ogi.edu +nssearch | cut -d' ' -f4,11
解释TTL数值
我喜爱google有很多原因,其中一个原因就是它在我的WEB日志中提供了精确的链接,它会使我很容易地指出
哪种类型的查询引导人们来访问这个站点的页面。
出乎意料的是,我已经看到很多请求要求查询TTL数值,我从来没想到TTL会成为最受欢迎的东东,但是你每天
都在学习新东西,所以,应大家的要求,这里稍微介绍一下TTL。
如果你从本地DNS查询互联网地址,服务器指出从哪里获得权威的答案并获得地址,一旦服务器获知答案,它
将这个答案保存在本地缓存中以免你在稍后的时间内再次查询同样的地址,这样它就会很快地从缓存中获取你
要的答案,比你再次从internet查询要快很多。
当域管理员配置DNS记录时,他们可以决定这个记录可以在缓存中保存多长时间,这就是TTL数值(通常用多少
秒来表示)。
通常地,远端服务器一般对记录的缓存只保存TTL数值长的时间。时间过期后,服务器会刷新它的本地缓存并
重新查询一个权威答案。
当你用dig来查询DNS服务器某条记录时,服务器会告诉dig这条记录可以在缓存中保持的时间长短。
举个例子,像上面写的那样,gmail.com域的MX记录的TTL值是300s,gmail.com域的管理员要求远端服务器缓
存它的MX记录不能高于5分钟,所以当你第一次查询那个记录(gmail.com的MX记录)时,dig会告诉你一个300
的TTL。
$ dig +nocmd gmail.com MX +noall +answer
gmail.com.300INMX20 gsmtp57.google.com.
gmail.com.300INMX10 gsmtp171.google.com.
如果你一段时间后再去查,你会发现TTL值减少为280(中间隔了20s)。
$ dig +nocmd gmail.com MX +noall +answer
gmail.com.280INMX10 gsmtp171.google.com.
gmail.com.280INMX20 gsmtp57.google.com.
如果你的时间计算得足够好,你会获取这条记录的最后生存时间。
$ dig +nocmd gmail.com MX +noall +answer
gmail.com.1INMX10 gsmtp171.google.com.
gmail.com.1INMX20 gsmtp57.google.com.
在那之后,你查询的DNS服务器会“忘记”这个问题的答案,在你下次查询这条记录时,整个循环又将开始(
本例子中是300s)。
在 unix 和 linux 下,建议大家使用 dig 命令来代替 nslookup。 dig 命令的功能比 nslookup强大很多,不像 nslookkup 还得 set 来 set 去的,怪麻烦的。下面是 dig 的一些比较常用的命令:
# dig 最基本的用法
dig @server qianlong.com
# 用 dig 查看 zone 数据传输
dig @server qianlong.com AXFR
# 用 dig 查看 zone 数据的增量传输
dig @server qianlong.com IXFR=N
# 用 dig 查看反向解析
dig -x 124.42.102.203 @server
# 查找一个域的授权 dns 服务器
dig qianlong.com +nssearch
# 从根服务器开始追踪一个域名的解析过程
dig qianlong.com +trace
# 查看你使用的是哪个 F root dns server
dig +norec @F.ROOT-SERVERS.NET HOSTNAME.BIND CHAOS TXT
# 查看 bind 的版本号
dig @bind_dns_server CHAOS TXT version.bind
********************************
你可以到 www.isc.org 去下载一个 bind forwindows 的版本安装,安装后就可以在 windows 上使用 dig 命令了。^O^
ftp://ftp.isc.org/isc/bind/contrib/ntbind-9.3.0/BIND9.3.0.zip
*********************************
用途
DNS 查询实用程序。
语法
dig [@server] [-b address] [-c class] [-f filename] [-k filename] [-n ][-p port#] [-t type] [-x addr] [-y name:key] [name] [type][class] [queryopt...]
dig [-h]
dig [global-queryopt...] [query...]
描述
dig(域信息搜索器)命令是一个用于询问 DNS 域名服务器的灵活的工具。它执行 DNS搜索,显示从受请求的域名服务器返回的答复。多数 DNS 管理员利用 dig 作为 DNS问题的故障诊断,因为它灵活性好、易用、输出清晰。虽然通常情况下 dig使用命令行参数,但它也可以按批处理模式从文件读取搜索请求。不同于早期版本,dig 的 BIND9实现允许从命令行发出多个查询。除非被告知请求特定域名服务器,dig 将尝试 /etc/resolv.conf中列举的所有服务器。当未指定任何命令行参数或选项时,dig 将对“.”(根)执行 NS 查询。
标志
-b address 设置所要询问地址的源 IP 地址。这必须是主机网络接口上的某一合法的地址。
-c class 缺省查询类(IN for internet)由选项 -c 重设。class 可以是任何合法类,比如查询 Hesiod记录的 HS 类或查询 CHAOSNET 记录的 CH 类。
-f filename 使 dig 在批处理模式下运行,通过从文件 filename读取一系列搜索请求加以处理。文件包含许多查询;每行一个。文件中的每一项都应该以和使用命令行接口对 dig的查询相同的方法来组织。
-h 当使用选项 -h 时,显示一个简短的命令行参数和选项摘要。
-k filename 要签署由 dig 发送的 DNS 查询以及对它们使用事务签名(TSIG)的响应,用选项 -k 指定 TSIG密钥文件。
-n 缺省情况下,使用 IP6.ARPA 域和 RFC2874 定义的二进制标号搜索 IPv6 地址。为了使用更早的、使用IP6.INT 域和 nibble 标签的 RFC1886 方法,指定选项 -n(nibble)。
-p port# 如果需要查询一个非标准的端口号,则使用选项 -p。port# 是 dig 将发送其查询的端口号,而不是标准的 DNS端口号 53。该选项可用于测试已在非标准端口号上配置成侦听查询的域名服务器。
-t type 设置查询类型为 type。可以是 BIND9 支持的任意有效查询类型。缺省查询类型是 A,除非提供 -x选项来指示一个逆向查询。通过指定 AXFR 的 type 可以请求一个区域传输。当需要增量区域传输(IXFR)时,type 设置为ixfr=N。增量区域传输将包含自从区域的 SOA 记录中的序列号改为 N 之后对区域所做的更改。
-x addr 逆向查询(将地址映射到名称)可以通过 -x 选项加以简化。addr 是一个以小数点为界的 IPv4 地址或冒号为界的IPv6 地址。当使用这个选项时,无需提供 name、class 和 type 参数。dig 自动运行类似11.12.13.10.in-addr.arpa 的域名查询,并分别设置查询类型和类为 PTR 和 IN。
-y name:key 您可以通过命令行上的 -y 选项指定 TSIG 密钥;name 是 TSIG 密码的名称,key是实际的密码。密码是 64 位加密字符串,通常由 dnssec-keygen(8)生成。当在多用户系统上使用选项 -y时应该谨慎,因为密码在 ps(1)的输出或 shell 的历史文件中可能是可见的。当同时使用 dig 和 TSCG认证时,被查询的名称服务器需要知道密码和解码规则。在 BIND 中,通过提供正确的密码和 named.conf中的服务器声明实现。
参数
global-queryopt... 全局查询选项(请参阅多个查询)。
查询 查询选项(请参阅查询选项)。
查询选项
dig提供查询选项号,它影响搜索方式和结果显示。一些在查询请求报头设置或复位标志位,一部分决定显示哪些回复信息,其它的确定超时和重试战略。每个查询选项被带前缀(+)的关键字标识。一些关键字设置或复位一个选项。通常前缀是求反关键字含义的字符串no。其他关键字分配各选项的值,比如超时时间间隔。它们的格式形如 +keyword=value。查询选项是:
+[no]tcp
查询域名服务器时使用 [不使用] TCP。缺省行为是使用 UDP,除非是 AXFR 或 IXFR 请求,才使用 TCP连接。
+[no]vc
查询名称服务器时使用 [不使用] TCP。+[no]tcp 的备用语法提供了向下兼容。 vc 代表虚电路。
+[no]ignore
忽略 UDP 响应的中断,而不是用 TCP 重试。缺省情况运行 TCP 重试。
+domain=somename
设定包含单个域 somename 的搜索列表,好像被 /etc/resolv.conf中的域伪指令指定,并且启用搜索列表处理,好像给定了 +search 选项。
+[no]search
使用 [不使用] 搜索列表或 resolv.conf 中的域伪指令(如果有的话)定义的搜索列表。缺省情况不使用搜索列表。
+[no]defname
不建议看作 +[no]search 的同义词。
+[no]aaonly
该选项不做任何事。它用来提供对设置成未实现解析器标志的 dig 的旧版本的兼容性。
+[no]adflag
在查询中设置 [不设置] AD(真实数据)位。目前 AD位只在响应中有标准含义,而查询中没有,但是出于完整性考虑在查询中这种性能可以设置。
+[no]cdflag
在查询中设置 [不设置] CD(检查禁用)位。它请求服务器不运行响应信息的 DNSSEC 合法性。
+[no]recursive
切换查询中的 RD(要求递归)位设置。在缺省情况下设置该位,也就是说 dig 正常情形下发送递归查询。当使用查询选项+nssearch 或 +trace 时,递归自动禁用。
+[no]nssearch
这个选项被设置时,dig 试图寻找包含待搜名称的网段的权威域名服务器,并显示网段中每台域名服务器的 SOA 记录。
+[no]trace
切换为待查询名称从根名称服务器开始的代理路径跟踪。缺省情况不使用跟踪。一旦启用跟踪,dig使用迭代查询解析待查询名称。它将按照从根服务器的参照,显示来自每台使用解析查询的服务器的应答。
+[no]cmd
设定在输出中显示指出 dig 版本及其所用的查询选项的初始注释。缺省情况下显示注释。
+[no]short
提供简要答复。缺省值是以冗长格式显示答复信息。
+[no]identify
当启用 +short 选项时,显示 [或不显示] 提供应答的 IP地址和端口号。如果请求简短格式应答,缺省情况不显示提供应答的服务器的源地址和端口号。
+[no]comments
切换输出中的注释行显示。缺省值是显示注释。
+[no]stats
该查询选项设定显示统计信息:查询进行时,应答的大小等等。缺省显示查询统计信息。
+[no]qr
显示 [不显示] 发送的查询请求。缺省不显示。
+[no]question
当返回应答时,显示 [不显示] 查询请求的问题部分。缺省作为注释显示问题部分。
+[no]answer
显示 [不显示] 应答的回答部分。缺省显示。
+[no]authority
显示 [不显示] 应答的权限部分。缺省显示。
+[no]additional
显示 [不显示] 应答的附加部分。缺省显示。
+[no]all
设置或清除所有显示标志。
+time=T
为查询设置超时时间为 T 秒。缺省是5秒。如果将 T 设置为小于1的数,则以1秒作为查询超时时间。
+tries=A
设置向服务器发送 UDP 查询请求的重试次数为 A,代替缺省的 3 次。如果把 A 小于或等于 0,则采用 1为重试次数。
+ndots=D
出于完全考虑,设置必须出现在名称 D 的点数。缺省值是使用在 /etc/resolv.conf 中的 ndots 语句定义的,或者是1,如果没有 ndots 语句的话。带更少点数的名称被解释为相对名称,并通过搜索列表中的域或文件 /etc/resolv.conf中的域伪指令进行搜索。
+bufsize=B
设置使用 EDNS0 的 UDP 消息缓冲区大小为 B 字节。缓冲区的最大值和最小值分别为 65535 和0。超出这个范围的值自动舍入到最近的有效值。
+[no]multiline
以详细的多行格式显示类似 SOA 的记录,并附带可读注释。缺省值是每单个行上显示一条记录,以便于计算机解析 dig的输出。
多条查询
dig 的 BIND9 支持在命令行上指定多个查询(支持 -f批处理文件选项的附加功能)。每条查询可以使用自己的标志位、选项和查询选项。
在这种情况下,在上面描述的命令行语法中,每条查询自变量代表一个个别查询。每一条由任意标准选项和标志、待查询名称、可选查询类型和类以及任何适用于该查询的查询选项。
也可以使用对所有查询均有效的查询选项全局集合。全局查询选项必须位于命令行上第一个名称、类、类型、选项、标志和查询选项的元组之前。任何全局查询选项(除了+[no]cmd 选项)可以被下面的查询特别选项重设。例如:
dig +qr www.isc.org any -x127.0.0.1 isc.org ns +noqr显示 dig 如何从命令行出发进行三个查询:一个针对 www.isc.org的任意查询、一个 127.0.0.1 的逆向查询,以及一个isc.org 的 NS 记录查询。应用了 +qr 的全局查询选项,以便 dig显示进行每条查询的初始查询。最后那个查询有一个本地查询选项 +noqr,表示 dig 在搜索 isc.org 的 NS记录时不显示初始查询。
示例
一个典型的 dig 调用类似:
dig @server name type其中:
server
待查询名称服务器的名称或 IP 地址。可以是用点分隔的 IPv4 地址或用冒号分隔的 IPv6 地址。当由主机提供服务器参数时,dig在查询域名服务器前先解析那个名称。如果没有服务器参数可以提供,dig 参考/etc/resolv.conf,然后查询列举在那里的域名服务器。显示来自域名服务器的应答。
name
将要查询的资源记录的名称。
type
显示所需的查询类型 - ANY、A、MX、SIG,以及任何有效查询类型等。如果不提供任何类型参数,dig 将对纪录 A执行查询。
*********************************
五 : tcpdump的用法记录--命令介绍
命令格式
tcpdump [ -AdDeflLnNOpqRStuUvxX ] [ -c count ]
[ -C file_size ] [ -F file ]
[ -i interface ] [ -m module ] [ -M secret ]
[ -r file ] [ -s snaplen ] [ -T type ] [ -w file ]
[ -W filecount ]
[ -E spi@ipaddr algo:secret,... ]
[ -y datalinktype ] [ -Z user ]
[ expression ]
选项介绍
-A : 以ASCII码格式打印每个数据包(不包括链路层的数据头)。(www.61k.com]方便捕捉web页面。
-c : 将在收到count个包后退出
-C : 在将原始数据写入文件前,先判断是否文件又足够的空间file_size可以使用,如果没有则保存关闭当前文件,并新创建一个文件用于写入这些数据。文件名不变,只是在文件后面增加序号,从1开始
-d : 将匹配信息的模板代码以人们可读的形式输出到标准输出并停止
-dd : 将匹配信息的模板代码以c语言形式输出
-ddd : 将匹配信息的模板代码以10机制的形式输出
-D : 打印系统中可用的网络接口列表,并标出哪些可以使用tcpdump抓包
-e : 打印每条dump行的链路层头部
-E : 使用spi@ipaddr加密算法解密写给addr和包含安全参数索引值spi的IPsec ESP数据包。这种组合可以重复,使用逗号或换行符进行分隔
-f : 将外部的internet地址以数字形式打印出来
-F : 将从文件file中读取过滤表达式,同时忽略命令行输入的其它表达式
-i : 监听网络接口interface
-l : 使标准输出变为缓冲行形式
-L : 列出接口的已知数据链路类型并退出
-m : 加载文件模块module定义的SMI MBI模块
-M : 使用secret作为共享密钥验证tcp中的摘要信息
-n : 不将host的地址转换为主机名
-nn : 不转换协议和端口号
-N : 不打印主机名中的domain名。例:如果开启的话,则只会打印'nic'而不会打印'nic.ddn.mil'
-O : 不用醒信息匹配优化程序。这主要是为了确认是否优化程序存在bug
-p : 禁止把接口设置为promiscuous模式。注意,接口可能由于其它原因被置为promiscuous模式。因此,-p模式下不能被缩写为ether host {local-hw-addr} or ether broadcast
-q : 快速输出。打印较少的协议信息,所以输出的行较短
-R : 假定ESP/AH包是基于旧的规范。
-r : 从文件file中读取数据包(是通过-w选项创建的)
-S : 打印绝对的TCP序号而非相对的序号
-s : 截取每个数据包snaplen字节的数据而非默认的68个字节(如果是SunOS的NIT,最小值是96)。68个字节适用于IP、ICMP、TCP和UDP,但是有可能会截断名字服务器和NFS数据包。
-T : 把通过"expression"挑选出来的报文解释成指定的 type。目前已知的类型有: aodv(按需距离矢量路由协议 Adhoc On-demand Distance Vector protocol), cnfp (Cisco网络流协议 Cisco NetFlow protocol),rpc (远程过程调用 Remote Procedure Call), rtp (实时应用协议 Real-Time Applications protocol), rtcp (实时应用控制协议 Real-Time Applications control protocol),vat (可视音频工具 Visual Audio Tool)和 wb (分布式白板 distributed White Board)。
-t : 不打印每行的时间戳
-tt : 每行打印非规范化的时间戳
-ttt : 打印每行与前一行的时间间隔(毫秒为单位)
-tttt : 每行打印date命令默认格式的时间戳
-u : 打印未解码的NFS句柄
-U : 使得当tcpdump在使用-w 选项时,其文件写入与包的保存同步。(例:即, 当每个数据包被保存时, 它将及时被写入文件中,而不是等文件的输出缓冲已满时才真正写入此文件)
-v : 当分析和打印时,产生详细的输出。例如ttl、id、总长度和ip包的选项。这也会打开一些附加的包完整性检测,比如对IP或ICMP包头部的校验和
-vv : 比-v产生更详尽的输出。例如NFS回应包中的附加域会被打印,SMB数据也会被完全解码
-vvv : 比-vv产生更详尽的输出。例如telnet中的SB、SE选项会被打印,图形选项会被打印成对应的十六进制
-w : 向file文件中写入原始数据而不解析和打印它们。它们可以通过-r选项被打印出来。如果file对应为'-'则指标准输出
-W : 与选项-C配合使用,将限制可打开的文件数目filecount,并且当文件数量超过这里的设置时,循环替代之前的文件。另外,该选项会使得每个文件名的开头会出现足够多并用来占位的0,这可以方便这些文件被正确的排序
-x : 以十六进制打印每个数据包(不包括链路层的数据头)。总共打印的数据大小不会超过整个数据包的大小与snaplen 中的最小值。需要注意的是,如果高层协议数据没有snaplen 这么长,则会将链路层的数据填充进来
-xx : 以十六进制打印每个数据包(包括链路层的数据头)
-X : 以十六进制和ASCII码打印每个数据包(不包括链路层的数据头)。这会便于分析新协议
-XX : 以十六进制和ASCII码打印每个数据包(包括链路层的数据头)
-y : 设置tcpdump只捕获数据链路层协议类型是datalinktype的数据包
-z : 使tcpdump 放弃自己的超级权限(如果以root用户启动tcpdump, tcpdump将会有超级用户权限), 并把当前tcpdump的用户ID设置为user, 组ID设置为user首要所属组的ID
选项字段说明:
expression 条件表达式
通过表达式选择要捕获的数据包。如果不指定条件表达式,则网络上所有数据包都会被捕获,否则,只有满足条件表达式的数据才会被捕获。
表达式由一个或多个简单表达式组成,简单表达式通常由一个或多个修饰符后跟一个名字或数字表示的id组成。
有三种不同的修饰符:type,dir和proto:
type 修饰符指定id所代表的对象类型,可能的类型为host(主机)、net(网络)、port(端口)和portrange(端口范围)。如,'host foo'-主机名为foo,'net 128.3'-网络为128.3,'port 20'-端口为20,'portrange 6000-6008'-端口范围6000~6008。如果没指定type修饰符,则默认为host。
dir 修饰符描述id所对应的传输方向,即‘发往id’或/与‘从id接收’的。可选取的方向为src、dst、src or dst和src and dst。如,'src foo'-源主机为foo,'dst net 128.3'-目的网络为128.3,'src or dst port ftp-data'-源或目的端口为ftp-data,如果没有指定dir修饰符,则默认为src or dst。对于链路层的协议,比如SLIP,以及linux下指定'any' 设备, 并指定'cooked' 抓取类型, 或其他设备类型,可以用'inbound' 和 'outbount' 修饰符来指定想要的传输方向。
proto 修饰符描述id所述的协议,可选的协议有:ether, fddi, tr, wlan, ip, ip6, arp, rarp, decnet, tcp and udp。如,‘ether src foo’-源为以太网地址foo, ‘arp net 128.3’-网络为128.3的arp数据, ‘tcp port 21’-端口为21的tcp数据, ‘udp portrange 7000-7009’-端口范围为7000~7009的udp数据。如果没有指定协议修饰符,则默认为所有协议。如,'src foo' 含义是 '(ip or arp or rarp) src foo'-源为foo的ip、arp、rarp协议包 ,'net bar'意味是'(ip or arp or rarp) net bar'-网络bar上的ip、arp、rarp协议包,'port 53'意味是'(tcp or udp) port53'-端口为53的tcp、udp协议包。
['fddi'协议实际是ether的别名,解析器将其视为指定网络接口上的数据链路层,并且经常包含类似以太网的数据包类型,所以你能用类似以太网的字段的FDDI字段来过滤数据,FDDI头部也包含了其他字段,但是在过滤表达式中不能显示的命名这些字段。
同样,'tr'和'wlan'也是ehter的别名,在前面的介绍FDDI头部的段落中的声明也适用于令牌环和802.11无线局域网协议头部。对于802.11协议头,DA字段为目的地址,SA字段为源地址;BSSID,RA和TA字段没有被检测。]
除了上面所说的基本元素,还有其它的一些不遵循这种模式的基本元素:gateway、broadcast、less、greater和算数表达式,所有的这些基本元素将在厦门介绍。
更复杂的过滤表达式使用与、或和非将基础元素拼接起来。如,'host foo and not port ftp and not port ftp-data'-主机名为foo且端口不为ftp和ftp-data的数据。为了方便,同样的修饰符可以被生了,如'tcp dst port ftp or ftp-data or domain’与以下表达式含义相同'tcp dst port ftp or tcp dst port ftp-data or tcp dst port domain'。
可用的基础元素有:
dst host host
如果IPv4/6数据包的目的地址字段为host,则为真
srv host host
如果IPv4/6数据包的源地址字段为host,则为真
host host
如果IPv4/6数据包的源或目的地址字段为host,则为真
ip host host
也可以表达为: ether proto \ip and host host
如果host拥有多个IP地址,那么任何一个地址都会用于匹配
ether dst ehost
如果以太网的目的地址为ehost,则为真
ether src ehost
如果以太网的源地址为ehost,则为真
ether host ehost
如果以太网的目的或源地址为ehost,则为真
gateway host
如果数据包的网关地址为host,则为真。注意,host为以太网的源或目的地址,而非是源IP或目的IP。host必须是一个名字,并且必须能在主机名到IP地址映射机制和主机名到以太网地址映射机制中找到。(前一映射关系可通过/etc/hosts文件, DNS 或 NIS得到, 而后一映射关系可通过/etc/ethers 文件得到)(一种意义相同的表达式为:ether host ehost 而不是host host,并且ehost/host可以是名字或者数字)
dst net net
如果数据包的IPv4/6目的地址的网络号为net,则为真。Net可能是/etc/networks中的一个名字或者是一个网络号
src net net
如果数据包的IPv4/6源地址的网络号为net,则为真。
net net
如果数据包的IPv4/6目的或源地址的网络号为net,则为真。
net net mask netmask
如果IPv4地址的掩码与指定的netmask想匹配,则为真,这里的地址可以是源地址或者是目的地址。该选项对IPv6地址无效
net net/len
如果IPv4/6地址的掩码与指定的掩码长度想匹配,则为真,这里的地址可以是源地址或者目的地址
dst port port
如果数据包是ip/tcp,ip/udp,ip6/tcp或者ip6/udp并且目的端口为port,则为真。这里的端口可以是一个数字或者是一个在/etc/services中定义的名字。如果使用的是名字,则该名字对应的端口号和相应使用的协议都会被检查;如果是一个数字,则只检查相应的端口号(如,dst port 513将会让tcpdump抓取tcp协议的login服务和udp协议的who服务数据包,而dst domain则会让tcpdump抓取tcp协议的domain服务和udp协议的domain服务数据包)
src port port
如果数据包的源端口为port,则为真
port port
如果数据包的目的或源端口为port,则为真
dst portrange port1-port2
如果数据包是ip/tcp,ip/udp,ip6/tcp或者ip6/udp并且目的端口在port1-port2范围内,则为真。tcpdump 对port1 和port2 解析与port中的port的解析一致
src portrange port1-port2
如果数据包的源端口在port1到port2范围内,则为真
portrange port1-port2
如果数据包的源或者目的端口在port1到port2范围内,则为真
以上任何port或者portrange表达式都可以在之前加上关键字:tcp或者udp,如tcp src port port,只匹配tcp协议下的目的端口为port的数据包
less length
如果数据包的长度小于或等于length,则为真。相同意义的表达式:len <= length
greater length
如果数据包的长度大于或等于length,则为真。相同意义的表达式:len >= length
ip proto protocol
如果数据包为ipv4数据包并且其协议类型为protocol, 则为真。protocol可以是一个数字或者是下列名字中的一个:icmp,icmp6,igmp,igrp,pim,ah,esp,vrrp,udp或tcp。由于tcp,udp 以及icmp是tcpdump 的关键字,所以在这些协议名字之前必须要加上\用来转义(在C-shell中需要用\\来转义)。注意此基础元素不会抓取数据包中协议头链。
ip6 proto protocol
如果数据包为ipv6数据并且其协议类型为protocol,则为真。注意此基础元素不会抓取数据包中协议头链。
ip6 protochain protocol
如果数据包为ipv6数据包并且其协议链中包含类型为protocol协议头, 则为真。
ip6 protochain 6
将匹配其协议头链中拥有TCP 协议头的IPv6数据包。此数据包的IPv6头和TCP头之间可能还会包含验证头,路由头,或者逐跳寻径选项头。由此所触发的相应BPF(Berkeley Packets Filter, 可理解为, 在数据链路层提供数据包过滤的一种机制)代码比较繁琐,并且BPF优化代码也未能照顾到此部分, 从而此选项所触发的包匹配可能会比较慢。
ip protochain protocol
如果数据包为ipv4数据包并且其协议链中包含类型为protocol协议头, 则为真。
ether broadcast
如果数据包为以太网广播包,则为真。ether为可选字段。
ip broadcast
如果数据包为IPv4的广播包,则为真。这会使tcpdump检查全0或和全1的广播约定,并且查看网络接口的子网络掩码,网络接口为正在抓包的网络接口。
如果网络接口的子网络掩码不可用,则有可能是这个网络接口没有掩码或者正在linux上任意的网络接口进行抓取,抓取在不止一个的网络接口上进行,这时无法正常工作。
ether multicast
如果数据包为一个以太网的组播包,则为真。ether为可选字段。这个可以简单记为'ether[0] & 1 != 0'。
ip multicast
如果数据包为一个IPv4的组播包,则为真。
ip6 multicast
如果数据包为一个IPv6的组播包,则为真。
ether proto protocol
如果数据包为一个以太网协议包,则为真。protocol可以是数字或下面名字的一种:ip、ip6、arp、rarp、atalk、aarp、decnet、lat、mopdl、moprc、iso、stp、ipx或者netbeui。注意标识符也是关键字,从而必须通过'\'来进行转义。
[在FDDI(光线分布式数据网络接口)中(如:'fddi protocol arp'),令牌环网(如:'tr protocol arp'),以及IEEE 802.11 无线局域网(如:'wlan protocol arp')中,大多数协议中,protocol标示符来自802.2逻辑链路控制层的头部,其包含在FDDI、令牌环或802.1头中。
当以FDDI、令牌环和802.1这些网络上的相应的协议标识为过滤条件时,tcpdump只是检查LLC头部中以0x000000为组成单元标识符(OUI, 0x000000标识一个内部以太网)的一段'SNAP格式结构'中的protocol ID 域,而不会管包中是否有一段OUI为0x000000的'SNAP格式结构'。
有以下例外:
isotcpdump会检查LLC头部中的DSAP字段(Destination service Access Point,目标服务接入点)和SSAP字段(Source Service Access Point,源服务接入点)
stp 和 netbeuitcpdump会检查LLC 头部中的目标服务接入点(Destination service Access Point)
atalktcpdump会检查LLC 头部中以0x080007 为OUI标识的'SNAP格式结构',并会检查AppleTalk etype域。
此外, 在以太网中, 对于ether proto protocol 选项,tcpdump 会为 protocol 所指定的协议检查以太网类型域(the Ethernet type field),以下协议例外:
iso, stp, and netbeuitcpdump 会检查802.3 物理帧以及LLC 头(这两种检查与FDDI, TR, 802.11网络中的相应检查一致)
atalktcpdump 会检查以太网物理帧中的AppleTalk etype 字段,同时也会检查FDDI,令牌环和802.11协议数据包中LLC头部中的'SNAP格式结构'
aarptcpdump 会检查AppleTalk ARP etype 域,此域或存在于以太网物理帧中, 或存在于LLC(由802.2 所定义)的'SNAP格式结构'中
ipxtcpdump 会检查物理以太帧中的IPX etype域,LLC头中的IPX DSAP域,无LLC头并对IPX进行了封装的802.3帧以及LLC 头部'SNAP格式结构'中的IPX etype 域
decnetsrc host
如果数据包中DECNET源地址为host,则为真
decnet dst host
如果数据包中DECNET目的地址为host,则为真
decnet host host
如果数据包中的DUCNET目的或源地址为host,则为真
ifname interface
如果数据包被指定的网络接口interface接入,则为真
on interface
与ifname意义相同
rnr num
如果数据包匹配指定PF字段值num,则为真
rulenum num
与rnr num意义相同
reason code
如果数据包匹配指定的PF代码code,则为真
rset name
如果数据包匹配指定的PF规则集名name,则为真
ruleset name
与rset name意义相同
srnr num
如果数据包匹配指定的PF规则数num的特定规则,则为真
subrulenum num
与srnr num意义相同
action act
如果数据包匹配时PF有指定的动作act,则为真
ip, ip6, arp, rarp, atalk, aarp, decnet, iso, stp, ipx, netbeui
简写为:ether proto p 其中p为上面协议中的一个
lat, moprc, mopdl
简写为:ehter proto p 其中p为上面协议中的一个。注意tcpdump目前还无法解析这些协议
vlan [vlan_id]
如果数据包为一个802.1Q局域网的包,则为真。如果指定[valn_id],则只有数据包为指定vlan_id的包时为真。注意对于VLAN数据包,在表达式中遇到的第一个vlan关键字会改变表达式中接下来关键字所对应数据包中数据的开始位置(即解码偏移)。在VLAN网络过滤数据包时,vlan [vlan_id]表达式可以被多次使用,关键字vlan每出现一次都会增加4字节偏移。
例如:
vlan 100 && vlan 200 过滤封装在vlan100中的vlan200的数据包
vlan 100 && vlan 300 && ip 过滤封装在vlan300中的ipv4的数据包,而该包又被封装到vlan100的数据包中
mpls [label_num]
如果数据包为MPLS数据包,则为真。如果指定[label_num],则只有数据包为指定label_num的包时为真。注意对于MPLS数据包,在表达式中遇到的第一个mpls关键字会改变表达式中接下来关键字所对应数据包中数据的开始位置(即解码偏移)。在MPLS网络过滤数据包时,mpls [label_num]表达式可以被多次使用,关键字mpls每出现一次都会增加4字节的偏移。
例如:mpls 10000 & mpls 1024 过滤外层mpls标签为10000而内层mpls标签为1024的数据包
mpls && mpls 1024 && host 192.9.200.1 过滤源或目的为192.9.200.1的mpls数据包,且包的内层标签为1024
pppoed
如果数据包为PPP-over-Ethernet的服务器探寻数据包,则为真
pppoes
如果数据包为PPP-over-Ethernet的会话数据包,则为真。注意对于PPP-over-Ethernet会话数据包,在表达式中遇到的第一个pppoes关键字会改变表达式中接下来关键字所对应数据包中数据的开始位置(即解码偏移)。
例如:pppoes && ip 过滤封装在PPPoE数据包中的ipv4数据包
tcp, udp, icmp
简写为:ip proto p or ip6 proto p其中p是以上协议中的一种
iso proto protocol
如果数据包的协议类型为osi协议栈中protocol协议,则为真。protocol可以为一个数字或者是下面名字的一种:clnp,esis或者isis
clnp, esis, isis
简写为:ios proto p 其中p为以上协议中的一种
l1, l2, iih, lsp, snp, csnp, psnp
是IS-IS PDU类型的缩写。
vpi n
如果数据包为一个Solaris系统SunATM设备的ATM包,并且虚拟路径id为n,则为真
vci n
如果数据包为一个Solaris系统SunATM设备的ATM包,并且虚拟通道id为n,则为真
lane
如果数据包为一个Solaris系统SunATM设备的ATM包,并且是一个ATM LANE包,则为真。注意:如果是模拟以太网的LANE数据包或者LANE逻辑单元控制包,表达式中第一个lane关键字会改变表达式中随后条件的测试. 如果没有指定lane关键字,条件测试将按照数据包中内含LLC(逻辑链路层)的ATM包来进行。
llc
如果数据包为一个Solaris系统SunATM设备的ATM包,并且是一个LLC-encapsulated包,则为真
oamf4s
如果数据包为一个Solaris系统SunATM设备的ATM包,并且是Segment OAM F4 信元(VPI=0 并且 VCI=3),则为真
oamf4e
如果数据包为一个Solaris系统SunATM设备的ATM包,并且是end-to-end OAM F4信元(VPI=0 并且 VCI=4),则为真
oamf4
如果数据包为一个Solaris系统SunATM设备的ATM包,并且是Segment 或 end-to-end OAM F4信元(VPI=0 并且 (VCI =3 或 VCI=4)),则为真
oam
如果数据包为一个Solaris系统SunATM设备的ATM包,并且是Segment 或 end-to-end OAM F4信元(VPI=0 并且 (VCI =3 或 VCI=4)),则为真
metac
如果数据包为一个Solaris系统SunATM设备的ATM包,并且是元信令线路(VPI=0 并且 ACI=1),则为真
bcc
如果数据包为一个Solaris系统SunATM设备的ATM包,并且是广播信令线路(VPI=0 并且 ACI=2),则为真
sc
如果数据包为一个Solaris系统SunATM设备的ATM包,并且是信令线路(VPI=0 并且 ACI=5),则为真
ilmic
如果数据包为一个Solaris系统SunATM设备的ATM包,并且是ILMI线路(VPI=0 并且 ACI=16),则为真
connectmsg
如果数据包为一个Solaris系统SunATM设备的ATM包,并且是信令线路和Q.2931的Setup, Calling Proceeding、Connect、Connect Ack、Release或者Release Done消息,则为真
metaconnect
如果数据包为一个Solaris系统SunATM设备的ATM包,并且是元信令线路和Q.2931的Setup, Calling Proceeding、Connect、Connect Ack、Release或者Release Done消息,则为真
expr relop expr
如果relop两侧的表达式满足指定的关系relop,则为真。
relop可以是以下关系操作符之一:>,<,<=,>=,=,!=。
expr是一个算数表达式,词表达式中可以使用整型常量,二进制操作符[+, -, *, /, &,|, <<, >>],长度操作符以及对特定数据包中数据的引用操作符。注意,所有比较操作都默认被操作数都是无符号的,如,0x80000000和0xffffffff都是大于0的。如果要引用数据包中的数据,则可以这样表达:
proto [expr : size]
proto可以是以下类型之一:ether,fddi,tr,wlan,ppp,slip,link,ip,arp,rarp,tcp,udp,icmp,ip6或radio,指明该引用操作多对应的协议。(ether, fddi, wlan, tr, ppp, slip and link 对应于数据链路层, radio 对应于802.11某些数据包中的附带的"radio"头)。注意,tcp,udp和其他上层协议只能应用于IPv4,而不能应用于IPv6(将来可能会支持)。
对于指定协议的所需数据,其在包数据中的偏移字节由expr 来指定。
size是可选项,用于指明所引用数据的长度,其长度可以是1,2或4个字节,如果不指定size,默认为1个字节。长度操作符的关键字为len,代表整个数据包的长度,如'ether[0] & 1 != 0'将会使tcpdump抓取所有组播数据包,'ip[0] & 0xf != 5'表示抓取IPv4的数据包,'ip[6:2] & 0x1fff = 0'表示抓取没被分片的IPv4的数据包或者分片编号为0的被分片的IPv4数据包。这种数据检查方式也适用于tcp和udp数据的引用,即tcp[0]对应于TCP 头中第一个字节,而不是对应任何一个中间的字节。
一些偏移量和字段值是用名字而非数字表示的。下面是可用的协议的头部偏移量字段:icmptype(ICMP类型字段),icmpcode(ICMP 代码字段)和tcpflags(TCP标记字段)。
以下是可用的ICMP类型字段值:icmp-echoreply, icmp-unreach, icmp-sourcequench, icmp-redirect, icmp-echo, icmp-routeradvert, icmp-routersolicit, icmp-timxceed, icmp-paramprob, icmp-tstamp,icmp-tstampreply, icmp-ireq, icmp-ireqreply, icmp-maskreq, icmp-maskreply。
以下是可用的TCP标记字段值:tcp-fin, tcp-syn, tcp-rst, tcp-push, tcp-ack, tcp-urg。
借助括号以及响应操作符,可以把表达式组合在一起使用由于括号是shell的特殊字符, 所以在shell脚本或终端中使用时必须对括号进行转义, 即'(' 与')'需要分别表达成'\(' 与 '\)').
有效的操作符有:
非操作 ('!' 或 'not')
与操作('&&' 或 'and')
或操作('||' 或 'or')
非操作的优先级最高,与操作和或操作优先级相同,并且而这的运算顺序是从左到右的。注意,表达'与操作'时,需要显式写出'and'操作符,而不只是把前后表达元并列放置。如果一个标示符前没有关键字,则在解析表达式时会使用最近用过的关键字,如:
not host vs and ace
是以下表达式的简写:
not host vs and host ace
而不是:not (host vs or ace)
表示数据包的源或目的不是vs的或源或目的为ace的都为真。
整个条件表达式可以被当作一个单独的字符串参数也可以被当作以空格分割的多个参数传入tcpdump,后者更方便些。通常,如果表达式中包含元字符,最好还是使用单独字符串的方式传入。这时,整个表达式需要被单引号括起来。多参数的传入方式中,所有参数最终还是被空格串联在一起,作为一个字符串被解析。
本文标题:linux下cp命令的用法-Linux命令free的输出含义61阅读| 精彩专题| 最新文章| 热门文章| 苏ICP备13036349号-1