起步于308的小菜菜

no money no dream coder 一枚

常用的命令

平时用linux时,我有一个习惯就是把遇到的,比较有用,并且容易忘的命令,放到一个文本文件中,没事的时候可以拿出来看看,这样可以加深印象,时间长了这些命令的用法基本上都能掌握了。以下是100个用法,有什么不对,还请大家指正。

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
1,echo “aa” > test.txt 和 echo “bb” >> test.txt //>将原文件清空,并且内容写入到文件中,>>将内容放到文件的尾部
2,chmod go+w -R  /home/zhangy  //给组用户和其他用户添加写的权限
3,tar -tzvf test.tar.gz        //列出归档内容
4,du -ah  //查看文件列表大小
5,du -sh  //查看所有文件的大小总和
6,echo ’1+2′|bc -l //数学运算
7,uname -a    //查看linux内核等的一些信息
8,badblocks -s /dev/sda     //坏道扫描时显示进度
9,time command     //查看命令的运行时间
10,ls -lrt //按时间的倒序排序
11,rsync -P  //同步时显示进度
12.history -c //清楚历史命令
13,cd – //返回上次目录
14,tree     //显示目录树
15,umount -n /mnt/hda2  //强制卸载
16,echo ~/     //显示用户的home目录
17,echo $[5*5]  //算术运算
18,echo $((5*5)) //算术运算
19,eval ls;ps aux|grep httpd //这二个命令都能执行
20,free -m //有MB为单位显示内存
21,uptime //显示系统已经运行了多长时间,它依次显示下列信息:现在时间、系统已经运行了多长时间、目前有多少登陆用户、系统在过去的1分钟、5分钟和15分钟内的平均负载
22,加法运算
[root@krlcgcms01 mytest]# let a=34+3;
[root@krlcgcms01 mytest]# echo $a;
23,export  //查看所有环境变量
24,echo $PATH //查看单个变量
25,cmp file1 file2   //文件内容比对
26,clear   //清屏
27,echo 23423 |awk –re-interval  ’/[0-9]{3,}/’  //如果不加re-interval的话,不显示
28,cal  //得到一个整齐的日历格式
29,wc -l //统计行数,wc -w 统计单词
30,echo  ”AaDCbd23″ |tr “[A-Z]” “[a-z]” 大写变小写,echo  ”AaDCbdc23″ |tr -c b-d = 将b-d之外的字符串替换成=
31,echo “ADSF” | iconv -f UTF8 -t GBK //把字符由utf8转成gbk -f是from和简写,-t好像terminal的简写
32,cat -n file //内容的前面会显示行号
33,chattr +i file  //只读,root用户也没法对其进行修改
34,lsattr file //查看文件属性
35,cat /etc/passwd |awk -F: ‘{print $1}’  //查看系统中所有用户
36,cat /etc/group //查看系统中所有的组
37,groups //查前当前用户所在的,所有组
38,usermod -g 组名 用户   //这种方式是覆盖的方式,用的时候要小心,如果用户A性于mysql usermod -g php mysql这样的话只
属于php了,
39,usermod -G 组名 用户 //这种方式是增加的方式,如果用户A性于mysql usermod -g php mysql这样的话,mysql就属于2个组了
40,bc  //进入数学计算中去
41,umask 003 u权限是7,g权限是7,其他用户是4,也就是774,777-003=774
42,mkfs -t vfat /dev/hda6 //将移动硬盘里面的一个分区格式化成vfat格式
43,mount /dev/cdrom /media/cdrom  //挂载cdrom
44,getent group 532 //通过组ID,来查找组信息
45,last //登录成功用户记录
46,lastb //登录不成功用户记录
47,dump -S /dev/sda2 //查看一下要备份/dev/sda2所要的容量
48,dump -0j -f /dev/hda2/sda2_bak.dump.bz2 /dev/sda2  //将sda2进行备份并压缩
49,restore -t -f /dev/hda2/sda2_bak.dump  //查看备份信息
50,restore -r -f /dev/hda2/sda2_bak.dump  //还原备份
51,fc-list //查看系统中安装的字体
52,find ./ -type f   -exec grep -q  ”root” {} \;  -exec echo {} \;  //查找目录下文件所包涵的字符串
53,vmstat 5 //每5显示一下次系统信息,cpu,memory,i/o等
54,top 后 在shift + P 所占进程的排序显示
55,top 后 在shift + M 所占内存的排序显示
56,iptraf -g  //查看各个接口的流量
57,ostat -d -x /dev/sda2 2  //用iostat查看磁盘/dev/sda2的磁盘i/o情况,每两秒刷新一次
58, paste -sd ‘|||\n’ test //文件的每4行转换成1行,并用|隔开。
59,lsof -i :22 //知道22端口现在运行什么程序
60,lsof -c abc //显示abc进程现在打开的文件
61,lsof -p 12  //看进程号为12的进程打开了哪些文件
63,route //查看路由信息
64,ifup //开启网卡
65,ifdown //关闭网卡
66,route del -net 172.168.0.0 netmask 255.255.0.0 dev eth0 //删除 172.168这个网段
67,route add -net 172.168.10.0 netmask 255.255.255.0 dev eth0 //增加一个路由
68,netstat -tunl //列出监听的网络服务端口
69,netstat -tun //列出已连接的网络服务端口
70,nmap -sP 172.30.4.0/24  //在这个网段内有多少用户在我的主机上操作,一个不错的安全检查工具
71,vgdisplay   //查看系统中的可用空间
72,lvextend -L+20G /dev/tank/part1 //向part1这个分区增加20G的空间
73,lvresize -L-10G /dev/tank/part2 //向part2这个分区减少10G的空间
74,pvdisplay //查看磁盘信息
75,mplayer -loop 10 /mnt/song/music/花儿开了.mp3  //循环播放10遍
76,pacman -S firefox -nd  //nd去掉依赖
77,wget -c //断点下载
78,chroot  /mnt/ubuntu     //改变根目录到/mnt/ubuntu
79,ctrl+a  //命令行下,光标称动到开头
80,ctrl+e  //命令行下,光标移动结尾
81,cut -d: -f 1-4 test  //用:分割文件,取分割后的1-4列
82,file  /home/zhangy/test.php  //用于查看文件的一些基本信息
83,touch test.txt //创建一个空文件 text.txt
84,htpasswd -cbd /usr/local/nginx/conf/authfile  //创建访问控制文件
85,df  //查看磁盘空间,和当前的磁盘数
86,fdisk -l  //查看所有磁盘数
87,alsamixer  //进入后,m键可以实现静音
88,killall httpd  //把所有httpd进程杀掉
89,killall -9 mysqld_safe  //有些进程超级用户也停止不了,-9是强制删除
90,mirror /mysql //下载mysql目录
91,mirror -R /mysql     //上传mysql目录
92,rmmod pcspkr  //关掉tab提示音
93,modprobe pcspkr  //开启tab提示音
94,gpasswd -a zhangy wheel //将zhangy这个用户添加到wheel这个组
95,dd if=/dev/zero of=/virtual/ubuntu.virt.img bs=1M count=4096  //创建一个4G的IMG镜像
96,lspic //显示pci设备
97,lsusb //显示usb设备
98,history | less //less根more有点像,感觉less用着更舒服点
99,ln -s //如果忘了-s就变成硬链接了
100,tar zxvf test.tar.gz -C /home/zhangy //将内容解压到指定目录

作者:海底苍鹰 文章来源:http://blog.51yip.com/linux/1213.html

Tcpdump

如下一些实例:

1
tcpdump -i eth0

其中,eth0为参数值,表示需要抓包的网口,这是个必需参数哦。

tcpdump支持很多的关键字,下面先看几个例子:

1
2
3
4
5
(例1)tcpdump -i eth0 host 192.168.0.250 —–在网口eth0上抓取主机地址为192.168.0.250的所有数据包。

(例2)tcpdump -i eth0 net 192.168.0.0/24 —— 在网口eth0上抓取网络地址为192.168.0.0/24的所有数据包

(例3)tcpdump -i eth0 port 80 —— 在网口eth0上抓取端口为80的所有数据包(注意,这里不区分是源端口还是目的端口)

当然,我们也可以指定源端口或目的端口

1
2
3
(例4)tcpdump -i eth0 src port 80 and dst port6100 — 在网口eth0上抓取源端口为80且目的端口为6100的数据包,这里用到了and逻辑运算符,后面再介绍

(例5)tcpdump -i eth0 icmp — 在网口eth0上抓取所有icmp协议的数据包

以上几个例子,可以大致体现出tcpdump的基本用法。

实际上,tcpdump主要包括三种类型的关键字,第一种是关于类型的关键字,主要包括host,net,port,如上面的例(1)(2)(3),第二种

是确定传输方向的关键字,主要包括src,dst,src or dst,src and dst,这些关键字指明了传输的方向,如上面的例(4)。第三种是协议关键字,包括fddi,ip,arp,

rarp,tcp,udp,imcp等,如上面的例(5)。

除了这三种类型的关键字外,还有其他重要的关键字,如:gateway,broadcast,less,greater,还有三种逻辑运算,取非运算是’not’、’!‘,与运算符是’and’、’&&’、

或运算符是’or’、’||’,这些关键字可以组合起来构成强大的组合条件来满足我们的需求。

先看看tcpdump的具体参数及意义:

-i:指定tcpdump监听的网络接口

-s:指定要监听数据包的长度

-c:指定要监听的数据包数量,达到指定数量后自动停止抓包

-w:指定将监听到的数据包写入文件中保存

-A:指定将每个监听到的数据包以ACSII可见字符打印

-n:指定将每个监听到数据包中的域名转换成IP地址后显示

-nn:指定将每个监听到的数据包中的域名转换成IP、端口从应用名称转换成端口号后显示

-e:指定将监听到的数据包链路层的信息打印出来,包括源mac和目的mac,以及网络层的协议

-p:将网卡设置为非混杂模式,不能与host或broadcast一起使用

-r:指定从某个文件中读取数据包

-S:指定打印每个监听到的数据包的TCP绝对序列号而非相对序列号

OK,参数介绍先到这里,下面看几个具体例子

1
tcpdump -i eth0 -s 1400 -nn host 192.168.0.250 and ! 192.168.0.74 and icmp -e

抓取网口eth0上192.168.0.250与除192.168.0.74外的其他主机之间的icmp报文

1
tcpdump -i eth0 -s 1400 -nn tcp and \(host 192.168.0.250 and ! 192.168.0.74\)

抓取网口eth0上192.168.0.250与除192.168.0.74外的所有tcp数据包,这里用到了括号,注意,在tcpdump中使用括号时必须用转义。

1
tcpdump -i eth0 ether src or dst 00:21:85:6C:D9:A3

抓取网口eth0上源mac地址或目的mac地址为00:21:85:6C:D9:A3的所有数据包,注意,这里的mac地址格式必须以’:‘分隔。

=============================================================================================================

下面是参考的一篇文章的原文http://linux.chinaitlab.com/administer/840012.html%EF%BC%9A

  TCPDUMP简介

  在传统的网络分析和测试技术中,嗅探器(sniffer)是最常见,也是最重要的技术之一。sniffer工具首先是为网络管理员和网络程序员进行网络分析而设计的。对于网络管理人员来说,使用嗅探器可以随时掌握网络的实际情况,在网络性能急剧下降的时候,可以通过sniffer工具来分析原因,找出造成网络阻塞的来源。对于网络程序员来说,通过sniffer工具来调试程序。

  用过windows平台上的sniffer工具(例如,netxray和sniffer pro软件)的朋友可能都知道,在共享式的局域网中,采用sniffer工具简直可以对网络中的所有流量一览无余!Sniffer工具实际上就是一个网络上的抓包工具,同时还可以对抓到的包进行分析。由于在共享式的网络中,信息包是会广播到网络中所有主机的网络接口,只不过在没有使用sniffer工具之前,主机的网络设备会判断该信息包是否应该接收,这样它就会抛弃不应该接收的信息包,sniffer工具却使主机的网络设备接收所有到达的信息包,这样就达到了网络监听的效果。

  Linux作为网络服务器,特别是作为路由器和网关时,数据的采集和分析是必不可少的。所以,今天我们就来看看Linux中强大的网络数据采集分析工具——TcpDump。

  用简单的话来定义tcpdump,就是:dump the traffice on a network,根据使用者的定义对网络上的数据包进行截获的包分析工具。

  作为互联网上经典的的系统管理员必备工具,tcpdump以其强大的功能,灵活的截取策略,成为每个高级的系统管理员分析网络,排查问题等所必备的东东之一。

  顾名思义,TcpDump可以将网络中传送的数据包的“头”完全截获下来提供分析。它支持针对网络层、协议、主机、网络或端口的过滤,并提供and、or、not等逻辑语句来帮助你去掉无用的信息。

  tcpdump提供了源代码,公开了接口,因此具备很强的可扩展性,对于网络维护和入侵者都是非常有用的工具。tcpdump存在于基本的FreeBSD系统中,由于它需要将网络界面设置为混杂模式,普通用户不能正常执行,但具备root权限的用户可以直接执行它来获取网络上的信息。因此系统中存在网络分析工具主要不是对本机安全的威胁,而是对网络上的其他计算机的安全存在威胁。

  普通情况下,直接启动tcpdump将监视第一个网络界面上所有流过的数据包。

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

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
  bash-2.02# tcpdump

  tcpdump: listening on eth0

  11:58:47.873028 202.102.245.40.netbios-ns > 202.102.245.127.netbios-ns: udp 50

  11:58:47.974331 0:10:7b:8:3a:56 > 1:80:c2:0:0:0 802.1d ui/C len=43

  0000 0000 0080 0000 1007 cf08 0900 0000

  0e80 0000 902b 4695 0980 8701 0014 0002

  000f 0000 902b 4695 0008 00

  11:58:48.373134 0:0:e8:5b:6d:85 > Broadcast sap e0 ui/C len=97

  ffff 0060 0004 ffff ffff ffff ffff ffff

  0452 ffff ffff 0000 e85b 6d85 4008 0002

  0640 4d41 5354 4552 5f57 4542 0000 0000

  0000 00

  ^C

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

  首先我们注意一下,从上面的输出结果上可以看出来,基本上tcpdump总的的输出格式为:系统时间 来源主机.端口 > 目标主机.端口 数据包参数

  TcpDump的参数化支持

  tcpdump支持相当多的不同参数,如使用-i参数指定tcpdump监听的网络界面,这在计算机具有多个网络界面时非常有用,使用-c参数指定要监听的数据包数量,使用-w参数指定将监听到的数据包写入文件中保存,等等。

  然而更复杂的tcpdump参数是用于过滤目的,这是因为网络中流量很大,如果不加分辨将所有的数据包都截留下来,数据量太大,反而不容易发现需要的数据包。使用这些参数定义的过滤规则可以截留特定的数据包,以缩小目标,才能更好的分析网络中存在的问题。tcpdump使用参数指定要监视数据包的类型、地址、端口等,根据具体的网络问题,充分利用这些过滤规则就能达到迅速定位故障的目的。请使用man tcpdump查看这些过滤规则的具体用法。

  显然为了安全起见,不用作网络管理用途的计算机上不应该运行这一类的网络分析软件,为了屏蔽它们,可以屏蔽内核中的bpfilter伪设备。一般情况下网络硬件和TCP/IP堆栈不支持接收或发送与本计算机无关的数据包,为了接收这些数据包,就必须使用网卡的混杂模式,并绕过标准的TCP/IP堆栈才行。在FreeBSD下,这就需要内核支持伪设备bpfilter。因此,在内核中取消bpfilter支持,就能屏蔽tcpdump之类的网络分析工具。

  并且当网卡被设置为混杂模式时,系统会在控制台和日志文件中留下记录,提醒管理员留意这台系统是否被用作攻击同网络的其他计算机的跳板。

1
  May 15 16:27:20 host1 /kernel: fxp0: promiscuous mode enabled

  虽然网络分析工具能将网络中传送的数据记录下来,但是网络中的数据流量相当大,如何对这些数据进行分析、分类统计、发现并报告错误却是更关键的问题。网络中的数据包属于不同的协议,而不同协议数据包的格式也不同。因此对捕获的数据进行解码,将包中的信息尽可能的展示出来,对于协议分析工具来讲更为重要。昂贵的商业分析工具的优势就在于它们能支持很多种类的应用层协议,而不仅仅只支持tcp、udp等低层协议。

  从上面tcpdump的输出可以看出,tcpdump对截获的数据并没有进行彻底解码,数据包内的大部分内容是使用十六进制的形式直接打印输出的。显然这不利于分析网络故障,通常的解决办法是先使用带-w参数的tcpdump 截获数据并保存到文件中,然后再使用其他程序进行解码分析。当然也应该定义过滤规则,以避免捕获的数据包填满整个硬盘。

  TCP功能

  数据过滤

  不带任何参数的TcpDump将搜索系统中所有的网络接口,并显示它截获的所有数据,这些数据对我们不一定全都需要,而且数据太多不利于分析。所以,我们应当先想好需要哪些数据,TcpDump提供以下参数供我们选择数据:

  -b 在数据-链路层上选择协议,包括ip、arp、rarp、ipx都是这一层的。

1
  例如:tcpdump -b arp 将只显示网络中的arp即地址转换协议信息。

  -i 选择过滤的网络接口,如果是作为路由器至少有两个网络接口,通过这个选项,就可以只过滤指定的接口上通过的数据。例如:

1
  tcpdump -i eth0 只显示通过eth0接口上的所有报头。

  src、dst、port、host、net、ether、gateway这几个选项又分别包含src、dst 、port、host、net、ehost等附加选项。他们用来分辨数据包的来源和去向,src host 192.168.0.1指定源主机IP地址是192.168.0.1,dst net 192.168.0.0/24指定目标是网络192.168.0.0。以此类推,host是与其指定主机相关无论它是源还是目的,net是与其指定网络相关的,ether后面跟的不是IP地址而是物理地址,而gateway则用于网关主机。可能有点复杂,看下面例子就知道了:

1
  tcpdump src host 192.168.0.1 and dst net 192.168.0.0/24

  过滤的是源主机为192.168.0.1与目的网络为192.168.0.0的报头。

1
  tcpdump ether src 00:50:04:BA:9B and dst……

  过滤源主机物理地址为XXX的报头(为什么ether src后面没有host或者net?物理地址当然不可能有网络喽)。

1
  Tcpdump src host 192.168.0.1 and dst port not telnet

  过滤源主机192.168.0.1和目的端口不是telnet的报头。

  ip icmp arp rarp 和 tcp、udp、icmp这些选项等都要放到第一个参数的位置,用来过滤数据报的类型。

  例如:

1
  tcpdump ip src……

  只过滤数据-链路层上的IP报头。

1
  tcpdump udp and src host 192.168.0.1

  只过滤源主机192.168.0.1的所有udp报头。

  数据显示/输入输出

  TcpDump提供了足够的参数来让我们选择如何处理得到的数据,如下所示:

  -l 可以将数据重定向。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
  如tcpdump -l >tcpcap.txt将得到的数据存入tcpcap.txt文件中。

  -n 不进行IP地址到主机名的转换。

  如果不使用这一项,当系统中存在某一主机的主机名时,TcpDump会把IP地址转换为主机名显示,就像这样:eth0 < ntc9.1165> router.domain.net.telnet,使用-n后变成了:eth0 < 192.168.0.9.1165 > 192.168.0.1.telnet。

  -nn 不进行端口名称的转换。

  上面这条信息使用-nn后就变成了:eth0 < ntc9.1165 > router.domain.net.23。

  -N 不打印出默认的域名。

  还是这条信息-N 后就是:eth0 < ntc9.1165 > router.telnet。

  -O 不进行匹配代码的优化。

  -t 不打印UNIX时间戳,也就是不显示时间。

  -tt 打印原始的、未格式化过的时间。

  -v 详细的输出,也就比普通的多了个TTL和服务类型。

  [expression]的用法:

  expression是tcpdump最为有用的高级用法,可以利用它来匹配一些特殊的包。下面介绍一下expression的用法,主要是如何写出符合要求最为严格expression。如果tcpdump中没有expression,那么tcpdump会把网卡上的所有数据包输出,否则会将被expression匹配的包输出。

1
2
3
  expression 由一个或多个[primitives]组成,而[primitives]由一个或多个[qualitifer]加一个id(name)或数字组成,它们的结构如用正则表达式则可表示为:

  expression = ([qualitifer]+(id|number))+

  依次看来,expression是一个复杂的条件表达式,其中[qualitifer]+(id|number)就是一个比较基本条件,qualitifer就表达一些的名称(项,变量),id或number则表示一个值(或常量)。

  qualitifer共有三种,分别是:

  type 表示id name或number涉及到的类型,这些词有host, nest, port ,portrange等等。

  例子:

1
2
3
4
5
  host foo 此为一个简单的primitive,host为qualitifer, foo为id name

  net 128.3 net为qualitifer, 128.3为number

  port 20

  等等

  每个privimtive必须有一个type词,如果表达式中没有,则默认是host.

  dir 指定数据传输的方向,这些词有src, dst, src or dst, src and dst

  例子:

  dst net 128.3 ;此为一个相对复杂的primitive,结构为dir type number,表示目标网络为128.3的条件。

  src or dst port ftp-data 此为比上一个相对简的结构,src or dst表示源或目标,ftp-data为id,表示ftp协议中数据传输端口,故整体表示源或目标端口ftp-data的数据包即匹配。

  如果在一个primitive中没有dir词,此默认为src or dst. 如 host foo则表示源或目标主机为foo的数据包都匹配。

  proto 此种词是用来匹配某种特定协议的,这些词包括:ether, fddi, tr, wlan, ip, ip6, arp, rarp, decnet,tcp和udp。其实这些词经常用来匹配某种协议,是使用率最高的一组词了。

  上面三种qualitifer和id name或number组成一个primitive通常是下面这种方式的:

  proto dir type id(number) ,即primitive=proto dir type (id | number)

  如:

1
2
3
  tcp src port 80

  ip dst host 192.168.1.1

  如果出现type的话,一定会出现id或num

  如果出现dir,那么也会出现type,如果不出现,默认为host

  而proto可单独出现,如 tcpdump ‘tcp’

  通过上面介绍的三种qualitifer,我们很快就可以写出一个primitive,下面我就只用一个primitive作为expression匹配数据包。

  (1)匹配ether包

  匹配特定mac地址的数据包。

1
  tcpdump 'ether src 00:19:21:1D:75:E6'

  匹配源mac为00:19:21:1D:75:E6的数据包其中src可改为dst, src or dst来匹改变条件

  匹配ether广播包。ether广播包的特征是mac全1.故如下即可匹配:

1
2
3
4
5
6
7
8
9
  tcpdump 'ether dst ff:ff:ff:ff:ff:ff'

  ylin@ylin:~$ sudo tcpdump -c 1 'ether dst ff:ff:ff:ff:ff:ff'

  tcpdump: verbose output suppressed, use -v or -vv for full protocol decode

  listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes

  10:47:57.784099 arp who-has 192.168.240.77 tell 192.168.240.189

  在此,只匹配1个包就退出了。第一个是arp请求包,arp请求包的是采用广播的方式发送的,被匹配那是当之无愧的。

  匹配ether组播包,ether的组播包的特征是mac的最高位为1,其它位用来表示组播组编号,如果你想匹配其的多播组,知道它的组MAC地址即可。如

1
  tcpdump 'ether dst <Mac_Adrress>' Mac_Address表示地址,填上适当的即可。如果想匹配所有的ether多播数据包,那么暂时请放下,下面会继续为你讲解更高级的应用。

  (2)匹配arp包

  arp包用于IP到Mac址转换的一种协议,包括arp请求和arp答应两种报文,arp请求报文是ether广播方式发送出去的,也即 arp请求报文的mac地址是全1,因此用ether dst FF;FF;FF;FF;FF;FF可以匹配arp请求报文,但不能匹配答应报文。因此要匹配arp的通信过程,则只有使用arp来指定协议。

  tcpdump ‘arp’ 即可匹配网络上arp报文。

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
  ylin@ylin:~$ arping -c 4 192.168.240.1>/dev/null& sudo tcpdump -p 'arp'

  [1] 9293

  WARNING: interface is ignored: Operation not permitted

  tcpdump: verbose output suppressed, use -v or -vv for full protocol decode

  listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes

  11:09:25.042479 arp who-has 192.168.240.1 (00:03:d2:20:04:28 (oui Unknown)) tell ylin.local

  11:09:25.042702 arp reply 192.168.240.1 is-at 00:03:d2:20:04:28 (oui Unknown)

  11:09:26.050452 arp who-has 192.168.240.1 (00:03:d2:20:04:28 (oui Unknown)) tell ylin.local

  11:09:26.050765 arp reply 192.168.240.1 is-at 00:03:d2:20:04:28 (oui Unknown)

  11:09:27.058459 arp who-has 192.168.240.1 (00:03:d2:20:04:28 (oui Unknown)) tell ylin.local

  11:09:27.058701 arp reply 192.168.240.1 is-at 00:03:d2:20:04:28 (oui Unknown)

  11:09:33.646514 arp who-has ylin.local tell 192.168.240.1

  11:09:33.646532 arp reply ylin.local is-at 00:19:21:1d:75:e6 (oui Unknown)

  本例中使用arping -c 4 192.168.240.1产生arp请求和接收答应报文,而tcpdump -p ‘arp’匹配出来了。此处-p选项是使网络工作于正常模式(非混杂模式),这样是方便查看匹配结果。

  (3)匹配IP包

  众所周知,IP协议是TCP/IP协议中最重要的协议之一,正是因为它才能把Internet互联起来,它可谓功不可没,下面分析匹配IP包的表达式。

  对IP进行匹配

1
2
3
4
5
6
7
8
9
10
11
12
13
  tcpdump ‘ip src 192.168.240.69′

  ylin@ylin:~$ sudo tcpdump -c 3 ‘ip src 192.168.240.69′

  tcpdump: verbose output suppressed, use -v or -vv for full protocol decode

  listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes

  11:20:00.973605 IP ylin.local.51486 > walnut.crossbeamsys.com.ssh: S 2706301341:2706301341(0) win 5840 <mss 1460,sackOK,timestamp 1687608 0,nop,wscale 5>

  11:20:00.974328 IP ylin.local.32849 > 192.168.200.150.domain: 5858+ PTR? 20.200.168.192.in-addr.arpa. (45)

  11:20:01.243490 IP ylin.local.51486 > walnut.crossbeamsys.com.ssh: . ack 2762262674 win 183 <nop,nop,timestamp 1687676 4155416897>

  IP广播组播数据包匹配:只需指明广播或组播地址即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
  tcpdump ‘ip dst 240.168.240.255′

  ylin@ylin:~$ sudo tcpdump ‘ip dst 192.168.240.255′

  tcpdump: verbose output suppressed, use -v or -vv for full protocol decode

  listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes

  11:25:29.690658 IP dd.local > 192.168.240.255: ICMP echo request, id 10022, seq 1, length 64

  11:25:30.694989 IP dd.local > 192.168.240.255: ICMP echo request, id 10022, seq 2, length 64

  11:25:31.697954 IP dd.local > 192.168.240.255: ICMP echo request, id 10022, seq 3, length 64

  11:25:32.697970 IP dd.local > 192.168.240.255: ICMP echo request, id 10022, seq 4, length 64

  11:25:33.697970 IP dd.local > 192.168.240.255: ICMP echo request, id 10022, seq 5, length 64

  11:25:34.697982 IP dd.local > 192.168.240.255: ICMP echo request, id 10022, seq 6, length 64

  此处匹配的是ICMP的广播包,要产生此包,只需要同一个局域网的另一台主机运行ping -b 192.168.240.255即可,当然还可产生组播包,由于没有适合的软件进行模拟产生,在此不举例子。

  (4)匹配TCP数据包

  TCP同样是TCP/IP协议栈里面最为重要的协议之一,它提供了端到端的可靠数据流,同时很多应用层协议都是把TCP作为底层的通信协议,因为TCP的匹配是非常重要的。

  如果想匹配HTTP的通信数据,那只需指定匹配端口为80的条件即可

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
  tcpdump ‘tcp dst port 80′

  ylin@ylin:~$ wget http://www.baidu.com 2>1 1 >/dev/null & sudo tcpdump -c 5 ‘tcp port 80′

  [1] 10762

  tcpdump: verbose output suppressed, use -v or -vv for full protocol decode

  listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes

  12:02:47.549056 IP xd-22-43-a8.bta.net.cn.www > ylin.local.47945: S 1202130469:1202130469(0) ack 1132882351 win 2896 <mss 1460,sackOK,timestamp 3497190920 2329221,nop,wscale 2>

  12:02:47.549085 IP ylin.local.47945 > xd-22-43-a8.bta.net.cn.www: . ack 1 win 183 <nop,nop,timestamp 2329258 3497190920>

  12:02:47.549226 IP ylin.local.47945 > xd-22-43-a8.bta.net.cn.www: P 1:102(101) ack 1 win 183 <nop,nop,timestamp 2329258 3497190920>

  12:02:47.688978 IP xd-22-43-a8.bta.net.cn.www > ylin.local.47945: . ack 102 win 698 <nop,nop,timestamp 3497190956 2329258>

  12:02:47.693897 IP xd-22-43-a8.bta.net.cn.www > ylin.local.47945: . 1:1409(1408) ack 102 win 724 <nop,nop,timestamp 3497190957 2329258>

 ```

 

 

  (5)匹配udp数据包

  udp是一种无连接的非可靠的用户数据报,因此udp的主要特征同样是端口,用如下方法可以匹配某一端口

  tcpdump ‘upd port 53′ 查看DNS的数据包

  ylin@ylin:~$ ping -c 1 www.baidu.com > /dev/null& sudo tcpdump -p udp port 53

  [1] 11424

  tcpdump: verbose output suppressed, use -v or -vv for full protocol decode

  listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes

  12:28:09.221950 IP ylin.local.32853 > 192.168.200.150.domain: 63228+ PTR? 43.22.108.202.in-addr.arpa. (44)

  12:28:09.222607 IP ylin.local.32854 > 192.168.200.150.domain: 5114+ PTR? 150.200.168.192.in-addr.arpa. (46)

  12:28:09.487017 IP 192.168.200.150.domain > ylin.local.32853: 63228 1/0/0 (80)

  12:28:09.487232 IP 192.168.200.150.domain > ylin.local.32854: 5114 NXDomain* 0/1/0 (140)

  12:28:14.488054 IP ylin.local.32854 > 192.168.200.150.domain: 60693+ PTR? 69.240.168.192.in-addr.arpa. (45)

  12:28:14.755072 IP 192.168.200.150.domain > ylin.local.32854: 60693 NXDomain 0/1/0 (122)

1
2
3
4
5
6
7
  使用ping www.baidu.com目标是产生DNS请求和答应,53是DNS的端口号。

  此外还有很多qualitifer是还没有提及的,下面是其它合法的primitive,在tcpdump中是可以直接使用的。

  gateway host

  匹配使用host作为网关的数据包,即数据报中mac地址(源或目的)为host,但IP报的源和目的地址不是host的数据包。

  dst net net

  src net net

  net net

  net net mask netmask

  net net/len

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
  匹配IPv4/v6地址为net网络的数据报。

  其中net可以为192.168.0.0或192.168这两种形式。如net 192.168 或net 192.168.0.0

  net net mask netmask仅对IPv4数据包有效,如net 192.168.0.0 mask 255.255.0.0

  net net/len同样只对IPv4数据包有效,如net 192.168.0.0/16

  dst portrange port1-port2

  src portrange port1-port2

  portrange port1-port2

  匹配端口在port1-port2范围内的ip/tcp,ip/upd,ip6/tcp和ip6/udp数据包。dst, src分别指明源或目的。没有则表示src or dst

  less length 匹配长度少于等于length的报文。

  greater length 匹配长度大于等于length的报文。

  ip protochain protocol 匹配ip报文中protocol字段值为protocol的报文

  ip6 protochain protocol 匹配ipv6报文中protocol字段值为protocol的报文

  如tcpdump ‘ip protochain 6 匹配ipv4网络中的TCP报文,与tcpdump ‘ip && tcp’用法一样,这里的&&连接两个primitive。6是TCP协议在IP报文中的编号。

  ether broadcast

  匹配以太网广播报文

  ether multicast

  匹配以太网多播报文

  ip broadcast

  匹配IPv4的广播报文。也即IP地址中主机号为全0或全1的IPv4报文。

  ip multicast

  匹配IPv4多播报文,也就是IP地址为多播地址的报文。

  ip6 multicast

  匹配IPv6多播报文,即IP地址为多播地址的报文。

  vlan vlan_id

  匹配为vlan报文 ,且vlan号为vlan_id的报文

  到些为此,我们一直在介绍primitive是如何使用的,也即expression只有一个primitive。通过学会写好每个primtive,我们就很容易把多个primitive组成一个expression,方法很简单,通过逻辑运算符连接起来就可以了,逻辑运算符有以下三个:

  “&&” 或”and”

  “||” 或“or”

  “!” 或“not”

  并且可通过()进行复杂的连接运算。

  如tcpdump ‘ip && tcp’

  tcpdump ‘ host 192.168.240.3 &&( tcp port 80 || tcp port 443)’

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
  通过上面的各种primitive,我们可以写出很丰富的条件,如ip, tcp, udp,vlan等等。如IP,可以按址址进行匹,tcp/udp可以按端口匹配。但是,如果我想匹配更细的条件呢?如tcp中只含syn标志,fin标志的报文呢?上面的primitive恐怕无能为力了。不用怕,tcpdump为你提供最后一个功能最强大的primitive,记住是primitive,而不是expression。你可以用多个这个的primitive组成更复杂的 expression.

 

 

 

  最后一个primitive形式为 expr relop expr

  若把这个形式记为A,那么你可这样写tcpdump ‘A1 && A2 && ip src 192.168.200.1′,等等。

  下面我们就来分析A这个形式,看看这是如何强大,如果你觉得很乱的话,建议你先用用上面的知识来实际操作几次,要不然就会很乱的,因为expression太复杂了。

  形式:expr relop expr

  relop表示关系操作符,可以为>, < ,>=,<=, =, !=之一,

  expr是一个算术表达式,由整数组成和二元运算符(+,-,*,/,&,|, <<, >>),长度操作,报文数据访问子。同时所有的整数都是无符号的,即0×80000000 和 0xffffffff > 0。为了访问报文中的数据,可使用如下方式:

  proto [ expr : size ]

  proto表示该问的报文,expr的结果表示该报文的偏移,size为可选的,表示从expr偏移量起的szie个字节,整个表达式为proto报文 中,expr起的szie字节的内容(无符号整数)

  下面是expr relop expr这种形式primitive的例子:

  ’ether[0] & 1 !=0′ ether报文中第0个bit为1,即以太网广播或组播的primtive。

  通过这种方式,我们可以对报文的任何一个字节进行匹配了,因此它的功能是十分强大的。

  ‘ip[0] = 4’ ip报文中的第一个字节为version,即匹配IPv4的报文,

  如果我们想匹配一个syn报文,可以使用:’tcp[13] = 2′,因为tcp的标志位为TCP报文的第13个字节,而syn在这个字节的低1位,故匹配只有syn标志的报文,上述条件是可满要求的,并且比较严格。

  如果想匹配ping命令的请求报文,可以使用’icmp[0]=8′,因为icmp报文的第0字符表示类型,当类型值为8时表示为回显示请求。

  对于TCP和ICMP中常用的字节,如TCP中的标志位,ICMP中的类型,这个些偏移量有时会忘记。不过tcpdump为你提供更方便的用法,你不用记位这些数字,用字符就可以代替了.

  对于ICMP报文,类型字节可以icmptype来表示它的偏称量,上面的primitive可改为’icmp[icmptype] =8′,如果8也记不住怎么办?tcpdump还为该字节的值也提供了字符表示,如’icmp[icmptype] = icmp-echo’。

  下面是tcpdump提供的字符偏移量:

  icmptype:表示icmp报文中类弄字节的偏移量

  icmpcode:表示icmp报文中编码字节的偏移量

  tcpflags:表示TCP报文中标志位字节的偏移量

  此外,还提供了很多值来对应上面的偏移字节:

  ICMP中类型字节的值可以是:

  icmp-echoreply, icmp-unreach, icmp-sourcequench, icmp-redi‐rect, icmp-echo, icmp-routeradvert, icmp-routersolicit,

  icmp-timxceed, icmp-paramprob, icmp-tstamp, icmp-tstam‐preply, icmp-ireq, icmp-ireqreply, icmp-maskreq, icmp-maskreply.

  TCP中标志位字节的值可以是:

  tcp-fin, tcp-syn, tcp-rst, tcp-push, tcp-ack, tcp-urg.

  通过上面的字符表示,我们可以写出下面的primitive

  ’tcp[tcpflags] = tcp-syn’ 匹配只有syn标志设置为1的 tcp报文

  ’tcp[tcpflags] & (tcp-syn |tcp-ack |tcp-fin) !=0′ 匹配含有syn,或ack或fin标志位的TCP报文

  对于IP报文,没有提供字符支持,如果想匹配更细的条件,直接使用数字指字偏移量就可以了,不过要对IP报文有更深入的了解才可以。

  学会写primitive后,expression就是小菜一碟了,由一个或多个primitive组成,并且逻辑连接符组成即可:

  tcpdump ‘host 192.168.240.91 && icmp[icmptype] = icmp-echo’

  tcpdump ‘host 192.168.1.100 && vrrp’

  tcpdump ‘ether src 00:00:00:00:00:02 && ether[0] & 1 !=0′ “`   让你随心所欲地使用tcpdump,将不用再从复杂的输出中去挑报文了!

  如此,我们可以写出更复杂的表达式来匹配报文,如IP或TCP中的报文id,IP是中的分段标志,ICMP中类型和代码等。

转载自http://blog.csdn.net/zjl_1026_2001/article/details/7303118

今天

1
2
3
4
今天~冷~冻~冰。高一同班的一女生今告诉我《盗墓笔记8》出了,
曾经坐在她后面看这小说,想不到她居然也看了而且很迷恋。。
移动硬盘两天了还没到,可恶的申通!!晚上打电话回家了。。
怀念老妈做的菜,更喜欢吃自个做的菜。。青菜啊。。就这样了

想说的那些话

许久未曾写下些什么,每次抬起手放在键盘上就有种卡住的感觉,如鲠在喉.10年9月自己单枪匹马的坐着k538经过一天一夜的奔波来到杭州,进入了计量~时间过的太快了,禁不起片刻的伫足.转眼四年已快过四分之三了
伴随着成长,随之而来的便是压力.回忆起小时候信誓旦旦的说想快点长大,是多么的天真.殊不知长大的结局就是各种莫名其妙的压力开始死皮赖脸的往你肩上垒.我并不是反感压力,反而我倒是挺嗜迷这种压力的感觉.说来也奇怪,人总是对自己的真实存在充满怀疑,而这些代表着责任的压力恰恰填补了存在感缺失的空隙.
思前想后,总是被一个问题困扰.人为什么而活.记得之前不少在室友面前感叹人生,还因而被他们当做笑柄.我们活着的意义是什么呢?即便那样不着调的理由也算意义的话,那么人活着连这种可怜的意义都没有.长辈们说为了下一代,父母为了儿女,儿女又为了未来的下一代.这便是如今普遍支撑起人们意志的理由.然而这是意义么?也许问题本身就存在毛病,很多事情并不是为了有意义而存在的.这世间万物的存在,它们又何时想过意义.所以太追求意义只是可笑的作茧自缚.
之前想过~十多年的寒窗”苦”读,总想给自己放个长长的假.去各处游历也好.就像南宁帮的小宝哥一样现在到处旅游~总之是想过一种没有任何压力的生活.但是现实是禁不起这么久的清闲的.正如我刚才说的,时间禁不起半点伫足
前几天跟老同学调侃~~大家都问毕业后会回省内发展吗?我说不回的~原因很简单:专业不对口~我也想为家乡的发展作贡献的~毕竟很多人都说,像我这样还会那么一丁半点技术的水货,应该去杭州上海深圳那样的大城市去发展,待遇很更好~自己身边的大牛们也都奔向这些城市~待遇都5k左右或者更多的~或许吧~但这样随之就有很多问题随之而来~
原来在人人上面看过几篇帖子,有说父母慢慢变老的细节的,也有正儿八经计算我们一生还能见父母多少次的.不管形式如何,主题都是一样.人在长大,父母在变老.我们在一起的年华并不如我们想象的那么多了.看完之后感触颇深,”父母在,不远游”也成了我经常念及的话.虽说”好男儿志在四方”苦守一地只会沦为窝囊的代名词.但我总觉得,人活着总要去在意一点情感吧,这样也不妄自诩情感生物.时常能见着父母,能隔三岔五的嘘个寒问个暖什么的才是我想要的.所以现在的我远在它乡~一周至少会打两次长途回家跟老爸老妈唠叨上一段时间~算是对自己的罪过的一种弥补吧~至少这样我打完电话的心情总是明朗~就像之前我打回去告诉放假回家的具体日期后~~现在我每次打回去他们都会问票买的怎么样了~

之前打电话回家老爸老妈总会问生活费还够用吗?我总说够用的~其实确是够用了~虽说每个家庭,每位父母都不会计较儿女用自己再多的钱.但是潜移默化的从家长的口中会流露出,诸如”这么大还用家里的钱”或者”养你那么多年,看看你用我了多少钱”此类的,看似平常,却略带点责备的语句.请原谅我的狭隘,我总感觉这些话是莫大的讽刺.它仿佛一个驮在你背上,你甩也甩不掉的怪物.还时刻的提醒你,告诫你,你这个浪费钱的家伙,你的存在根本就是一个错误,一个天天吃了睡,睡了吃的东西居然浪费这么多金钱,可耻,可恨!每每想到此处,我心中便充满了负罪感,恨不得马上去死掉.我有平板,尼康卡片机,移动硬盘各种高端电子设备~其实是我在上海的老哥给我买的~总之我不想成为家人的负担了~

总之,再多的原因都是我在自说自话.路是错是对反正已经走到了这一步,定要认认真真,踏踏实实的走下去.说起”踏踏实实”,这也是我这些年来感悟最多的一个词.不管友情,亲情,爱情都不是该用语言来诠释的东西.用心去做,心中自泯~冷暖自知的便好.
写了好多也说了好多~这些年来经历也算不少了~今天看了自己大一写的那些计划~发现自己写的那些东西居然跟自己如今的行径大体相同~不论如何~世界末日已过~~新纪元开始了~~这也算是给自己新纪元的新的风向标吧~想说的太多了~~以后再说吧~~

```                                                                                                         
                                                                                                                                –by 2012-12-22 mdk-vimer
```

有的时候

有的时候喜欢不吃不喝,一个人走过饭堂门口,感觉不饿,想想,再绕回来; 有的时候喜欢让自己很忙,累到心里都感觉到疲惫了,蒙起头就睡,不让自己伤神再想起别的事来; 有的时候醒来会想起某些人,曾经还以为,少了谁都不会怎样,生活还不是一样要过。--其实不是这样,想念有的时候会让人痛彻心扉; 有的时候话特别多,喜欢喊着讲,不一定是高兴才这样,也不全是难过非要发泄,可能只是单纯的想而已; 有的时候喜欢某一首歌,单曲循环,反复听着,像是听着自己的心声那样,比如“十年”:十年之前你不认识我,我也不认识你…十年之后我们是朋友,还可以问候…一路走来,再走下去,遇人无数,谁会是谁的过客,谁又会是谁的知己; 有的时候很沉默,喜欢一句话都不说,一个人走到某个角落,渐渐的,把某些事想开来,刹那间,让自己找到奋斗下去的勇气; 有的时候喜欢逛逛朋友的空间,不怎么留痕迹,感觉你们快乐就好; 有的时候会和别人说,其实我很内向,只是喜欢在你们面前“聒噪”而已,经常某些人会瞪着眼睛反回来,“少来了你,就你这样还内向呢…”有点不知所措,笑笑,无所谓吧,我们一起快乐就好; 有的时候想着去联系某个人,拿起电话的时候才知道,其实不懂要说什么,总是会突然怀念一些朋友,在心里的问候,也许你们不懂; 有的时候很多人在一起,感觉很开心,只是自己不怎么喜欢讲话,喜欢听别人讲那些自己经历过或不曾经历过的事,经常在心里感慨:哇,人家见识好广,懂得很多; 有的时候渴望和我们家族的人在一起,不做什么,一起聊聊天,听听他们唱歌,也会觉得很温馨,偶尔有的时候玩真心话大冒险,会把小丑弄得很委屈,呵呵…其实我也挨她整得很无语过; 有的时候会很想去某个地方,比如说南宁,不为什么,只是有好多同学在那,会很想他们,我的青春,他们加入过,曾经我们一起努力过,奋斗过。或者走在街上,还会遇到某张熟悉的面孔,打招呼的时候也许会这样说:真巧,你也在这; 有的时候感觉心里有些不好过,因为大大小小的考试太多,有些顾不上朋友,他们会以为我变了,冷落了他们,其实不是这样,可是很多时候不懂怎么说,害怕他们这样回我,人家读大学都很多课余时间,难道就只有你忙吗;

有的时候会很想家,想家里人的时候很温馨,也很有动力,常常有这样的感觉,我可以努力去做很多事,只要他们健康、快乐就好; 有的时候还会为久违的问候而感动,人家说,我不想知道你的主角是谁,我只是想看看你的文字而已…傻啊,你怎么不说你是想看看我的心情,想知道我过得好不好呢; 有的时候…有的时候也想问某个人,如果你也听说,我把自己的生活过成这样,会不会你也开始有那么一点心疼我? 有的时候,每个人都有很多个“有的时候”吧,只是不同的时候不同的心情,不同的感慨而已。我不知道你在想什么,不知道你在做什么,也许吃饭,也许~~

Ubuntu Livecd

将现有的ubuntu系统打造成LiveCD ~下载Live Ubuntu Backup V2.2 (lub)

将所有环境装好后分别执行: 将lub放到家目录

1
2
3
1.sudo chmod 777 /home/lub

2.sudo /home/lub -b

然后按e或c来选择是英文提示,还是中文提示。第一次执行时,可能会提示需要安装lupin-casper和squashfs-tools,其中 lupin-casper可以忽略,而squashfs-tools必须安装,运行$sudo apt-get install squashfs-tools即可

之后再次运行$sudo /home/lub -b,依提示运行,就能在用户文件夹下生成一个backup-2013.01.02的目录了,其中有的backup-2013.01.02.squashfs文件就是我们想要的

3.将ubuntu-11.10-desktop.i386.iso拷贝到/home.acmer/下:

执行:

1
sudo /home/acmer/mnt && sudo mount -o loop /home/acmer/Ubuntu-11.10-desktop-i386.iso /home/acmer/mnt
1
sudo mkdir /home/acmer/livecd 将/home/acmer/mnt下的内容除了casper/filesystem.squashfs,同步到了/home/acmer/livecd目录下。

执行:

1
$sudo rsync –exclude=/home/acmer/acmer/casper/filesystem.squashfs -a /home/acmer/mnt/ /home/acmer/livecd 

5.对/home/acmer/livecd/casper/目录下的filesystem.squashfs、 filesystem.manifest、filesystem.manifest-desktop这三个文件进行操作,由于它们只有读权限,所以先执行$sudo chmod o+w /home/acmer/livecd/casper/filesystem.*

将刚才lub生成的那个backup-2013.01.02.squashfs文件,拷贝成/home/acmer/livecd/casper/filesystem.squashfs

执行:

1
$sudo cp /home/acmer/backup-2013.01.02/backup2013.01.02.squashfs /home/acmer/livecd/casper/filesystem.squashfs

此外,还要更新/home/acmer/livecd/casper/目录下的filesystem.manifest和filesystem.manifest-remove,这两个文件实际上是系统所装包的列表,通过以下方式更新

1
2
3
$sudo dpkg -l | grep ii | awk ‘{print $2,$3}’ >/home/acmer/livecd/casper/filesystem.manifest

$sudo dpkg -l | grep ii | awk {print$2,$3}’> /home/acmer/livecd/casper/filesystem.manifes-remove

退回的LiveCD的工作目录 /home/acmer/livecd 下,

执行

1
$sudo rm md5sum.txt

再执行

1
$find -type f -print0 | sudo xargs -0 md5sum | grep -v ./isolinux/ | grep -v ./md5sum.txt | sudo tee md5sum.txt

更新原来的md5sum

将工作目录下的内容打包成ISO

先运行

1
$sudo apt-get install mkisofs 安装ISO打包工具,

执行

1
$sudo mkisofs -D -r -V “mdk-linux” -cache-inodes -J -l -b isolinux/isolinux.bin -c isolinux/boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table -o ../cjlu-acmer.iso .

打包iso时最后一定加 . 来表示目前目录

参照文章来源(有删节):http://www.linuxidc.com/Linux/2011-04/34097.htm

运维的那些命令

转自:http://deepin.iteye.com/blog/711813 1.删除0字节文件

1
find -type f -size 0 -exec rm -rf {} \;

2.查看进程 按内存从大到小排列

1
ps -e   -o “%C   : %p : %z : %a”|sort -k5 -nr

3.按cpu利用率从大到小排列

1
ps -e   -o “%C   : %p : %z : %a”|sort   -nr

4.打印说cache里的URL

1
grep -r -a   jpg /data/cache/* | strings | grep “http:” | awk -F’http:’ ‘{print “http:”$2;}’

5.查看http的并发请求数及其TCP连接状态:

1
netstat -n | awk ‘/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}’
1
sed -i ‘/Root/s/no/yes/’ /etc/ssh/sshd_config   sed在这个文里Root的一行,匹配Root一行,将no替换成yes.

7.1.如何杀掉mysql进程:

1
2
3
4
5
ps aux |grep mysql |grep -v grep  |awk ‘{print $2}’ |xargs kill -9 (从中了解到awk的用途)

killall -TERM mysqld

kill -9 `cat /usr/local/apache2/logs/httpd.pid`   试试查杀进程PID

8.显示运行3级别开启的服务:

1
ls /etc/rc3.d/S* |cut -c 15-   (从中了解到cut的用途,截取数据)

9.如何在编写SHELL显示多个信息,用EOF

1
2
3
4
5
cat << EOF
+————————————————————–+
|       === Welcome to Tunoff services ===                |
+————————————————————–+
EOF
  1. for 的巧用(如给mysql建软链接)
1
2
3
4
cd /usr/local/mysql/bin
for i in *
do ln /usr/local/mysql/bin/$i /usr/bin/$i
done
  1. 取IP地址:
1
2
3
ifconfig eth0 |grep “inet addr:” |awk ‘{print $2}’|cut -c 6-   或者

ifconfig   | grep ‘inet addr:’| grep -v ’127.0.0.1′ | cut -d: -f2 | awk ‘{ print $1}’

12.内存的大小:

1
free -m |grep “Mem” | awk ‘{print $2}’
1
netstat -an -t | grep “:80″ | grep ESTABLISHED | awk ‘{printf “%s %s\n”,$5,$6}’ | sort

14.查看Apache的并发请求数及其TCP连接状态:

1
netstat -n | awk ‘/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}’

15.因为同事要统计一下服务器下面所有的jpg的文件的大小,写了个shell给他来统计.原来用xargs实现,但他一次处理一部分,搞的有多个总和….,下面的命令就能解决啦.

1
find / -name *.jpg -exec wc -c {} \;|awk ‘{print $1}’|awk ‘{a+=$1}END{print a}’

CPU的数量(多核算多个CPU,cat /proc/cpuinfo |grep -c processor)越多,系统负载越低,每秒能处理的请求数也越多。

————————————————————————————— 16 CPU负载

1
# cat /proc/loadavg

检查前三个输出值是否超过了系统逻辑CPU的4倍。

18 CPU负载

1
#mpstat 1 1

检查%idle是否过低(比如小于5%)

19 内存空间

1
# free

检查free值是否过低 也可以用

1
# cat /proc/meminfo

20 swap空间

1
# free

检查swap used值是否过高 如果swap used值过高,进一步检查swap动作是否频繁:

1
# vmstat 1 5

观察si和so值是否较大

21 磁盘空间

1
# df -h

检查是否有分区使用率(Use%)过高(比如超过90%) 如发现某个分区空间接近用尽,可以进入该分区的挂载点,用以下命令找出占用空间最多的文件或目录:

1
# du -cks * | sort -rn | head -n 10

22 磁盘I/O负载

1
# iostat -x 1 2

检查I/O使用率(%util)是否超过100%

23 网络负载

1
# sar -n DEV

检查网络流量(rxbyt/s, txbyt/s)是否过高

24 网络错误

1
# netstat -i

检查是否有网络错误(drop fifo colls carrier) 也可以用命令:# cat /proc/net/dev

25 网络连接数目

1
# netstat -an | grep -E “^(tcp)” | cut -c 68- | sort | uniq -c | sort -n

26 进程总数

1
# ps aux | wc -l

检查进程个数是否正常 (比如超过250)

27 可运行进程数目

1
# vmwtat 1 5

列给出的是可运行进程的数目,检查其是否超过系统逻辑CPU的4倍

28 进程

1
# top -id 1

观察是否有异常进程出现

29 网络状态 检查DNS, 网关等是否可以正常连通

30 用户

1
# who | wc -l

检查登录用户是否过多 (比如超过50个) 也可以用命令

1
# uptime

31 系统日志

1
# cat /var/log/rflogview/*errors

检查是否有异常错误记录 也可以搜寻一些异常关键字,例如:

1
2
# grep -i error /var/log/messages
# grep -i fail /var/log/messages

32 核心日志

1
# dmesg

检查是否有异常错误记录

33 系统时间

1
# date

检查系统时间是否正确

34 打开文件数目

1
# lsof | wc -l

检查打开文件总数是否过多

35 日志

1
# logwatch –print   配置/etc/log.d/logwatch.conf,将 Mailto 设置为自己的email 地址,启动mail服务 (sendmail或者postfix),这样就可以每天收到日志报告了。

缺省logwatch只报告昨天的日志,可以用# logwatch –print –range all 获得所有的日志分析结果。 可以用

1
# logwatch –print –detail high 获得更具体的日志分析结果(而不仅仅是出错日志)。

36.杀掉80端口相关的进程

1
lsof -i :80|grep -v “PID”|awk ‘{print “kill -9″,$2}’|sh

37.清除僵死进程。

1
ps -eal | awk ‘{ if ($2 == “Z”) {print $4}}’ | kill -9

38.tcpdump 抓包 ,用来防止80端口被人攻击时可以分析数据

1
# tcpdump -c 10000 -i eth0 -n dst port 80 > /root/pkts

39.然后检查IP的重复数 并从小到大排序 注意 “-t\ +0″ 中间是两个空格

1
# less pkts | awk {‘printf $3″\n”‘} | cut -d. -f 1-4 | sort | uniq -c | awk {‘printf $1″ “$2″\n”‘} | sort -n -t\ +0

40.查看有多少个活动的php-cgi进程

1
2
3
netstat -anp | grep php-cgi | grep ^tcp | wc -l

chkconfig –list | awk ‘{if ($5==”3:on”) print $1}’

41.kudzu查看网卡型号

1
kudzu –probe –class=network

匹配中文字符的正则表达式:

1
[\u4e00-\u9fa5]

评注:匹配中文还真是个头疼的事,有了这个表达式就好办了

匹配双字节字符(包括汉字在内):

1
[^\x00-\xff]

评注:可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1)

匹配空白行的正则表达式:

1
\n\s*\r

评注:可以用来删除空白行

匹配HTML标记的正则表达式:

1
<(\S*?)[^>]*>.*?</\1>|<.*? />

评注:网上流传的版本太糟糕,上面这个也仅仅能匹配部分,对于复杂的嵌套标记依旧无能为力

匹配首尾空白字符的正则表达式:

1
^\s*|\s*$

评注:可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),非常有用的表达式

匹配Email地址的正则表达式:

1
\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*

评注:表单验证时很实用

匹配网址URL的正则表达式:

1
[a-zA-z]+://[^\s]*

评注:网上流传的版本功能很有限,上面这个基本可以满足需求

匹配帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):

1
^[a-zA-Z][a-zA-Z0-9_]{4,15}$

评注:表单验证时很实用

匹配国内电话号码:

1
\d{3}-\d{8}|\d{4}-\d{7}

评注:匹配形式如 0511-4405222 或 021-87888822

匹配腾讯QQ号:

1
[1-9][0-9]{4,}

评注:腾讯QQ号从10000开始

匹配中国邮政编码:

1
[1-9]\d{5}(?!\d)

评注:中国邮政编码为6位数字

匹配身份证:

1
\d{15}|\d{18}

评注:中国的身份证为15位或18位

匹配ip地址:

1
\d+\.\d+\.\d+\.\d+

评注:提取ip地址时有用

匹配特定数字:

1
2
3
4
5
6
7
8
9
10
^[1-9]\d*$    //匹配正整数
^-[1-9]\d*$   //匹配负整数
^-?[1-9]\d*$   //匹配整数
^[1-9]\d*|0$  //匹配非负整数(正整数 + 0)
^-[1-9]\d*|0$   //匹配非正整数(负整数 + 0)
^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$   //匹配正浮点数
^-([1-9]\d*\.\d*|0\.\d*[1-9]\d*)$  //匹配负浮点数
^-?([1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0)$  //匹配浮点数
^[1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0$   //匹配非负浮点数(正浮点数 + 0)
^(-([1-9]\d*\.\d*|0\.\d*[1-9]\d*))|0?\.0+|0$  //匹配非正浮点数(负浮点数 + 0)

评注:处理大量数据时有用,具体应用时注意修正

匹配特定字符串:

1
2
3
4
5
^[A-Za-z]+$  //匹配由26个英文字母组成的字符串
^[A-Z]+$  //匹配由26个英文字母的大写组成的字符串
^[a-z]+$  //匹配由26个英文字母的小写组成的字符串
^[A-Za-z0-9]+$  //匹配由数字和26个英文字母组成的字符串
^\w+$  //匹配由数字、26个英文字母或者下划线组成的字符串

评注:最基本也是最常用的一些表达式

Centos启动

启动流程概览

在硬件驱动成功后,Kernel 会主动呼叫 init 程序,而 init 会取得 run-level 资讯;
init 运行 /etc/rc.d/rc.sysinit 文件来准备软件运行的作业环境 (如网络、时区等);
init 运行 run-level 的各个服务之启动 (script 方式);
init 运行 /etc/rc.d/rc.local 文件;
init 运行终端机模拟程序 mingetty 来启动 login 程序,最后就等待使用者登陆啦;

init,/etc/inittab,runlevel介绍

在核心加载完毕、进行完硬件侦测与驱动程序加载后,此时你的主机硬件应该已经准备就绪了 (ready) , 此时核心会主动的呼叫第一支程序,那就是 /sbin/init 罗。 init 的 PID 号码是一号啦。 /sbin/init 最主要的功能就是准备软件运行的环境,包括系统的主机名称、网络配置、语系处理、文件系统格式及其他服务的启动等。 而所有的动作都会透过 init 的配置档,亦即是 /etc/inittab 来规划,而 inittab 内还有一个很重要的配置项目,那就是默认的 runlevel (启动运行等级) 啦! Run level:运行等级有哪些?

那么什么是 run level 呢?他有什么功用啊?其实很简单啦, Linux 就是藉由配置 run level 来规定系统使用不同的服务来启动,让 Linux 的使用环境不同。基本上,依据有无网络与有无 X Window 而将 run level 分为 7 个等级,分别是:

0 – halt (系统直接关机)
1 – single user mode (单人维护模式,用在系统出问题时的维护)
2 – Multi-user, without NFS (类似底下的 runlevel 3,但无 NFS 服务)
3 – Full multi-user mode (完整含有网络功能的纯文字模式)
4 – unused (系统保留功能)
5 – X11 (与 runlevel 3 类似,但加载使用 X Window)
6 – reboot (重新启动)

由於 run level 0, 4, 6 不是关机、重新启动就是系统保留的,所以:『 您当然不能将默认的 run level 配置为这三个值 』, 否则系统就会不断的自动关机或自动重新启动…. 好了,那么我们启动时,到底是如何取得系统的 run level 的?当然是 /etc/inittab 所配置的罗! 那么 /etc/inittab 到底有什么资讯呢?我们先来看看这个文件的内容好了: /etc/inittab 的内容与语法 复制代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[root@www ~]# vim /etc/inittab
id:5:initdefault:                 <==默认的 runlevel 配置, 此 runlevel 为 5 

si::sysinit:/etc/rc.d/rc.sysinit  <==准备系统软件运行的环境的脚本运行档

 
l0:0:wait:/etc/rc.d/rc 0    <==runlevel 0 在 /etc/rc.d/rc0.d/
l1:1:wait:/etc/rc.d/rc 1    <==runlevel 1 在 /etc/rc.d/rc1.d/
l2:2:wait:/etc/rc.d/rc 2    <==runlevel 2 在 /etc/rc.d/rc2.d/
l3:3:wait:/etc/rc.d/rc 3    <==runlevel 3 在 /etc/rc.d/rc3.d/
l4:4:wait:/etc/rc.d/rc 4    <==runlevel 4 在 /etc/rc.d/rc4.d/
l5:5:wait:/etc/rc.d/rc 5    <==runlevel 5 在 /etc/rc.d/rc5.d/
l6:6:wait:/etc/rc.d/rc 6    <==runlevel 6 在 /etc/rc.d/rc6.d/

 
ca::ctrlaltdel:/sbin/shutdown -t3 -r now

 
pf::powerfail:/sbin/shutdown -f -h +2 "Power Failure; System Shutting Down"
pr:12345:powerokwait:/sbin/shutdown -c "Power Restored; Shutdown Cancelled"
1
2
3
4
5
6
7
8
1:2345:respawn:/sbin/mingetty tty1  <==其实 tty1~tty6 是由底下这六行决定的。
2:2345:respawn:/sbin/mingetty tty2
3:2345:respawn:/sbin/mingetty tty3
4:2345:respawn:/sbin/mingetty tty4
5:2345:respawn:/sbin/mingetty tty5
6:2345:respawn:/sbin/mingetty tty6

x:5:respawn:/etc/X11/prefdm -nodaemon <==X window 则是这行决定的!

复制代码

让我们解析一下这个文件吧!首先,这个文件的语法是利用冒号 (:) 将配置分隔成为四个栏位,每个栏位的意义与说明如下:

配置项目:最多四个字节,代表 init 的主要工作项目,只是一个简单的代表说明。
run level:该项目在哪些 run level 底下进行的意思。如果是 35 则代表 runlevel 3 与 5 都会运行。
init 的动作项目:主要可以进行的动作项目意义有:
inittab 配置值   意义说明
initdefault     代表默认的 run level 配置值
sysinit     代表系统初始化的动作项目
ctrlaltdel  代表 [ctrl]+[alt]+[del] 三个按键是否可以重新启动的配置
wait    代表后面栏位配置的命令项目必须要运行完毕才能继续底下其他的动作
respawn     代表后面栏位的命令可以无限制的再生 (重新启动)。举例来说, tty1 的 mingetty 产生的可登陆画面, 在你注销而结束后,系统会再开一个新的可登陆画面等待下一个登陆。

更多的配置项目请参考 man inittab 的说明。
命令项目:亦即应该可以进行的命令,通常是一些 script 罗。

init 的处理流程

事实上 /etc/inittab 的配置也有点类似 shell script 啦,因为该文件内容的配置也是一行一行的从上往下处理的, 因此我们可以知道 CentOS 的 init 依据 inittab 配置的处理流程会是:

先取得 runlevel 亦即默认运行等级的相关等级 (以鸟哥的测试机为例,为 5 号);
使用 /etc/rc.d/rc.sysinit 进行系统初始化
由於 runlevel 是 5 ,因此只进行『l5:5:wait:/etc/rc.d/rc 5』,其他行则略过
配置好 [ctrl]+[alt]+[del] 这组的组合键功能
配置不断电系统的 pf, pr 两种机制;
启动 mingetty 的六个终端机 (tty1 ~ tty6)
最终以 /etc/X11/perfdm -nodaemon 启动图形介面啦!

现在你可以知道为啥 [ctrl]+[alt]+[del] 可以重新启动而我们默认提供 6 个虚拟终端机 (tty1~tty6) 给你使用了吧!由於整个配置都是依据 /etc/inittab 来决定的,因此如果你想要修改任何细节的话, 可以这样做喔:

如果不想让使用者利用 [crtl]+[alt]+[del] 来重新启动系统,可以将『 ca::ctrlaltdel:/sbin/shutdown -t3 -r now 』加上注解 (#) 来取消该配置
规定启动的默认 run level 是纯文字的 3 号或者是具有图形介面的 5 号 ,可经由 『 id:5:initdefault: 』那个数字来决定! 以鸟哥自己这个文件为例,我是使用默认的图形介面。如果你想要关闭图形介面的话,将该行 5 改成 3 即可。
如果不想要启动六个终端机 (tty1~tty6),那么可以将『 6:2345:respawn:/sbin/mingetty tty6』关闭数个。但务必至少启动一个喔!

所以说,你现在会自行修改登陆时的默认 run level 配置值了吗?够简单的吧? 一般来说,我们默认都是 3 或者是 5 来作为默认的 run level 的。但有时后可能需要进入 run level 1, 也就是单人维护模式的环境当中。这个 run level 1 有点像是 Windows 系统当中的『安全模式』啦, 专门用来处理当系统有问题时的操作环境。此外,当系统发现有问题时,举例来说,不正常关机造成 filesystem 的不一致现象时,系统会主动的进入单人维护模式呢!

好了, init 在取得 run level 之后,接下来要干嘛? 上面 /etc/inittab 文件内容不是有提到 sysinit 吗?准备初始化系统了吧!

init 处理系统初始化流程 (/etc/rc.d/rc.sysinit)

还记得上面提到 /etc/inittab 里头有这一句『 si::sysinit:/etc/rc.d/rc.sysinit 』吧? 这表示:『我开始加载各项系统服务之前,得先做好整个系统环境,我主要利用 /etc/rc.d/rc.sysinit 这个 shell script 来配置好我的系统环境的。』够清楚了吧? 所以,我想要知道到底 CentOS 启动的过程当中帮我进行了什么动作,就得要仔细的分析 /etc/rc.d/rc.sysinit 罗。

如果你使用 vim 去查阅过 /etc/rc.d/rc.sysinit 的话,那么可以发现他主要的工作大抵有这几项:

取得网络环境与主机类型:
读取网络配置档 /etc/sysconfig/network ,取得主机名称与默认通讯闸 (gateway) 等网络环境。
测试与挂载内存装置 /proc 及 U盘 装置 /sys:
除挂载内存装置 /proc 之外,还会主动侦测系统上是否具有 usb 的装置, 若有则会主动加载 usb 的驱动程序,并且尝试挂载 usb 的文件系统。
决定是否启动 SELinux :
SELinux 在此时进行一些检测, 并且检测是否需要帮所有的文件重新编写标准的 SELinux 类型 (auto relabel)。
启动系统的乱数产生器
乱数产生器可以帮助系统进行一些口令加密演算的功能,在此需要启动两次乱数产生器。
配置终端机 (console) 字形:
配置显示於启动过程中的欢迎画面 (text banner);
配置系统时间 (clock) 与时区配置:需读入 /etc/sysconfig/clock 配置值
周边设备的侦测与 Plug and Play (PnP) 参数的测试:
根据核心在启动时侦测的结果 (/proc/sys/kernel/modprobe ) 开始进行 ide / scsi / 网络 / 音效 等周边设备的侦测,以及利用以加载的核心模块进行 PnP 装置的参数测试。
使用者自订模块的加载
使用者可以在 /etc/sysconfig/modules/*.modules 加入自订的模块,则此时会被加载到系统当中
加载核心的相关配置:
系统会主动去读取 /etc/sysctl.conf 这个文件的配置值,使核心功能成为我们想要的样子。
配置主机名称与初始化电源管理模块 (ACPI)
初始化软件磁盘阵列:主要是透过 /etc/mdadm.conf 来配置好的。
初始化 LVM 的文件系统功能
以 fsck 检验磁碟文件系统:会进行 filesystem check
进行磁碟配额 quota 的转换 (非必要):
重新以可读写模式挂载系统磁碟:
启动 quota 功能:所以我们不需要自订 quotaon 的动作
启动系统虚拟乱数产生器 (pseudo-random):
清除启动过程当中的缓存文件:
将启动相关资讯加载 /var/log/dmesg 文件中。

在 /etc/rc.d/rc.sysinit 将基本的系统配置数据都写好了,也将系统的数据配置完整! 而如果你想要知道到底启动的过程中发生了什么事情呢?那么就运行『 dmesg 』吧。 另外,基本上,在这个文件当中所进行的很多工作的默认配置档,其实都在 /etc/sysconfig/ 当中呢! 所以,请记得将 /etc/sysconfig/ 内的文件好好的瞧一瞧喔! ^_^

在这个过程当中,比较值得注意的是自订模块的加载!在 CentOS 当中,如果我们想要加载核心模块的话, 可以将整个模块写入到 /etc/sysconfig/modules/*.modules 当中,在该目录下, 只要记得档名最后是以 .modules 结尾即可。 这个过程是非必要的,因为我们目前的默认模块实在已经很够用了,除非是您的主机硬件实在太新了, 非要自己加载新的模块不可,否则,在经过 /etc/rc.d/rc.sysinit 的处理后, 你的主机系统应该是已经跑得很顺畅了啦!就等著你将系统相关的服务与网络服务启动罗!

启动系统服务与相关启动配置档 (/etc/rc.d/rc N & /etc/sysconfig)

加载核心让整个系统准备接受命令来工作,再经过 /etc/rc.d/rc.sysinit 的系统模块与相关硬件资讯的初始化后,你的 CentOS 系统应该已经顺利工作了。 只是,我们还得要启动系统所需要的各项『服务』啊!这样主机才能提供我们相关的网络或者是主机功能嘛! 这个时候,依据我们在 /etc/inittab 里面提到的 run level 配置值,就可以来决定启动的服务项目了。 举例来说,使用 run level 3 当然就不需要启动 X Window 的相关服务罗,您说是吧?

那么各个不同的 run level 服务启动的各个 shell script 放在哪?还记得 /etc/inittab 里面提到的: 复制代码

1
2
3
4
5
6
7
l0:0:wait:/etc/rc.d/rc 0
l1:1:wait:/etc/rc.d/rc 1
l2:2:wait:/etc/rc.d/rc 2
l3:3:wait:/etc/rc.d/rc 3
l4:4:wait:/etc/rc.d/rc 4
l5:5:wait:/etc/rc.d/rc 5  <==本例中,以此项目来解释
l6:6:wait:/etc/rc.d/rc 6

复制代码

上面提到的就是各个 run level 要运行的各项脚本放置处啦!主要是透过 /etc/rc.d/rc 这个命令来处理相关任务! 由於鸟哥使用默认的 runlevel 5 ,因此我们主要针对上述特殊字体那行来解释好了: /etc/rc.d/rc 5 的意义是这样的 (建议您自行使用 vim 去观察一下 /etc/rc.d/rc 这个文件,你会更有概念!):

透过外部第一号参数 ($1) 来取得想要运行的脚本目录。亦即由 /etc/rc.d/rc 5 可以取得 /etc/rc5.d/ 这个目录来准备处理相关的脚本程序;
找到 /etc/rc5.d/K??* 开头的文件,并进行『 /etc/rc5.d/K??* stop 』的动作;
找到 /etc/rc5.d/S??* 开头的文件,并进行『 /etc/rc5.d/S??* start 』的动作;

透过上面的说明我们可以知道所有的项目都与 /etc/rc5.d/ 有关,那么我们就来瞧瞧这个目录下有些什么玩意儿吧! 复制代码

1
2
3
4
5
6
7
8
9
10
11
12
[root@www ~]# ll /etc/rc5.d/
lrwxrwxrwx 1 root root 16 Sep  4  2008 K02dhcdbd -> ../init.d/dhcdbd
....(中间省略)....
lrwxrwxrwx 1 root root 14 Sep  4  2008 K91capi -> ../init.d/capi
lrwxrwxrwx 1 root root 23 Sep  4  2008 S00microcode_ctl -> ../init.d/microcode_ctl
lrwxrwxrwx 1 root root 22 Sep  4  2008 S02lvm2-monitor -> ../init.d/lvm2-monitor
....(中间省略)....
lrwxrwxrwx 1 root root 17 Sep  4  2008 S10network -> ../init.d/network
....(中间省略)....
lrwxrwxrwx 1 root root 11 Sep  4  2008 S99local -> ../rc.local
lrwxrwxrwx 1 root root 16 Sep  4  2008 S99smartd -> ../init.d/smartd
....(底下省略)....

复制代码

在这个目录下的文件很有趣,主要具有几个特点:

档名全部以 Sxx 或 Kxx ,其中 xx 为数字,且这些数字在文件之间是有相关性的!
全部是连结档,连结到 stand alone 服务启动的目录 /etc/init.d/ 去

服务的启动主要是以『/etc/init.d/服务档名 {start,stop}』 来启动与关闭的,那么透过刚刚 /etc/rc.d/rc 程序的解说,我们可以清楚的了解到了 /etc/rc5.d/[SK]xx 其实就是跑到 /etc/init.d/ 去找到相对应的服务脚本, 然后分别进行 start (Sxx) 或 stop (Kxx) 的动作而已啦!举例来说,以上述的表格内的 K91capi 及 S10network 为例好了, 透过 /etc/rc.d/rc 5 的运行,这两个文件会这样进行:

1
2
/etc/rc5.d/K91capi stop –> /etc/init.d/capi stop
/etc/rc5.d/S10network start –> /etc/init.d/network start

所以说,你有想要启动该 runlevel 时就运行的服务,那么利用 Sxx 并指向 /etc/init.d/ 的特定服务启动脚本后, 该服务就能够在启动时启动啦!就这么简单!问题是,你需要自行处理这个 K, S 开头的连结档吗? 并不需要的,chkconfig 就是在负责处理这个连结档啦!这样有没有跟第十八章的观念串在一起了呢? ^_^

那么为什么 K 与 S 后面要有数字呢?因为各不同的服务其实还是互有关系的。举例来说,如果要启动 WWW 服务,总是得要有网络吧?所以 /etc/init.d/network 就会比较先被启动啦!那么您就会知道在 S 或者是 K 后面接的数字是啥意思了吧?嘿嘿,那就是运行的顺序啦!那么哪个文件被最后运行呢? 看到最后一个被运行的项目是啥?没错,就是 S99local ,亦即是:/etc/rc.d/rc.local 这个文件啦!

使用者自订启动启动程序 (/etc/rc.d/rc.local)

在完成默认 runlevel 指定的各项服务的启动后,如果我还有其他的动作想要完成时,举例来说, 我还想要寄一封 mail 给某个系统管理帐号,通知他,系统刚刚重新启动完毕,那么是否应该要制作一个 shell script 放置在 /etc/init.d/ 里面,然后再以连结方式连结到 /etc/rc5.d/ 里面呢?呵呵!当然不需要!还记得上一小节提到的 /etc/rc.d/rc.local 吧? 这个文件就可以运行您自己想要运行的系统命令了。

也就是说,我有任何想要在启动时就进行的工作时,直接将他写入 /etc/rc.d/rc.local , 那么该工作就会在启动的时候自动被加载喔!而不必等我们登陆系统去启动呢! 是否很方便啊!一般来说,鸟哥就很喜欢把自己制作的 shell script 完整档名写入 /etc/rc.d/rc.local ,如此一来,启动就会将我的 shell script 运行过,真是好棒那!

根据 /etc/inittab 之配置,加载终端机或 X-Window 介面

在完成了系统所有服务的启动后,接下来 Linux 就会启动终端机或者是 X Window 来等待使用者登陆啦! 实际参考的项目是 /etc/inittab 内的这一段: 复制代码

1
2
3
4
5
6
7
1:2345:respawn:/sbin/mingetty tty1
2:2345:respawn:/sbin/mingetty tty2
3:2345:respawn:/sbin/mingetty tty3
4:2345:respawn:/sbin/mingetty tty4
5:2345:respawn:/sbin/mingetty tty5
6:2345:respawn:/sbin/mingetty tty6
x:5:respawn:/etc/X11/prefdm -nodaemon

复制代码

这一段代表,在 run level 2, 3, 4, 5 时,都会运行 /sbin/mingetty 这个咚咚, 而且运行六个,这也是为何我们 Linux 会提供『六个纯文字终端机』的配置所在啊! 因为 mingetty 就是在启动终端机的命令说。

要注意的是那个 respawn 的 init 动作项目,他代表『当后面的命令被终止 (terminal) 时, init 会主动的重新启动该项目。』这也是为何我们登陆 tty1 终端机介面后,以 exit 离开后, 系统还是会重新显示等待使用者输入的画面的原因啊!

如果改天您不想要有六个终端机时,可以取消某些终端机介面吗?当然可以啊! 就将上面表格当中的某些项目注解掉即可!例如不想要 tty5 与 tty6 ,就将那两行注解, 则下次重新启动后,您的 Linux 就只剩下『 F1 ~ F4 』有效而已,这样说,可以了解吧!!^_^

至於如果我们使用的是 run level 5 呢?那么除了这六个终端机之外, init 还会运行 /etc/X11/prefdm -nodaemon 那个命令喔! 他主要的功能就是在启动 X Window 啦!

启动过程会用到的主要配置档

我们在 /sbin/init 的运行过程中有谈到许多运行脚本,包括 /etc/rc.d/rc.sysinit 以及 /etc/rc.d/rc 等等, 其实这些脚本都会使用到相当多的系统配置档,这些启动过程会用到的配置档则大多放置在 /etc/sysconfig/ 目录下。 同时,由於核心还是需要加载一些驱动程序 (核心模块),此时系统自订的装置与模块对应档 (/etc/modprobe.conf) 就显的挺重要了喔! 关於模块: /etc/modprobe.conf

/etc/rc.d/rc.sysinit 当中的加载使用者自订模块的地方吗?就是在 /etc/sysconfig/modules/ 目录下啊! 虽然核心提供的默认模块已经很足够我们使用了,但是,某些条件下我们还是得对模块进行一些参数的规划, 此时就得要使用到 /etc/modprobe.conf 罗!举例来说,鸟哥的 CentOS 主机的 modprobe.conf 有点像这样:

1
2
3
4
5
6
[root@www ~]# cat /etc/modprobe.conf
alias eth0 8139too               <==让 eth0 使用 8139too 的模块
alias scsi_hostadapter pata_sis
alias snd-card-0 snd-trident
options snd-card-0 index=0       <==额外指定 snd-card-0 的参数功能
options snd-trident index=0

以上表的第一行为例,鸟哥使用螃蟹卡 (Realtek 的芯片组) 来作为我的网络卡,那螃蟹卡使用的模块就是 8139too 啦!这样看的懂了吧?当我要启动网络卡时,系统会跑到这个文件来查阅一下,然后加载 8139too 驱动程序来驱动网络卡罗!更多的相关说明,请 man modprobe.conf 喔!这个文件大多在指定系统内的硬件所使用的模块啦!这个文件通常系统是可以自行产生的,所以你不必手动去订正他! 不过,如果系统捉到错误的驱动程序,或者是你想要使用升级的驱动程序来对应相关的硬件配备时, 你就得要自行手动的处理一下这个文件了。 /etc/sysconfig/*

不说您也知道,整个启动的过程当中,老是读取的一些服务的相关配置档都是记录在 /etc/sysconfig 目录下的!那么该目录底下有些啥玩意儿?我们找几个重要的文件来谈谈:

authconfig:
这个文件主要在规范使用者的身份认证的机 制,包括是否使用本机的 /etc/passwd, /etc/shadow 等, 以及 /etc/shadow 口令记录使用何种加密演算法,还有是否使用外部口令服务器提供的帐号验证 (NIS, LDAP) 等。 系统默认使用 MD5 加密演算法,并且不使用外部的身份验证机制;
clock:
此文件在配置 Linux 主机的时区,可以使用格林威治时间(GMT),也可以使用台湾的本地时间 (local)。基本上,在 clock 文件内的配置项目『 ZONE 』所参考的时区位於 /usr/share/zoneinfo 目录下的相对路径中。而且要修改时区的话,还得将 /usr/share/zoneinfo/Asia/Taipei 这个文件复制成为 /etc/localtime 才行!
i18n:
i18n 在配置一些语系的使用方面,例如最麻烦的文字介面下的日期显示问题! 如果你是以中文安装的,那么默认语系会被选择 zh_TW.UTF8 ,所以在纯文字介面之下, 你的文件日期显示可能就会呈现乱码!这个时候就需要更改一下这里啦!更动这个 i18n 的文件,将里面的 LC_TIME 改成 en 即可!
keyboard & mouse:
keyboard 与 mouse 就是在配置键盘与鼠标的形式;
network:
network 可以配置是否要启动网络,以及配置主机名称还有通讯闸 (GATEWAY) 这两个重要资讯呢!
network-scripts/:
至於 network-scripts 里面的文件,则是主要用在配置网络卡~

总而言之一句话,这个目录下的文件很重要的啦!启动过程里面常常会读取到的!

Run level 的切换

在我们完成上面的所有资讯后,其实整个 Linux 主机就已经在等待我们使用者的登陆啦! 但是,相信您应该还是会有一点疑问的地方,那就是:『我该如何切换 run level 呢?』会不会很难啊?不会啦!很简单~但是依据运行的时间而有不同的方式啊!

事实上,与 run level 有关的启动其实是在 /etc/rc.d/rc.sysinit 运行完毕之后。也就是说,其实 run level 的不同仅是 /etc/rc[0-6].d 里面启动的服务不同而已。不过,依据启动是否自动进入不同 run level 的配置,我们可以说:

要每次启动都运行某个默认的 run level ,则需要修改 /etc/inittab 内的配置项目, 亦即是『 id:5:initdefault: 』里头的数字啊;
如果仅只是暂时变更系统的 run level 时,则使用 init [0-6] 来进行 run level 的变更。 但下次重新启动时,依旧会是以 /etc/inittab 的配置为准。

假设原本我们是以 run level 5 登陆系统的,但是因为某些因素,想要切换成为 run level 3 时, 该怎么办呢?很简单啊,运行『 init 3 』即可切换。但是 init 3 这个动作到底做了什么呢? 我们不是说了吗?事实上,不同的 run level 只是加载的服务不同罢了, 亦即是 /etc/rc5.d/ 还有 /etc/rc3.d 内的 Sxxname 与 Kxxname 有差异而已。 所以说,当运行 init 3 时,系统会:

先比对 /etc/rc3.d/ 及 /etc/rc5.d 内的 K 与 S 开头的文件;
在新的 runlevel 亦即是 /etc/rc3.d/ 内有多的 K 开头文件,则予以关闭;
在新的 runlevel 亦即是 /etc/rc3.d/ 内有多的 S 开头文件,则予以启动;

也就是说,两个 run level 都存在的服务就不会被关闭啦!如此一来,就很容易切换 run level 了, 而且还不需要重新启动呢!真方便。那我怎么知道目前的 run level 是多少呢? 直接在 bash 当中输入 runlevel 即可啊! 复制代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[root@www ~]# runlevel
N 5
# 左边代表前一个 runlevel ,右边代表目前的 runlevel。
# 由於之前并没有切换过 runlevel ,因此前一个 runlevel 不存在 (N)

# 将目前的 runlevel 切换成为 3 (注意, tty7 的数据会消失!)
[root@www ~]# init 3
NIT: Sending processes the TERM signal
Applying Intel CPU microcode update:        [  OK  ]
Starting background readahead:              [  OK  ]
Starting irqbalance:                        [  OK  ]
Starting httpd:                             [  OK  ]
Starting anacron:                           [  OK  ]
# 这代表,新的 runlevel 亦即是 runlevel3 比前一个 runlevel 多出了上述 5 个服务

[root@www ~]# runlevel
5 3
# 看吧!前一个是 runlevel 5 ,目前的是 runlevel 3 啦!

复制代码

那么你能不能利用 init 来进行关机与重新启动呢?可以的啦!利用『 init 0 』就能够关机, 而『 init 6 』就能够重新启动!为什么?往前翻一下 runlevel 的定义即可了解吧!

转自 http://vbird.dic.ksu.edu.tw/linux_basic/0510osloader_1.php#startup_init

Shell

很多人误以为shell脚本只能在命令行下使用。其实shell也可以调用一些GUI组件, 例如菜单,警告框,进度条等等。你可以控制最终的输出,光标位置还有各种输出效果。下面我将介绍一些工具,帮助你创建强大的,互动的,用户友好的 Unix/Linux shell脚本。我在FreeBSD和Linux下测试过这些工具,不过其他UNIX系列的操作系统应该都支持的。

  1. notify-send 命令

这个命令可以让你通过通知进程发送一个桌面通知给用户。这可以用来向用户发送提示,或者显示一些信息而不用打断用户工作。你需要安装如下软件包: PHP代码

1
$ sudo apt-get install libnotify-bin

下面这个例子展示了如何从命令行向桌面发送一个简单的消息: PHP代码

1
notify-send “rsnapshot done \”static/image/smiley/default/smile.gif\”" smilieid=”\”1\”" alt=”\”\”" border=”\”0\”">”

输出:

下面是一个复杂一点的例子: PHP代码

1
2
3
4
5
….
alert=18000
live=$(lynx –dump http://money.rediff.com/ | grep ‘BSE LIVE’ | awk ‘{ print $5}’ | sed ‘s/,//g;s/\.[0-9]*//g’)
[ $notify_counter -eq 0 ] && [ $live -ge $alert ] && { notify-send -t 5000 -u low -i  ”BSE Sensex touched 18k”;  notify_counter=1; }

输出:

这里的参数解释如下:

-t 5000:指定超时的时间,毫秒
-u low:设置是否紧急
-i gtk-dialog-info:通知图标,你可以指定图标 -i /path/to/your-icon.png
  1. tput 命令

这个命令是用来设置终端特性的:

  移动光标
  获得终端信息
  设置前景和背景色
  设置粗体模式
  设置反模式等等

举例: PHP代码

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
#!/bin/bash
# clear the screen
tput clear
# Move cursor to screen location X,Y (top left is 0,0)
tput cup 3 15
# Set a foreground colour using ANSI escape
tput setaf 3
echo “XYX Corp LTD.”
tput sgr0
tput cup 5 17
# Set reverse video mode
tput rev
echo “M A I N – M E N U”
tput sgr0
tput cup 7 15
echo “1. User Management”
tput cup 8 15
echo “2. Service Management”
tput cup 9 15
echo “3. Process Management”
tput cup 10 15
echo “4. Backup”
# Set bold mode
tput bold
tput cup 12 15
read -p “Enter your choice [1-4] ” choice
tput clear
tput sgr0
tput rc

输出:

  1. setleds 命令

这个命令可以让你控制键盘灯,例如打开数字键盘灯:

PHP代码

1
setleds -D +num

关闭数字键盘灯:

PHP代码

1
2
3
4
5
6
setleds -D -num

  -caps: 清除大写灯
  +caps:打开大写灯
  -scroll:清除滚动锁
  +scroll:打开滚动锁
  1. zenity 命令

这个命令可以显示GTK+的对话框,然后返回用户的输入。你可以用这个命令在脚本中显示信息,并要求用户输入信息。下面这段代码就是域名的whois查询: PHP代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#!/bin/bash
# Get domain name
_zenity=”/usr/bin/zenity”
_out=”/tmp/whois.output.[    DISCUZ_CODE_4    ]quot;
domain=$(${_zenity} –title  ”Enter domain” \
      –entry –text “Enter the domain you would like to see whois info” )
if [ $? -eq 0 ]
then
  # Display a progress dialog while searching whois database
  whois $domain  | tee >(${_zenity} –width=200 –height=100 \
        –title=”whois” –progress \
        –pulsate –text=”Searching domain info…” \
            –auto-kill –auto-close \
            –percentage=10) >${_out}
  # Display back output
  ${_zenity} –width=800 –height=600  \
    –title “Whois info for $domain” \
    –text-info –filename=”${_out}”
else
  ${_zenity} –error \
    –text=”No input provided”
fi

输出:

  1. kdialog 命令

这个命令和zenity很想,只不过它是为KDE/QT应用准备的。使用方法如下: PHP代码

1
kdialog –dontagain myscript:nofilemsg –msgbox “File: ‘~/.backup/config’ not found.”

输出

  1. Dialog

这个命令可以在shell脚本中显示文本组件。它使用了curses和ncurses类库。示例代码: PHP代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
>#!/bin/bash
dialog –title “Delete file” \
–backtitle “Linux Shell Script Tutorial Example” \
–yesno “Are you sure you want to permanently delete \”/tmp/foo.txt\”?” 7 60
# Get exit status
# 0 means user hit [yes] button.
# 1 means user hit [no] button.
# 255 means user hit [Esc] key.
response=$?
case $response in
  0) echo “File deleted.”;;
  1) echo “File not deleted.”;;
  255) echo “[ESC] key pressed.”;;
esac
  1. logger 命令

这个命令可以让你写入系统日志例如 /var/log/messages: PHP代码

1
2
3
4
logger “MySQL database backup failed.”
tail -f /var/log/messages
logger -t mysqld -p daemon.error “Database Server failed”
tail -f /var/log/syslog

输出:

1
2
3
Apr 20 00:11:45 vivek-desktop kernel: [38600.515354] CPU0: Temperature/speed normal

Apr 20 00:12:20 vivek-desktop mysqld: Database Server failed
  1. setterm 命令

这个命令可以设置中断的属性。下面的例子是强制屏幕全黑15分钟,并且60分钟后把显示器设为待机状态: PHP代码

1
setterm -blank 15 -powersave powerdown -powerdown 60

下面这段命令可以在中断显示加下划线的文字: PHP代码

1
2
3
setterm -underline on;
echo “Add Your Important Message Here”
setterm -underline off

或者你可以关闭光标: PHP代码

1
setterm -cursor off
  1. smbclient:向 MS-Windows 系统发送消息

smbclient可以和 SMB/CIFS服务器通信。它可以向MS-Windows系统的指定用户发送消息: PHP代码

1
2
3
4
5
6
smbclient -M WinXPPro <<EOF
Message 1
Message 2
..
EOF

或者 PHP代码

1
echo “${Message}” | smbclient -M salesguy2
  1. Bash Socket 编程

你可以在bash中开启一个socket链接,并且传输数据。Bash有两个特殊的设备文件:

1
2
  /dev/tcp/host/port – 如果hostname,和port是合法的话,bash会尝试开启一个TCP连接。
  /dev/udp/host/port – 如果hostname和port是合法的话,bash会开启一个UDP连接。

你可以利用这个技术来测试一台主机的端口是否是开启的,而不需要使用nmap或者port扫描器: PHP代码

1
2
# find out if TCP port 25 open or not
(echo >/dev/tcp/localhost/25) &>/dev/null && echo “TCP port 25 open” || echo “TCP port 25 close”

你可以 使用循环来查找开着的端口: PHP代码

1
2
3
4
5
echo “Scanning TCP ports…”
for p in {1..1023}
do
  (echo >/dev/tcp/localhost/$p) >/dev/null 2>&1 && echo “$p open”
done

输出:

1
2
3
4
5
6
7
8
9
10
11
12
13
Scanning TCP ports…

22 open

53 open

80 open

139 open

445 open

631 open

下面的这个例子让你的脚本扮演HTTP客户端: PHP代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/bin/bash
exec 3<> /dev/tcp/${1:-www.cyberciti.biz}/80
printf “GET / HTTP/1.0\r\n” >&3
printf “Accept: text/html, text/plain\r\n” >&3
printf “Accept-Language: en\r\n” >&3
printf “User-Agent: nixCraft_BashScript v.%s\r\n” “${BASH_VERSION}”  >&3
printf “\r\n” >&3
while read LINE <&3
do
  # do something on $LINE
  # or send $LINE to grep or awk for grabbing data
  # or simply display back data with echo command
  echo $LINE
done

关于GUITools和Cronjob

如果你使用cronjob来调用你的脚本的话,你要通过“ export DISPLAY=[user’s machine]:0”命令来设置本地的 display/input 服务。例如调用 /home/vivek/scripts/monitor.stock.sh脚本,它使用了 zenity 工具: PHP代码

@hourly DISPLAY=:0.0 /home/vivek/scripts/monitor.stock.sh

所有的命令你都可以通过“man”来查询详细的使用方式。

文章转载自:http://www.oschina.net/question/28_39527

网易笔试

应该说网易的这个笔试对我来说很简单~有那么几个点可以写出来

mysql 一些基础的应用

linux操作系统

tcp/ip

tcp/ip的三次握手过程~

vim/gcc/gdb的使用

进程线程端口号

文件的权限使用情况

大概就这么几点~总体难度不大的