2013年5月17日星期五

linux常用指令简介


linux常用指令集列表(持续更新):
cd  ls  pwd  su  du  rm  cp  mv  >  >>  |  sort  find  cat  more  less  top  ps  free  df  wget  uname  grep  tar  kill  wc  chmod  chown  adduser  mkdir  touch  crontab  date  type/which  reboot  halt  shutdown  split  diff  mount  umount  fdisk  passwd  ssh  scp  rcp  sync  rsync  samba  ifconfig netstat  ping  man  sleep  alias  sed  ulimit  clear  uniq  awk  ftp  samba  head/tail  curl  ln  sudo  export  cut



cd 切换目录

常用参数:
~ 回到用户主目录
.. 返回上级目录



ls 列表方式查看指定目录下的文件和文件夹

常用参数:
-l list,列出指定目录下的所以文件和文件夹
-t time,按时间排列
-a all,包括隐藏文件,隐藏文件前带.



pwd 查看当前所在目录位置



su 切换登录用户
用法: su [username]



du 显示目录或文件的大小,占用磁盘空间

使用方式:
du [options] [目录或文件]
常用参数:
-h或--human-readable 以K,M,G为单位,提高信息的可读性
-s或--summarize 仅显示总计



rm 删除文件和目录

使用方式:
rm [options] source..
常用参数:
-r 递归删除目录和文件,强制删除
-f force不论文件是否存在,不用提示



cp 复制文件

使用方式:
cp [options] source dest(目的对象)
cp [options] source..  directory
cp aaa bbb 复制aaa并更名为bbb
常用参数:
-r 递归拷贝文件夹里的内容
-f 如果目标文件夹有同名文件,先删除再拷贝



mv 移动文件,文件重命名,剪切文件

使用方式:
mv [options] source dest
mv [options] source.. directory
mv aaa bbb aaa重命名为bbb



>>> 重定向
> 把标准输出写入到指定文件,从文件头开始,会覆盖原文件
>> 把标准输出写入到指定文件,从文件尾开始,追加到原文件之后



| 管道,导流,把标准输出导入到标准输入
使用方式:
ps aux | grep mysql >>a.log



sort 对文本文件内容排序,以行为单位

使用方式:
sort [options][文件]
常用参数:
-m或--merge 合并
-r或--reverse 反序排列
-u或--unique 去重
-n 按数值排序
-k 按指定列排序
-t 指定列分隔符
   eg: sort -n -t "/" -k 3 filea 文件以/分割的第3列按数值排序
-b 忽略每行前面的空白部分,从第一个可见字符开始比较



find 在目录层级里查找文件和内容,可以指定名称、类别、时间、大小、权限等组合,只有完全相符的才会被列出来

使用方式:
find expression(表达式)
find . -type f  表示查找当前目录及其子目录下类型是f的档案 ( . 表示当前目录)
常用参数:
-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 会忽略大小写
-type f 类型是f的档案
-name filename 名称是filename的档案
-size n 大小是n单位的档案,b 代表 512 位元组的区块,c 表示字元数,k 表示 kilo bytes,w 是二个位元组



cat 把文件内容串连后传到标准输出

使用方式:
cat file1 file2 >>file3 把文件1 2内容追加到3中
常用参数:
-n或--number 由 1 开始对所有输出的行数编号
-b或--number-nonblank 和 -n 相似,只不过对于空白行不编号
-s或--squeeze-blank 当遇到有连续两行以上的空白行,就代换为一行的空白行



more 类似cat,会逐页显示方便阅读,按空白键pagedown,按b(back)键pageup,而且还有搜寻字串的功能(与vi相似)




less 与 more 相似,允许使用者往回卷动以浏览已经看过的部份

主要参数:
-p 回到file第一行
-b 前一页 pageup
-backspace 下一页 pagedown




top 任务管理器,实时显示进程状态,cpu使用情况等



ps  显示瞬时进程的动态,内容与top差不多.
包括:pid,user,%cpu(cpu使用率),%mem(内存使用率),VSZ(虚拟内存占用大小),stat(状态),start(启用时间),time(执行时间),command(所执行的指令)

主要参数:
-aux 显示所有包含其他使用者的行程



free 查看内存状态

使用方式:
free [options]
常用参数:
-m 以MB为单位显示内存使用情况
-t 显示内存总和 total 行





df 查看磁盘使用情况
-a --all 包含所有的具有 0 Blocks 的档案系统
-h --human-readable 使用人类可读的格式




wget 从指定url下载内容
wget [options] url



uname 查看linux系统的版本信息
常用参数:
-a 显示所有信息



grep 搜索file中与keyword匹配的所有行并打印

使用方式:
grep [options] keyword filename



tar 压缩和解压缩文件

使用方式:
tar [options] filename
常用参数:
-c或--create   建立新的备份文件
-f<备份文件>或--file=<备份文件>   指定备份文件
-v或--verbose   显示指令执行过程
-x或--extract或--get   从备份文件中还原文件
-z或--gzip或--ungzip   通过gzip指令处理备份文件



kill 发送信号给pid,告诉pid要做什么

使用方式:
kill [options] pid/command
常用参数:
-s(signal) 其中可用的讯号有 HUP(1),KILL(9),TERM(15), 分别代表著重跑,砍掉,结束,eg: kill -9 mysql 即终止mysql进程
-l(signal) 列出所有可用的信号名称



wc 统计文件的Byte数、字数、或是行数

使用方式:
wc [options] filename
常用参数:
-c或--chars   统计Bytes数。
-l或--lines   统计行数。
-w或--words   统计字数。



chmod 修改用户对文件的读写和可执行权限

使用方式:
chmod [options] file
u 表示ownerUser, g 表示同组group, o other表示其他用户, a 表示all
+ 表示增加权限,  - 表示取消权限,  = 表示唯一设定权限
r 表示可读,  w 表示可写,  x 表示可执行, X 表示只有当该档案是个子目录或者该档案已经被设定过为可执行
    r=4,w=2,x=1
  若要rwx属性则4+2+1=7;
  若要rw-属性则4+2=6;
  若要r-x属性则4+1=5
eg:chmod +x file 设置file为可执行文件
   chmod 754 file 设置owner可读写执行,group可读可执行,other可读
   chmod u+rwx,g+rx,o+w file 增加owner可读写执行权限,增加group读执行权限,增加other写权限



chown 改变文件的所有者,该命令只有root用户才能使用

使用方式:
chown [options] username  file
username  文件的新所有者
-R 递归变更文件夹和子目录下的文件所有者



adduser 添加用户
用法: adduser -gid 1000 --home /home/username username
-gid 组id,如果不指定组,则会新建一个组
--home 用户主目录,不指定会默认在/home下创建

addgroup 添加组



mkdir  新建文件夹

使用方式:
mkdir [options] file
常用参数:
-p (parent)目录不存在,则建一个
eg:mkdir qq/aa 如果qq目录不存在,则会报错
   mkdir -p qq/aa 如果qq目录不存在,则会新建一个qq目录



touch 改变文件的时间记录,新建文件

使用方式:
touch [options] file
touch filename  新建文件filename



crontab 设置定时任务,linux系统中作为工作时程表任务

时程表的格式如下: f1   f2   f3   f4   f5   program
其中分别对应  :   分钟 小时 日期 月份 星期 可执行程序

当 fn 的位置是 * 表示所有时间都要执行
eg: 0 * * * * /bin/ls  每月每天每小时0分钟的时候执行一次 /bin/ls
    30 17 * * 1-5 /bin/ls 每周1-周5下午5点30分执行一次  /bin/ls
    0 6-12/3 * 1 * /bin/ls 1月份的每天6点-12点每隔20分钟执行一次  /bin/ls
    5,15,25 * * * *  /bin/ls 每到1分,15分,25分钟的时候执行一次  /bin/ls

常用参数:
-u 指定时程表用户,一般root权限使用,普通用户只能给自己设置时程表,不指定-u时默认是当前用户
-l 列出所有时程表
-e 编辑时程表文件,保存退出后,系统将自动重启时程表任务
-r 删除时程表任务

使用方式:
$ vi cronfile  #先建立cronfile
$ chmod +x cronfile  #把cronfile设为可执行文件
$ crontab cronfile   #启用cronfile文件,系统就会自动定时执行.



date 可以用来显示或设定系统的日期与时间

显示时间的格式:
%D : 直接显示日期 (mm/dd/yy)  eg: date +%D 结果是: 05/20/13
%T : 直接显示时间 (24 小时制) eg: date +%T 结果是: 12:30:26
%X : 相当于 %H:%M:%S          eg: date +%X 结果是: 01:10:23 PM

设置时间的格式:
MMDDhhmm[[CC]YY][.ss]  其中 MM 为月份, DD 为日, hh 为小时, mm 为分钟, CC 为年份前两位数字, YY 为年份后两位数字, ss 为秒数.
只有root权限才能设置系统时间,更改了系统时间之后,以 clock -w 来将系统时间写入 CMOS 中,这样下次重新开机时系统时间才会持续抱持最新的正确值

常用参数:
-d datestr : 显示 datestr 中所设定的时间 (非系统时间)
-s datestr : 将系统时间设为 datestr 中所设定的时间
-u : 显示目前的格林威治时间

$ sudo date -s '05/22 12:50 (20 13) (.40)'
结果显示系统时间设置为: Wed May 22 12:50:00 CST 2013



type 查找软件在系统中的位置,与which类似

使用方法:
type mysql  #查找mysql可执行软件的位置
结果是: mysql is /usr/bin/mysql



reboot 若系统的 runlevel 为 0 或 6 则重启系统,否则唤醒 shutdown (-r)
参数:
-n : 在重开机前不做将记忆体资料写回硬盘的动作
-d : 不把记录写到 /var/log/wtmp 档案里(-n 包含了 -d)
-w : 并不会真的重开机,只是把记录写到 /var/log/wtmp 档案里
-f : force,强迫重开机,不呼叫 shutdown 这个指令
-i : 在重开机之前先把所有网络相关的装置先停止

/var/run/utmp 当前的 runlevel 信息从此文件中读取
/var/log/wtmp 新的 runlevel 信息记录将追加到此文件



halt 若系统的 runlevel 为 0 或 6 则关闭系统,否则唤醒 shutdown (-h)

参数:
-n : 在关机前不做将记忆体资料写回硬盘的动作
-d : 不把记录写到 /var/log/wtmp 档案里(-n 包含了 -d)
-w : 并不会真的关机,只是把记录写到 /var/log/wtmp 档案里
-f : force,强迫关机,不呼叫 shutdown 指令
-i : 在关机之前先把所有网络相关的装置先停止
-p : 当关机的时候,顺便做关闭电源(poweroff)的动作



shutdown 执行关机程序,并且在关机前传送讯息给所有使用者,关机前5分钟内拒绝用户登录,shutdown 也可以用来重开机(reboot),这是一种安全的关机模式.

使用方式:
shutdown [options] time [message]
参数 :
-r : 关机并重启系统(reboot)
-h : 关机后切断电源(halt or poweroff)
-c : 取消目前已经进行中的关机动作
-k : 并不会真的关机,只是将警告讯息传送给所有使用者
-t seconds : 设定在几秒钟之后进行关机程序
-n : 不采用正常程序来关机,用强迫的方式杀掉所有执行中的程序后自行关机
-f : 关机时,不做 fcsk 动作(检查 Linux 档系统)
-F : 关机时,强迫进行 fsck 动作
time : 设定关机的时间,[now],立即关机,[+m],eg:+10 10分钟, hh:mm 24小时制的时分
message : 传送给所有使用者的警告讯息

/var/run/utmp 当前的 runlevel 信息从此文件中读取,环境变量
/var/log/wtmp 新的 runlevel 信息记录将追加到此文件

特别说明,我试了-c参数,无法生效
$ shutdown +10  #设置10分钟之后关机
然后系统开始计时并且发送message给用户,用户无法进入命令行模式,所以-c参数派不上用场




split 拆分文件,拆分后文件名首字母默认为x,默认后缀为2个字母,依次为aa,ab... eg: xaa,xab...

常用参数:
-l 按行分割
-b 按大小分割 M K
-a --suffix-length=N 指定输出文件名的后缀,默认为2个



diff 比较文件的差异,逐行比较文本文件的异同处.指定要比较目录,则diff会比较目录中相同文件名的文件,但不会比较其中子目录

使用方式:
diff [options] [文件或目录1][文件或目录2]
常用参数:
-<行数> 指定要显示多少行的文本.须与-c或-u一起使用
-c context,显示全部内容,并标出不同之处
-d 使用不同的演算法,以较小的单位来做比较
-H 比较大文件时,可加快速度
-p 比较C语言的程序文件时,显示差异所在的函数名称
-q 仅显示有无差异,不显示详细的信息
-r 比较子目录中的文件
-y 以并列的方式显示文件的异同之处
-u 以合并的方式来显示文件内容的不同



mount 挂载

使用方式:
mount -t type device dir
eg:  mount --bind olddir newdir 两处都挂载
     mount --move olddir newdir 移到newdir
常用参数:
-a 将 /etc/fstab 中所有东西都挂上。
-F 通常与 -a 一起使用,它会为每一个 mount 的动作产生一个进程负责执行.在系统需要挂上大量 NFS 档案系统时可以加快挂上的动作
-v verbose 显示详细过程
-f fake 通常用来除错,它并不执行实际挂上动作,而是模拟整个挂上动作,常与 -v 一起使用.
-t 指定文件类型,通常不必指定.mount 会自动选择正确的类型
-o ro 用唯读模式挂上
-o rw 用读写模式挂上
-B, --bind 重新绑定子树到其他地方
-R, --rbind 重新绑定子树到其他地方,包括子子树,递归方式绑定
 -M, --move 重新绑,到别的地方

现有type包括:
adfs, affs,  autofs,  cifs,  coda,  coherent,  cramfs, debugfs, devpts, efs, ext, ext2, ext3, ext4, hfs, hfsplus, hpfs, iso9660, jfs, minix, msdos, ncpfs, nfs, nfs4,ntfs, proc, qnx4, ramfs, reiserfs, romfs, squashfs, smbfs, sysv, tmpfs, ubifs, udf, ufs, umsdos, usbfs, vfat, xenix, xfs, xiafs.



umount 卸载目前挂在Linux目录中的文件系统
-t 卸除指定的文件系统
-a 卸除/etc/mtab中记录的所有文件系统
-r 若无法成功卸除,则尝试以只读的方式重新挂入文件系统



fdisk 查看硬盘的情况,磁盘分区

使用方式:
$ fdisk -l /dev/sda   #查看磁盘分配情况
$ fdisk /dev/sda      #进入磁盘分区模式
:m 显示所有命令列示
:p 显示硬盘分割情形
:a 设定硬盘启动区
:n 设定新的硬盘分割区
  e 硬盘为扩展分割区(extend)
  p 硬盘为主要分割区(primary)
:t 改变硬盘分割区属性
:d 删除硬盘分割区属性
:q 结束不保存硬盘分割区属性
:w 结束并写入硬盘分割区属性

分区完成之后要先格式化分区
mkfsext3 分区名   将分区格式化ext3格式
mkfs -t 类型 分区名   将分区格式化为指定格式
mkswap 分区名   将分区格式化为swap格式

然后挂载分区到某目录下,这样才可以开始使用该分区
mount device dir
umount 卸载

或者在 /etc/fstab 文件里设置自动挂载

另外,添加交换分区
fdisk /dev/sdb
参数:n t l w
swapon/swapoff 分区名 打开和关闭交换分区
free 查看内存或交换分区使用情况




passwd 修改密码
使用方式:
passwd [username] 回车后输入当前密码,然后输入新密码


ssh 远程客户端登陆
使用方式:
ssh [options] [user]@hostname [command]




scp 远程拷贝,通过ssh方式的安全加密方式

使用方式:
scp [options] user@host1:file1 ...  user@host2:file2
常用参数:
-1 scp只能用协议1
-2 scp只能用协议2
-3 两个远程主机之间的数据传输都经过本地主机.如果没有这个选项,数据传输是直接在两个主机之间进行.需要注意的是,这个选项不显示进度.
-4 scp只能用ipv4地址
-6 scp只能用ipv6地址
-B 批量模式,需要密码口令
-C 压缩Compression
-c cipher密码,encrypting加密传输数据
-p 保留源文件属性
-r 递归复制
-v 显示详细进度

$ scp -v cxz@192.168.1.105:/desktop/filename cxz@192.168.1.102:/tep/



rcp 远程拷贝
-p 保留源文件属性
-r 递归拷贝



sync 把缓存中的文件写入/同步到磁盘中


rsync 远程拷贝/同步文件
rsync -v -P -e ssh user@ip: ~/file  ./



samba  windows系统和linux系统之间共享文件的服务器,需要安装
参数:
start   启动Samba服务器的服务
stop    停止Samba服务器的服务
status  显示Samba服务器目前的状态
restart 重启Samba服务器



ifconfig 设置网络设备的状态,显示目前的设置,包括硬件地址,ip,广播,掩码,ipv6地址等



netstat 显示linux系统的网络状态

使用方式:
netstat [-vWeenNcCF] [<Af>] -r 
netstat [-vWnNcaeol] [<Socket> ...]
netstat [-vWeenNac] -i | [-cWnNe] -M | -s 
参数:
-r --route 显示路由配置信息表
-i --interfaces 显示接口信息表
-g --groups  显示多点光播组成员
-s --statistics 显示网络工作信息统计表(类似SNMP)
-M --masquerade 显示伪装的网络连接

-v --verbose 显示详细信息
-W --wide 不 truncate IP地址
-n --numeric 不解析名字(直接使用IP地址,而不通过域名服务器)
-N --symbolic 显示网络硬件外围设备的符号连接名称
-e --extend  显示网络其他相关信息
-p --programs 显示正在使用Socket的程序的PID和name
-c --continuous 持续列出网络状态

-l, --listening 显示监听中的服务器的Socket
-a, --all 显示所有连接中的sockets
-o, --timers 显示计时器
-F, --fib  显示转发信息
-C, --cache 显示路由缓存信息而不是转发信息FIB

-t --tcp
-u --udp
-w --raw
-x --unix



ping  使用ICMP传输协议,发出要求回应的信息,若远端主机的网络功能没有问题,就会回应该信息,因而得知该主机运作正常
ICMP (internet control message protocol) 报文控制协议

使用方式:
ping [options] [主机名称或IP地址]
参数:
-f 极限检测
-R 显示路由过程
-v 显示详细指令的执行过程



man  在线帮助手册 

使用方式:
man command  显示详细的帮助信息
其他帮助方式:
command --help  显示主要的参数信息



sleep 延迟动作
number 时间长度,后面可接 s秒、m分、h时 或 d日 
eg: sleep 1m  等待1分钟



alias 设置指令的别名
使用方式:
alias[别名]=['指令名称']
若不加任何参数,则列出目前所有的别名设置



sed  利用script的指令,来处理、编辑文本文件
-e<script> 以指定的script来处理输入的文本文件
-f<script文件> 以指定的script文件来处理输入的文本文件
-n --quiet --silent 仅显示script处理后的结果


ulimit 控制shell程序的资源,shell内建指令
-a 显示目前资源限制的设定


clear 清除屏幕


uniq 去重,检查及删除文本文件中重复出现的行列

使用方式:
uniq [options] [输入文件] [输出文件]
参数:
-c 显示每行重复出现的次数
-d 仅显示重复出现的行
-u 去重
-f<field> 忽略指定区域
-s<char>  忽略指定字符
-w<n>     指定要比较的字符数n



awk 处理文本和数据的程序语言,比sed和grep强大之处在于可以方便的处理列数据

awk是 pattern(模型,样品,规则) {action}{操作} 序列对,也可以自定义函数.
小程序可以直接在命令行输入,用单引号('')包起来,避免被shell解释.
大程序可以用-f调用程序文件.输入数据可以从文件列表读取,也可以从标准输出读取.输入数据被变量 RS 切分为一条条的记录,默认 RS='\n' ,即一行为一条记录.每条记录与pattern进行比较,匹配则执行{action}.

参数:
-F 设置分隔符,FS,eg:空格,t(tab),%,&,:等
-f 调用程序文件
-v 分配变量的值,var=value
-- 操作结束符

内置变量:  (使用内置变量时不需要引号)
ARGC 命令行参数个数(不包括awk的选项和awk的程序内容)
ARGIND 当前正在处理的ARGV中的文件的索引值(同时处理多个文件时会用到)
ARGV 命令行参数序列数组,下标从0开始
CONVFMT 数字转换格式,和C语言中的数字输出格式化类似,默认为"%.6g"
ENVIRON 当前系统的环境变量
ERRNO 出错时的错误信息
FIELDWIDTHS 以空格分隔的字段宽度,如果指定此变量,awk将会用指定的宽度替换变量FS指定的分隔符
FILENAME 当前正在处理的文件名,该变量不能在BEGIN块中使用
FNR 当前处理的记录号
FS 字段的分隔符,默认为空格
IGNORECASE 如果该变量设置为非0值,在进行字符串匹配时忽略大小写
NF 当前记录中的字段个数
NR 已经读出的记录数
OFMT 数字的输出格式
OFS 输出的字段分隔符,默认为空格
ORS 输出的记录分隔符,默认为新行
RS 输入记录的分隔符,默认为新行
RSTART 被match()函数匹配的字符串的起始位置,如果没有匹配则为0(从1开始)
RLENGTH 被match()函数匹配的字符串的长度
SUBSEP 数组中多个下标的分隔符,默认为"\034"

eg:
awk '{pattern}{active}' file
awk -F / '{print $2}' file 打印文件以/分割的第2列
$n 表示第n列,$0表示整行



ftp 标准文件传输协议,用户与远程站点之间进行文件传输

使用方式:
ftp [options] [host:port]
-4 ipv4
-6 ipv6
-v 显示远程服务器的指令执行过程,包括数据传输和统计
-d 详细显示指令执行过程,便于排错或分析程序执行的情形,调试用



samba windows系统和linux系统之间共享文件的服务器,需要安装
start   启动Samba服务器的服务
stop    停止Samba服务器的服务
status  显示Samba服务器目前的状态
restart 重启Samba服务器



head/tail 读取文本文件的最前/后10行
head -20 file 读取文件的前20行
tail -20 file 读取文件的后20行
tail -f file 实时刷新文件,一般用于查看日志文件



curl 下载url中的数据

curl是一个工具来与服务器传递数据,使用一个支持的协议(DICT类型, FILE, FTP, FTPS, GOPHER, HTTP, HTTPS,  IMAP,IMAPS,  LDAP,  LDAPS,  POP3, POP3S, RTMP, RTSP, SCP, SFTP, SMTP, SMTPS,TELNET and TFTP).curl无需与用户进行交互.

curl提供一车有用的技巧,如代理支持,用户身份验证,FTP上传,HTTP post,SSL连接,cookie,文件传输摘要等等

curl [options] [URL...]



ln 在文件之间建立连接

Linux/Unix 文件系统中,有所谓的连结(link),我们可以将其视为文件的别名,而连结又可分为两种:硬连结(hard link)与软连结(symbolic link),硬连结的意思是一个文件可以有多个名称,而软连结的方式则是产生一个特殊的文件,该文件的内容是指向另一个文件的位置.硬连结是存在同一个文件系统中,而软连结却可以跨越不同的文件系统

使用方式:
ln [options] source dist
ln source dist 是产生一个连结(dist)到 source,默认是硬连接,-s是软连接
不论是硬连结或软链结都不会将原本的档案复制一份,只会占用非常少量的磁碟空间

参数:  
-f  链结时先将与 dist 同档名的档案删除
-d  允许系统管理者硬链结自己的目录
-i  在删除与 dist 同档名的档案时先进行询问
-n  在进行软连结时,将 dist 视为普通文件
-s  进行软链结(symbolic link)
-v  显示所有已链接文件名
-b  将在链结时会被覆写或删除的档案进行备份
-S SUFFIX : 将备份的档案都加上 SUFFIX 的字尾
-V METHOD : 指定备份的方式

eg:
ln -s yy zz 文件yy产生一个软连接zz
ln yy zz    文件yy产生一个硬链接zz



sudo 用超级用户或别的用户的身份执行命令

sudo -l 显示自己的权限
sudo command 以root身份执行命令



export 设置或显示环境变量(需安装)

在shell中执行程序时,shell会提供一组环境变量. export可新增,修改或删除环境变量,供后续执行的程序使用. export的效力仅及于该此登陆操作

参数:
-f  代表[变量名称]中为函数名称
-n  删除指定的变量,变量实际上并未删除,只是不会输出到后续指令的执行环境中
-p  列出所有的shell赋予程序的环境变量



cut 逐行打印指定部分到标准输出

用法:
cut -cnum1-num2 filename
显示每行从开头算起 num1 到 num2 的文字

参数:
-b 指定字节bytes
-c 指定字符characters
-d 指定分界符,默认是 tab
-f 指定列字段fields,如果没有分界符,则打印整行
-s 不打印无分界符的行
-c m-n 表示显示每一行的第m个字元到第n个字元
-f m-n 表示显示第m栏到第n栏(使用tab分隔)

eg:
cut -c 0-6 file  #打印前 6 个字元
cut -c 5-8 file  #打印第5-8个字符
cut -c 1-3,10-12 file  #打印第1-3和10-12个字符
cut -f 1,3 file  #打印tab分割的第1列和第3列

apache 服务自带的ab测试



文件路径
D:\AppServ\Apache2.2\bin\ab.exe


windows下,cmd打开dos命令窗口.

> ab.exe -h 查看帮助信息


使用方式:
ab.exe [options] [http://]hostname[:port]/path

常用参数:
    -n 请求         执行请求数
    -c 并发         并发数
    -t 时间限制     等待响应的最长时间,单位:秒
    -w              把结果打印到html
    -i              用 HEAD 代替 GET 发请求
    -C 属性    添加cookie, eg. 'Apache=1234. (可重复)
    -H 属性    添加头信息,插入到所有头信息之后.eg. 'Accept-Encoding: gzip'
    -X 代理:端口    使用代理
    -V              版本信息
    -k              使用 HTTP KeepAlive 特性
    -h              帮助信息


> ab.exe -n 10 -c 10  http://www.baidu.com/

测试结果

Server Software:        BWS/1.0
Server Hostname:        www.baidu.com
Server Port:            80

Document Path:          /
Document Length:        10480 bytes

Concurrency Level:      10             #并发数
Time taken for tests:   0.60008 seconds     #总耗时
Complete requests:      10                  #完成请求数
Failed requests:        8   #失败请求
   (Connect: 0, Length: 8, Exceptions: 0)
Write errors:           0
Total transferred:      109644 bytes
HTML transferred:       104700 bytes
Requests per second:    166.64 [#/sec] (mean)  #每秒请求数
Time per request:       60.008 [ms] (mean)     #每次请求耗时
Time per request:       6.001 [ms] (mean, across all concurrent requests)
Transfer rate:          1783.10 [Kbytes/sec] received   #传输速率




ab.exe 使用注意事项:
1. -c 并发数不能大于 -n 请求数,否则会报错
2. 最大并发数在配置文件中可修改,修改方法如下


查看工作模式
cmd打开dos指令窗口
cd 到D:\AppServ\Apache2.2\bin\下,执行指令
> httpd -l    //查看配置文件使用的工作模式
结果是:
mpm_winnt.c  //即使用的是winnt模式, mpm :多路处理模块


配置工作模式
打开D:\AppServ\Apache2.2\conf\http.conf文件,查找mpm,找到

# Server-pool management (MPM specific)
# Include conf/extra/httpd-mpm.conf

去掉第二行前的注释符,即启用httpd-mpm.conf文件
找到D:\AppServ\Apache2.2\conf\extra\下的httpd-mpm.conf文件,打开并查找WinNT,找到


# WinNT MPM  #windows模式
# ThreadsPerChild: constant number of worker threads in the server process
# MaxRequestsPerChild: maximum  number of requests a server process serves
<IfModule mpm_winnt_module>
    ThreadsPerChild      150
    MaxRequestsPerChild    0
</IfModule>

ThreadsPerChild 子线程,即并发数,将150改为1000


其他工作模式

prefork MPM  #预处理进程模式  用进程处理请求
<IfModule mpm_prefork_module>
    StartServers          5  #预先分配进程个数
    MinSpareServers       5  #最小空闲进程
    MaxSpareServers      10  #最大空闲进程
    MaxClients          150  #支持的最大并发数
    MaxRequestsPerChild   0
</IfModule>


linux下默认采用工作方式,用预先分配子进程的方式处理请求,进程之间相互独立,是最稳定的MPM之一


worker MPM  #工作模式  用线程处理请求,线程即子进程
<IfModule mpm_worker_module>
    StartServers          2  #初始进程数
    MaxClients          150  #支持的最大并发数
    MinSpareThreads      25  #最小空闲线程
    MaxSpareThreads      75  #最大空闲线程
    ThreadsPerChild      25  #一个进程包含的线程数
    MaxRequestsPerChild   0  #最大请求子线程,设置为0即执行完之后,进程不死,设置为10,执行完之后,进程死掉
</IfModule>



worker模式采用多进程多线程,稳定,是apache 2.x的发展趋势





vim 操作快捷键


参考链接:
http://www.cnblogs.com/88999660/articles/1581524.html
http://eric4ever.yo2.cn/articles/vi.html



光标定位:

0/$   光标移到行首/行尾
gg/G  光标移到页头/页尾
nG    到第n行
h/j/k/l   左/下/上/右移动一位
n<Enter>  光标下移n行
n<space>  光标右移n位
[Ctrl+f]  相当于Page Down
[Ctrl+b]  相当于Page Up


复制/粘贴/删除:

dd  删除行
D   删除整行内容,保留空行
yy  复制行
p/P 粘贴到下/上一行
u   撤销操作
x/X 删除后/前一字节
.   重复上个动作


整理代码格式

:v  选中内容
=   整理选中内容,格式对齐
z + shift + r  展开代码  
zr     展开代码
zc     收拢代码

查找:

/word 向光标之下查找word
?word 向光标之上查找word
n     重复前一个查找动作


替换:

:n1,n2s/word1/word2/g  n1到n2行之间,所有word1替换为word2
:1,$s/word1/word2/g    从第一行到最后一行,word1替换为word2


末行命令:
:set nu   显示行号
:set nonu 不显示行号
:w   将编辑的文件写入到硬盘上
:q   退出 vi
:wq  保存后退出,若为 :wq! 则为强制保存为退出

2013年5月16日星期四

linux下开源压力测试工具webbench


参考链接:
http://xiahongyuan.blog.51cto.com/906214/735445


webbench最多可以模拟3万个并发去测试网站的负载能力,实际一个网站发生3w个用户同时访问同一个页面的情况非常小,即使铁路订票网站http://www.12306.cn/mormhweb/在春运的时候,这种情况都不一定能出现.



下载安装
$ sudo wget http://home.tiscali.cz:8080/~cz210552/distfiles/webbench-1.5.tar.gz
$ sudo tar -zxvf webbench-1.5.tar.gz
$ cd webbench-1.5/
$ sudo make
$ sudo make install

使用webbench

$ webbench -h     //查看帮助信息

webbench [option]... URL
  -f|--force               服务器不返回数据.
  -r|--reload              发送重载请求 - 注: no-cache(服务器不缓存).
  -t|--time <sec>          运行标准测试的时间,默认30秒.
  -p|--proxy <server:port> 用代理服务发请求.
  -c|--clients <n>         模拟客户端发送http请求,默认1个.(并发数)
  -9|--http09              用 HTTP/0.9 发送请求.
  -1|--http10              用 HTTP/1.0 协议发请求.
  -2|--http11              用 HTTP/1.1 协议发请求.
  --get                    用get方式请求.
  --head                   用head方式请求.
  --options                用OPTIONS方式请求.(用户自己指定)
  --trace                  用TRACE请求方法.
  -?|-h|--help             帮助信息.
  -V|--version             版本信息.


//无参数测试,默认1个客户端,运行30秒
$ webbench  -f http://www.baidu.com/

测试结果
Benchmarking: GET http://www.baidu.com/
1 client, running 30 sec, early socket close.

Speed=370 pages/min, 0 bytes/sec.  //返回0字节是因为f模式
Requests: 185 susceed, 0 failed.


//模拟10个客户端 运行10秒
$ webbench  -c 10 -t 10  http://www.baidu.com/

测试结果
Benchmarking: GET http://www.baidu.com/
10 clients, running 10 sec.

Speed=1356 pages/min, 242126 bytes/sec.
Requests: 226 susceed, 0 failed.


//模拟10个客户端 运行10秒,增加-f,对比结果可以发现-f的效果
$ webbench  -c 10 -t 10 -f http://www.baidu.com/

测试结果
Benchmarking: GET http://www.baidu.com/
10 clients, running 10 sec, early socket close.

Speed=1854 pages/min, 0 bytes/sec.
Requests: 309 susceed, 0 failed.



结果中,Speed数越大,说明网站的响应速度越快.


linux下开源压力测试工具Siege

参考连接:
http://xiahongyuan.blog.51cto.com/906214/735445



Siege一款开源的压力测试工具,可以根据配置对一个WEB站点进行多用户的并发访问,记录每个用户所有请求过程的相应时间,并在一定数量的并发访问下重复进行。

下载安装

获取:http://www.joedog.org/
官方提供ftp下载
解压:
$ tar -zxf siege-latest.tar.gz
进入解压目录:
$ siege-3.0.1/
安装:
$ ./configure
$ make
$ make install

这一步我操作失败了,根据提示自动安装
$ apt-get install siege
系统自动安装了2.7版本的,所以其实不用去单独下载了


使用siege

$ siege -h  会出来所有siege相关的参数指令

Usage: siege [options]
       siege [options] URL
       siege -g URL
Options:
  -V, --version           版本信息,打印版本号.
  -h, --help              帮助信息.
  -C, --config            配置信息,显示当前配置.
  -v, --verbose           打印通知信息.
  -g, --get               get方式发送请求,并且显示获取的http请求头信息,一般用于应用程序调试
  -c, --concurrent=NUM    并发数,默认10
  -i, --internet          模拟网络用户,随机请求url.
  -b, --benchmark         标准测试:请求无延时.
  -t, --time=NUMm         根据m设定为S,M,H定时测试 ex: --time=1H, 一小时后测试.
  -r, --reps=NUM          重复请求次数.
  -f, --file=FILE         含url的文件.
  -R, --rc=FILE           指定远程控制文件
  -l, --log[=FILE]        log文件,如果没有指定,默认使用PREFIX/var/siege.log
  -m, --mark="text"       标记log文件的类型/格式.
  -d, --delay=NUM         延迟时间,随机延迟(1-num)之间的时间
  -H, --header="text"     添加请求头,可以多个
  -A, --user-agent="text" 请求中设置用户代理


$ touch linkfile  //新建一个linkfile
$ vi linkfile      //编辑linkfile,里面全部是url


//模拟10个用户随机访问10次linkfile中的链接

$ siege -c 10 -r 10 -f linkfile

测试结果:
done.                                                                     Transactions:                  100 hits    //完成100次请求
Availability:                 100.00 %      //有效请求
Elapsed time:                  14.75 secs   //总耗时
Data transferred:               1.97 MB     //总传送数据
Response time:                  0.40 secs    //每秒响应次数
Transaction rate:               6.78 trans/sec  //每秒处理次数
Throughput:                     0.13 MB/sec   //每秒传输数据量 MB
Concurrency:                    2.69        //实际最大并发
Successful transactions:         100        //成功处理次数
Failed transactions:               0        //失败处理次数
Longest transaction:            6.46        //最长处理时间
Shortest transaction:           0.08        //最短处理时间


//get请求 获取请求头和响应头信息
$ siege -g http://www.baidu.com

测试结果:

以下是请求内容

GET / HTTP/1.1
Host: www.baidu.com
Accept: */*
Accept-Encoding: gzip
User-Agent: JoeDog/1.00 [en] (X11; I; Siege 2.70)
Connection: close

以下是响应内容

HTTP/1.1 200 OK
Date: Thu, 16 May 2013 03:05:07 GMT
Server: BWS/1.0
Content-Length: 4310
Content-Type: text/html;charset=utf-8
Cache-Control: private
Set-Cookie: BDSVRTM=5; path=/
Set-Cookie: H_PS_PSSID=2424_1442_2449_1944_1788_2250; path=/; domain=.baidu.com
Set-Cookie: BAIDUID=6B5B2875A9C1F6119218BE07DD4B2E57:FG=1; expires=Thu, 16-May-43 03:05:07 GMT; path=/; domain=.baidu.com
Expires: Thu, 16 May 2013 03:05:07 GMT
Content-Encoding: gzip
P3P: CP=" OTI DSP COR IVA OUR IND COM "
Connection: Close


2013年5月13日星期一

mysql数据库执行效率低的原因分析


参考连接:
http://coolin228.wordpress.com/2009/09/02/zt%E6%95%B0%E6%8D%AE%E5%BA%93%E6%89%A7%E8%A1%8C%E6%95%88%E7%8E%87%E4%BD%8E%E5%8E%9F%E5%9B%A0%E5%88%86%E6%9E%90/

1、没有索引
2、查询方法不是最优
3、查询语句不是最优
4、查询出的数据量过大
5、I/O吞吐量小,形成了瓶颈效应
6、内存不足
7、网络速度慢
8、引擎是innodB,打开了autocommit,而且程序没有显式调用BEGIN 开始事务,导致每插入一条都自动Commit
9、锁或者死锁
10、sp_lock,sp_who,活动的用户查看,原因是读写竞争资源


可以通过如下方法来优化查询 :
1)把数据、日志、索引放到不同的I/O设备上,增加读取速度,以前可以将Tempdb应放在RAID0上,SQL2000不在支持。数据量(尺寸)越大,提高I/O越重要.
2)纵向、横向分割表,减少表的尺寸(sp_spaceuse)
3)升级硬件
4)根据查询条件,建立索引,优化索引、优化访问方式,限制结果集的数据量。注意填充因子要适当(最好是使用默认值0)。索引应该尽量小,使用字节数小的列建索引,不要对有限的几个值的字段建单一索引如性别字段
5)提高网速;
6)扩大服务器的内存,Windows 2000和SQL server 2000能支持4-8G的内存。配置虚拟内存:虚拟内存大小应基于计算机上并发运行的服务进行配置。运行 Microsoft SQL Server 2000 时,可考虑将虚拟内存大小设置为计算机中安装的物理内存的 1.5 倍。如果另外安装了全文检索功能,并打算运行 Microsoft 搜索服务以便执行全文索引和查询,可考虑:将虚拟内存大小配置为至少是计算机中安装的物理内存的 3 倍。将 SQL Server max server memory 服务器配置选项配置为物理内存的 1.5 倍(虚拟内存大小设置的一半)。

2013年5月12日星期日

三次握手

参考资料:
http://baike.baidu.com/view/1003841.htm



TCP/IP协议中,TCP提供可靠的连接服务,在传输数据之前,要先建立点到点的连接.而这个连接的建立过程,就是三次握手的过程.



第一次握手:
    建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SENT状态,等待服务器确认;

第二次握手:
    服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态.
第三次握手:
    客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手.

完成三次握手,客户端与服务器开始传送数据.


>>SYN: 同步序列编号(Synchronize Sequence Numbers)
>>ACK: TCP应答号(Acknowledgment Number)



概念

未连接队列
在三次握手协议中,服务器维护一个未连接队列,该队列为每个客户端的SYN包(syn=j)开设一个条目,该条目表明服务器已收到SYN包,并向客户发出确认,正在等待客户的确认包。这些条目所标识的连接在服务器处于 Syn_RECV状态,当服务器收到客户的确认包时,删除该条目,服务器进入ESTABLISHED状态。

Backlog参数
表示未连接队列的最大容纳数目。SYN-ACK重传次数服务器发送完SYN-ACK包,如果未收到客户确认包,服务器进行首次重传,等待一段时间仍未收到客户确认包,进行第二次重传,如果重传次数超过系统规定的最大重传次数,系统将该连接信息从半连接队列中删除。注意,每次重传等待的时间不一定相同。

半连接存活时间
是指半连接队列的条目存活的最长时间,也即服务器从收到SYN包到确认这个报文无效的最长时间,该时间值是所有重传请求包的最长等待时间总和。有时我们也称半连接存活时间为Timeout时间、SYN_RECV存活时间。


2013年5月10日星期五

子网划分

参考链接:
http://baike.baidu.com/view/7649.htm


首先要了解IP地址的分类.

A类地址 最高位为0,默认子网掩码:255.0.0.0 ,1位网络地址,3位主机地址
 网络地址    主机地址                                  范围
 00000001   00000000 00000000 00000001   1.0.0.1
 01111110   11111111 11111111 11111111   126.255.255.255
 共126个网络地址,每个网络地址共256x256x256-2个主机地址

其中127.0.0.0到127.255.255.255是保留地址,用做循环测试用.
 01111111 00000000 00000000 00000000 127.0.0.0
 01111111 11111111 11111111 11111111 127.255.255.255
0.0.0.0到0.255.255.255也是保留地址,用做表示所有的IP地址.


B类地址 最高位为10,默认子网掩码:255.255.0.0 ,2位网络地址,2位主机地址
 网络地址                   主机地址                   范围
 10000000 00000000   00000000 00000001   128.0.0.1
 10111111 11111111   11111111 11111111   191.255.255.255
 共2^14-1个网络地址,每个网络地址共256x256-2个主机地址

其中128.0.*.*不被分配,从128.1.0.0开始分配
 10000000 00000000 ******** ******** 128.0.*.*  不分配
 10000000 00000001 00000000 00000000 128.1.0.0  B类最小分配地址


C类地址 最高位为110,默认子网掩码:255.255.255.0 ,3位网络地址,1位主机地址
 网络地址                                  主机地址    范围
 11000000 00000000 00000000   00000001   192.0.0.1
 11011111 11111111 11111111   11111111   223.255.255.255
 共2^21个网络地址,每个网络地址共254个主机地址


IP地址类别 RFC 1918内部私有地址范围
A类     10.0.0.0 ~ 10.255.255.255
B类   172.16.0.0 ~ 172.31.255.255
C类  192.168.0.0 ~ 192.168.255.255


D类地址 最高位为1110,不区分网络地址和主机地址.
 用于多点播送,称为组播地址(或称多播地址),供特殊协议向选定的节点发送信息时用.
                                                              范围
 11100000 00000000 00000000 00000001   224.0.0.1
 11101111 11111111 11111111 11111111   239.255.255.254

E类地址 保留给将来使用

主机位全0是子网的网络地址,即10.0.0.0是子网的网络地址
主机位全1是子网的广播地址,即10.255.255.255是一个广播地址
所以可连接的主机数都要-2





子网掩码

主要目的是由IP地址获得网络编号,也就是说IP地址和子网掩码相与得到网络编号.

IP地址      192.10.10.6     11000000.00001010.00001010.00000110
子网掩码  255.255.255.0  11111111.11111111.11111111.00000000
AND
-------------------------------------------------------------------
网络编号  192.10.10.0   11000000.00001010.00001010.00000000


类       IP地址范围                     子网掩码
A   1.0.0.0 ~ 126.255.255.255    255.0.0.0
B 128.0.0.0 ~ 191.255.255.255   255.255.0.0
C 192.0.0.0 ~ 223.255.255.255   255.255.255.0



子网划分

子网划分只能划分主机段,而不能划分网络段
划分子网的个数,从主机段的最高位开始,反转n个0->1,则可划分2^(n-1)个子网

C类地址举例:
划分数    网络地址                                主机地址  子网掩码
1个子网 11111111 11111111 11111111  00000000  255.255.255.0
2个子网 11111111 11111111 11111111  10000000  255.255.255.128
4个子网 11111111 11111111 11111111  11000000  255.255.255.192
8个子网 11111111 11111111 11111111  11100000  255.255.255.224


>>将C类地址192.168.20.0分成8个子网的网络编码,广播地址,及可用ip地址

  IP地址    192.168.20. 0     11000000 10101000 00010100 00000000
子网掩码 255.255.255.224  11111111 11111111 11111111 11100000

因为是C类地址,前3部分不提,只说最后一部分,例如 224 表示 192.168.20.224

网络编码  广播地址 及 可用ip地址
0          31            1 ~ 30
32         63           33 ~ 62
64         95           65 ~ 94
96         127          97 ~ 126
128       159         129 ~ 158
160       191         161 ~ 190
192       223         193 ~ 222
224       255         225 ~ 254


子网作用

使用子网是要解决只有一组C类地址但需要数个网络编码的问题,并不是解决IP地址不够用的问题,因为使用子网反而能使用的IP地址会变少,子网通常是使用在跨地域的网络互联之中,两者之间使用路由器连线,同时也上Internet,但只申请到一组C 类IP地址,过路由又需不同的网络,所以此时就必须使用到子网,当然二网络间也可以远程桥接连接,那便没有使用子网的问题.

TCP/IP协议分层

参考链接:
http://baike.baidu.com/view/7649.htm



这里的TCP/IP不是单指TCP 和IP两个协议,而是指网络通讯协议中的所有协议族.

TCP/IP协议分为四层,每一层都呼叫它的下一层所提供的网络来完成自己的需求.

网络接口层
包括OSI分层模式中的物理层和数据链路层.
物理层是定义物理介质的各种特性.
数据链路层是负责接收IP数据包并通过网络发送,或者从网络上接收物理帧,抽出IP数据包,交给IP层。
常见的接口层协议有:Ethernet 802.3、Token Ring 802.5、X.25、Frame relay、HDLC、PPP ATM等.

网络层
处理来自传输层的分组发送请求,收到请求后,将分组装入IP数据报,填充报头,选择去往信宿机的路径,然后将数据报发往适当的网络接口.
处理输入数据报:首先检查其合法性,然后进行寻径--假如该数据报已到达信宿机,则去掉报头,将剩下部分交给适当的传输协议;假如该数据报尚未到达信宿,则转发该数据报.
处理路径、流控、拥塞等问题.
网络层协议包括:IP、ICMP、ARP、RARP
IP   (Internet Protocol) 是网络层的核心,通过路由选择将下一条IP封装后交给接口层。IP数据报是无连接服务.
ICMP (Internet Control Message Protocol) 控制报文协议,是网络层的补充,可以回送报文。用来检测网络是否通畅,Ping命令就是发送ICMP的echo包,通过回送的echo relay进行网络测试
ARP  (Address Resolution Protocol) 地址转换协议,是正向地址解析协议,通过已知的IP,寻找对应主机的MAC地址
RARP (Reverse ARP) 反向地址转换协议,通过MAC地址确定IP地址。比如无盘工作站还有DHCP服务.

传输层
功能:格式化信息流;提供可靠传输
传输层协议规定接收端必须发回确认,并且假如分组丢失,必须重新发送,即耳熟能详的“三次握手”过程,从而提供可靠的数据传输。
传输层协议主要是:TCP、UDP
TCP (Transmission Control Protocol) 传输控制协议,面向连接的通信协议,通过三次握手建立连接,通讯完成时要拆除连接,只能用于点对点的通讯,安全,可靠
UDP (User Datagram protocol) 用户数据报协议,面向无连接的通讯协议,UDP数据包括目的端口号和源端口号信息,由于通讯不需要连接,所以可以实现广播发送。不需要接收方确认,可能会出丢包现象,快捷不可靠.

应用层
包括OSI分层模式中的会话层,表示层,应用层
应用层协议主要是:FTP、TELNET、DNS、SMTP、NFS、HTTP
FTP  (File Transfer Protocol)是文件传输协议,一般上传下载用FTP服务,数据端口是20H,控制端口是21H。
Telnet  服务是用户远程登录服务,使用23H端口,使用明码传送,保密性差、简单方便。
DNS  (Domain Name Service)是域名解析服务,提供域名到IP地址之间的转换,使用端口53。
SMTP (Simple Mail Transfer Protocol)是简单邮件传输协议,用来控制信件的发送、中转,使用端口25。
NFS  (Network File System)是网络文件系统,用于网络中不同主机间的文件共享。
HTTP (Hypertext Transfer Protocol)是超文本传输协议,用于实现互联网中的WWW服务,使用端口80.

2013年5月8日星期三

缺陷严重程度划分



1、Low:不严重的bug
包括软件的实际执行过程与预期结果有较小的差异;
软件不能处理用户可能使用的极端条件下的操作;
界面、程序或帮助文档中文档或文字描述问题,但影响不大;
建议性bug。

此类型bug如果时间紧迫的情况下,可能不会被解决.

2、Medium:一般bug
软件的实际执行过程与预期结果有差异,但不严重;
系统运行过程中偶尔有页面错误;
软件交互性不好,对于用户可能造成难于操作、学习和理解;
在用户经常使用的环境中,界面不美观,影响软件品质;
界面、程序或帮助文档中文档或文字描述问题,造成用户难于理解;
主要界面有明显的错别字或描述错误。

此类bug,要求上线前尽量解决.

3、Hight:表示严重bug
系统的功能点没有实现;
对于主要功能的执行结果与预期结果差别较大,或是计算结果不正确;
程序执行过程过于缓慢;
非正常操作或输入导致系统出错,或执行结果不正确。

此类bug,要求上线前必须解决.

4、Urgent:表示致命bug
测试执行直接导致系统死机、蓝屏、挂起或是程序非法退出;
系统的主要功能点缺失;
主要模块/功能不满足需求或设计上的要求;
软件的安全缺陷导致重要数据丢失或损坏。

此类bug,要求立即解决.

软件测试的各个阶段



1.写测试计划
内容包括测试需要的环境配置,人员配置,其他资源,测试用例的设计,bug的管理方法,bug严重程度的定义,上线标准等.

2.搭建测试环境

3.设计测试用例

4.执行测试

5.记录和管理bug

6.回归测试

7.测试总结和测试报告

8.线上维护测试

监控linux系统性能的常用指令


top 查看cpu使用情况

df  查看磁盘使用情况  常用参数:-h

ps pstree  查看运行中的进程

uptime  开机时长,服务器的平均负载

free 显示动态的内存使用信息,free 只是给你大概的内存信息,而 meminfo(是一个文件) 提供的信息更加详细

netstat 显示跟网络相关的信息,例如 socket 的使用、路由、接口、协议、网络.
  常用参数:
-a Show all socket information
-r Show routing information
-i Show network interface statistics
-s Show network protocol statistics

Wireshark  是一个网络协议检测程序

vmstat  监控虚拟内存

mpstat (MultiProcessor Statistics)实时系统监控工具,报告CPU的统计信息,这些信息存放在/proc/stat文件中

iostat 显示存储子系统的详细信息,通常用它来监控磁盘 I/O 的情况。要特别注意 iostat 统计结果中的 %iowait 值,太大了表明你的系统存储子系统性能低下

tcpdump(简单、可靠的网络监控工具,用来做基本的协议分析,看看那些进程在使用网络以及如何使用网络)

sar 可用来显示 CPU 使用率、内存页数据、网络 I/O 和传输统计、进程创建活动和磁盘设备的活动详情

nmon 监控多个子系统的性能数据,处理器的使用率、内存使用率、队列、磁盘I/O统计、网络I/O统计、内存页处理和进程信息

sar 和 nmon 最大的不同就是 sar 跟适合用作长期的监控,而 nmon 可以让你快速的了解系统当前状态

strace 非常好的诊断工具,例如你可以使用它来找出某个程序正在打开某个配置文件

pmap 报告每个进程占用内存的详细情况,可用来看是否有进程超支了,该命令需要进程 id 作为参数

linux下,用shell对大文件进行排序和去重(设计思路和关键指令)

思路和关键指令:
   split 拆分大文件,sort -u 排序去重,sort -m 合并子文件

详解:
拆分大文件:
split bigFile   -l 按行分割
-b 按大小分割 M K

所有的子文件排序:
sort -u subFileName > subFileName.tmp

合并所有的子文件:
sort -m allSubFileName.tmp -u > resultFileName

sort 参数:
-u  subFileName (unique 排序去重)
-m (merge 合并文件)
-o (output 输出到指定文件)

split 参数:
-a, --suffix-length=N   指定输出文件名的后缀,默认为2个
-b, --bytes=SIZE        指定输出文件的字节数,可跟K M
                                          eg split file -b 10k
-C, --line-bytes=SIZE  每一输出档中,单行的最大 byte 数
-d, --numeric-suffixes 使用数字代替字母做后缀
-l, --lines=NUMBER    指定输出文件的行数

注意:
1:“split:Output file suffixes exhausted”的解决方案:
分割文件时,默认的子文件是以两个字母组合的,当你要分割的大文件过大,即切割的子文件过多时,已经超过26*26个,就会提示以上错误。split在提示我们输出的文件名后缀被用光了。这时加上-a参数即可,表示用几个后缀,默认是2个。
split fileName -l $lines -a 3 "tempfile"
"tempfile"是切割后的子文件名的前缀。

进程间通信的方法


通信目的:
   #数据传输:一个进程需要将它的数据发送给另一个进程,发送的数据量在一个字节到几兆字节之间。
    #共享数据:多个进程想要操作共享数据,一个进程对共享数据的修改,别的进程应该立刻看到。
    #通知事件:一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了某种事件(如进程终止时要通知父进程)。
    #资源共享:多个进程之间共享同样的资源。为了作到这一点,需要内核提供锁和同步机制。
    #进程控制:有些进程希望完全控制另一个进程的执行(如Debug进程),此时控制进程希望能够拦截另一个进程的所有陷入和异常,并能够及时知道它的状态改变。

进程间通信主要包括  管道,  信号  (包括消息队列, 信号量, 共享存储),  套接字  (SOCKET)


管道包括三种:
1)普通管道PIPE: 通常有两种限制,一是半双工,只能单向传输;二是只能在父子或者兄弟进程间使用.
2)流管道s_pipe: 去除了第一种限制,可以双向传输.
3)命名管道name_pipe: 去除了第二种限制,可以在不相关的进程之间进行通讯.


信号( sinal ):操作系统通过信号来通知进程系统中发生了某种预先规定好的事件(一组事件中的一个),它也是用户进程之间通信和同步的一种原始机制.

在一个信号的生命周期中有两个阶段:生成和传送。当一个事件发生时,需要通知一个进程,这时生成一个信号。当进程识别出信号的到来,就采取适当的动作来传送或处理信号。在信号到来和进程对信号进行处理之间,信号在进程上挂起(pending).

内核为进程产生信号,来响应不同的事件,这些事件就是信号源。主要的信号源如下:
    #异常:进程运行过程中出现异常;
    #其它进程:一个进程可以向另一个或一组进程发送信号;
    #终端中断:Ctrl-C,Ctrl-\等;
    #作业控制:前台、后台进程的管理;
    #分配额:CPU超时或文件大小突破限制;
    #通知:通知进程某事件发生,如I/O就绪等;
    #报警:计时器到期。

每一个信号都有一个缺省动作,它是当进程没有给这个信号指定处理程序时,内核对信号的处理。有5种缺省的动作:
    #异常终止(abort):在进程的当前目录下,把进程的地址空间内容、寄存器内容保存到一个叫做core的文件中,而后终止进程。
    #退出(exit):不产生core文件,直接终止进程。
    #忽略(ignore):忽略该信号。
    #停止(stop):挂起该进程。
    #继续(continue):如果进程被挂起,则恢复进程的运行。否则,忽略信号。

信号最初的设计目的主要是用来处理错误,内核把进程运行过程中的异常情况和硬件的信息通过信号通知进程。如果进程没有指定对这些信号的处理程序,则内核处理它们,通常是终止进程。作为一种IPC机制,信号有一些局限:
    #信号的花销太大。发送信号要做系统调用;内核要中断接收进程、要管理它的堆栈、要调用处理程序、要恢复被中断的进程等。
    #信号种类有限,只有31种,而且信号能传递的信息量十分有限。
    #信号没有优先级,也没有次数的概念。
    #信号对于事件通知很有效,但对于复杂的交互操作却难以胜任。

信号量( semophore ) : 信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。

共享内存( shared memory ) :共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号量,配合使用,来实现进程间的同步和通信。

消息队列( message queue ) : 消息队列是消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。


套接字( socket ):所有提供了TCP/IP协议栈的操作系统中几乎都提供了socket,而所有这些操作系统,对套接字的编程方法几乎是完全一样的.


管道与系统IPC之间的优劣比较:

管道: 优点是所有的UNIX都支持, 并且在最后一个访问管道的进程终止后,管道就被完全删除;缺陷是管道只允许单向传输或者用于父子进程之间.

系统IPC: 优点是功能强大,能在毫不相关进程之间进行通讯; 缺陷是关键字KEY_T使用了内核标识,占用了内核资源,并且只能被显式删除,而且不能使用SOCKET的一些机制,例如select,epoll等.



进程间通信各种方式效率比较
类型
无连接
可靠
流控制
记录
消息类型优先级
普通PIPE
N
Y
Y

N
流PIPE
N
Y
Y

N
命名PIPE(FIFO)
N
Y
Y

N
消息队列
N
Y
Y

Y
信号量
N
Y
Y

Y
共享存储
N
Y
Y

Y
UNIX流SOCKET
N
Y
Y

N
UNIX数据包SOCKET
Y
Y
N

N


2013年5月6日星期一

常见的网络安全问题

参考链接:
http://www.searchsecurity.com.cn/showcontent_2430.htm



安全性问题的列表:
  1、跨站脚本攻击(CSS or XSS, Cross Site Scripting)
  2、SQL注入攻击(SQL injection)
  3、远程命令执行(Code execution,个人觉得译成代码执行并不确切)
  4、目录遍历(Directory traversal)
  5、文件包含(File inclusion)
  6、脚本代码暴露(Script source code disclosure)
  7、Http请求头的额外的回车换行符注入(CRLF injection/HTTP response splitting)
  8、跨帧脚本攻击(Cross Frame Scripting)
  9、PHP代码注入(PHP code injection)
  10、XPath injection
  11、Cookie篡改(Cookie manipulation)
  12、URL重定向(URL redirection)
  13、Blind SQL/XPath injection for numeric/String inputs
  14、Google Hacking
     15.防作弊(灌水机,投票机)




几种常见的web安全问题

跨站代码攻击
XSS攻击,最终都离不开3点:其一是浏览器的解析,其二是脚本语法,其三是脚本需要一定的长度。
对于浏览器的解析是不在话下了,我不能因为这各类型问题的存在就改写浏览器使其不支持脚本解析。
所以,能做就是控制脚本注入的语法要素。比如:javascript离不开:“<”、“>”、“(”、“)”、“;”...等等,所以我们只需要在输入或输出时对其进行字符过滤或转义处理就可以了。
一般我们会采用转义的方式来处理,转义字符是会使用到HTML的原始码(Web工作原理中会介绍),因为原始码是可以被浏览器直接识别的,所以使用起来非常方便。
允许可输入的字符串长度限制也可以一定程度上控制脚本注入。比如:页面表单中姓名,我可以只允许你输入5个字符,请问你还有办法进行Javascript的脚本注入吗?显然不行了。
还需要注意的是:我这里所述的过滤、检测、限制等等策略,一定一定要在Web Server那一端去完成,而不是使用客户端的Javascript或者VBScript去做简单的检查。因为真正的攻击者不会仅仅依赖于浏览器去做攻击,而更多的往往是借助于第三方工具,根本就可以绕过你精心设计制作的客户端Javascript进行过滤、检测或限制手段的。

sql注入
早在十几年前,基于数据库的Web应用刚刚盛行的时候,几乎所有的开发商都忽略了SQL注入弱点,导致当时绝大多数的网站的登录入口形同虚设!为什么呢?先给一个小小的例子,假如以下SQL代码是用来在网站登录入口入执行用户验证时的查询代码:
        SELECT count(*)
        FROM users_list_table
        WHERE username='USERNAME'
        AND password='PASSWORD'
        以上的USERNAME就是我们登录时提供的用户名,PASSWORD就是我们登录时提供的密码。当用户输入正确的用户名和密码时,这条语句的执行结果将为真(True),否则为假(False),当然为真时我们就认为认证通过,为假时就认为认证失败,即非法登录。试想一下,如果我在输入用户名和密码的时候输入如下的内容:
        用户名:a' or 'a'='a
        密码:a' or 'a'='a  
        用代入法把用户名和密码输入值代入到上述的SQL脚本里结果如下:
        SELECT count(*)
        FROM users
        WHERE username='a' or 'a'='a'
        AND password='a' or 'a'='a'
        相信稍懂一点儿SQL语句的人都知道,这条语句的执行结果就永远是真了!此时你不需要有帐号,就直接登录成功了!你对此漏洞理解的深度同样取决于你的对SQL语句的技能和web安全知识能力。一个具有良好技能的攻击者可能利用此漏洞获取后台DB的结构并逐步获取DB的信息。
        总结一下:SQL注入的弱点存在是基于数据库的Web应用,黑客利用精心组织的SQL语句,通过Web接口(通常指我们的Web页面的表单)注入的Web应用中,从而获取后台DB的访问与存取权的一种安全弱点。
解决办法:过滤、合法性检查和长度限制等通用方法.主要限制分号(;),引号(" '),tab键等防止查询语句被中断.

远程命令执行
远程命令执行漏洞一般发生在Web系统允许用户通过Web应用接口访问与管理Web服务器且没有经过严格的输入验证与过滤的情况下的一种Web应用安全漏洞。
简要的解决方案:
  1、严格限制运行Web服务的用户权限。就是说你的Web应用可以访问你的服务器系统的用户权限。一般情况一下,我们应该以白名单的形式介定Web应用可以访问服务器系统的权限。这样控制可以从系统级达到安全防范的效果。
  2、严格执行用户输入的合法性检查。注意这里的输入不一定是你通过表单从键盘输入,往往是Web应用已经内定了某一些操作供您选择,而此时你可以通过Http抓包的方式获取Http请求信息包经改装后重新发送。详细理解这一部分,请关注我后续将来介绍的《Web工作原理》部分的Http协议原理。

目录遍历
love.ah163.net上有网络硬盘服务,当注册用户登录并开通网络硬盘服务后,即可进入自己的硬盘管理界面,我们来看看它是如何进入某一个目录的,以下是进入某一目录的URL:
  http://love.ah163.net/Personal_Spaces_List.php?dir=MyFolder
        那现在我把这个URL改装一下:
        http://love.ah163.net/Personal_Spaces_List.php?dir=../../../../../../../../../../../../../usr/local/apache/conf/
        在浏览器里运行它,会是什么结果呢?结果是:/usr/local/apache/conf/里的所有文件都老老实实的列出来了,通过这种方式,你可以发挥你的想象了,服务器上的东东是不是都差不多可以列出来了?告诉你,还可以随便下载呢!网络硬盘嘛,就是用来上传下载的,所以它提供的功能很完备,破坏性也就很强了。至于它的危害有多大,你自己想去吧,我就不危言耸听了。
  简要的解决方案:
  1、同样是限制Web应用在服务器上的运行 
  2、进行严格的输入验证,控制用户输入非法路径



防作弊(博主添加)
    投票机,论坛上的灌水机,很多人都见过,这种机器人发帖刷屏,发帖频率高,数据量大,无时间节制,除了严重影响正常访问的用户体验,还严重影响到数据库,无效数据可能很庞大,浪费资源.
    解决办法:
    1.限制发帖间隔时间
    2.增加发帖验证码

OSI七层网络协议


OSI网络协议,一共七层:
第一层  物理层,关心的是接口,信号,和介质,只是说明标准,如EIA-232接口,以太网,fddi令牌环网
(类似快递公司,公司规模,快递人员数量,车辆数等硬件)

第二层  数据链路层:一类是局域网中数据连路层协议:MAC子层协议,有LLC子层协议.另一类是广域网的协议如:HDLC,PPP,SLIP.
(类似快递公司,提供的服务,如点到点的送达时长,收费,丢包服务,损坏赔偿服务等软件)

第三层  网络层:主要是IP协议.网络层的核心功能便是根据这些地址来获得从源到目的的路径,当有多条路径存在的情况下,还要负责进行路由选择.
(类似快递上门取货,打包和填单(收发人的地址),关注点到点,门牌号到门牌号,因为软硬件已知,选定一个快递公司,就相当于选定了送货路线)

第四层  传输层:主要是面向连接的TCP传输控制协议.另一个是不面向连接的UDP用户数据报协议.
(类似快递公司内部中转快递包,关注端到端,城市到城市)

第五层  会话层:在网络实体间建立、管理和终止通讯应用服务请求和响应等会话.
(类似快递送货上门,签收)

第六层  表示层:主要是编码,如ASCⅡ,表示图象的GIF,表示动画的MPEG等.
(类似收件人拆封包裹,然后看到包裹里具体物品)

第七层  应用层:就是应用程序里面的,文件传输协议FTP、电子邮件传输协议SMTP、域名系统服务DNS、网络新闻传输协议NNTP和HTTP协议等。
(类似收件人开始使用包裹中的物品)

    在数据的实际传输中,发送方将数据送到自己的应用层,加上该层的控制信息后传给表示层;表示层如法炮制,再将数据加上自己的标识传给会话层;以此类推,每一层都在收到的数据上加上本层的控制信息并传给下一层;最后到达物理层时,数据通过实际的物理媒体传到接收方.接收端则执行与发送端相反的操作,由下往上,将逐层标识去掉,重新还原成最初的数据.由此可见,数据通讯双方在对等层必须采用相同的协议,定义同一种数据标识格式,这样才可能保证数据的正确传输而不至走形.


各层协议的快递比方不一定准确,请自行判断理解.

2013年5月1日星期三

session学习笔记

<?php
 
    
require_once("dog.php");  //引入一个dog类

    
//------------初始化session----------
    //======!!!=====读写之前都要初始化=====!!!===
    
session_start();
 



    
//-----------保存session--------------

    //session支持的数据类型:
    //integer:i, string:s, array:a, object:o, bool:b, double:d
    //字符串
    
$_SESSION["name"]="cxz";
    
$_SESSION["favorite"]="food";

    
//数组
    
$arr=array("北京","ctu",10);
    
$_SESSION["arr"]=$arr;

    
//bool
    
$_SESSION["isgirl"]="true";

    
//整数
    
$_SESSION["age"]="31";

    
//对象
    
$dog=new dog("maomao",1,"爱哭爱闹活泼乱跳");
    
$_SESSION["dog"]=$dog;

 
    echo 
"save successful";




    
//----------读取session-------------

    
echo "<pre>";
    
print_r($_SESSION);
    echo 
"<pre>"
 
    
$name=$_SESSION["name"];
    
$age=$_SESSION["age"];
    
$isgirl=$_SESSION["isgirl"];
    
$favorite=$_SESSION["favorite"];
    echo 
"$name--$age--$isgirl--$favorite";

    
//读取数组
    
$arr=$_SESSION["arr"];
    foreach(
$arr as $k=>$v){
        echo 
"<br/>--".$v ;
    }

    
//读取对象
    //对象在保存时,类的信息会丢失,所以在读取的时候,需要重新定义类
    
$maomao=$_SESSION["dog"];
    echo 
"<br/>".$maomao->name;
    
$maomao->shout();




    
//-----------更新session-------------

    //更新就是重新保存
    
$_SESSION["name"]="秀秀";
    echo 
"<br/><br/><br/>-----update successful--------<br/>";
    echo 
$_SESSION["name"];





    
//-------------删除session---------------
    
    

    
//删除一个值
    
unset($_SESSION["favorite"]);    
    echo "<br/><br/><br/>------delete successful----<br/>";

    echo 
"<pre>";
    
print_r($_SESSION);
    echo 
"<pre>"


    
//删除所有session
    //session_destroy(); //这个在我的版本中不生效

    
session_unset();
 
    echo 
"<br/><br/><br/>------delete successful----<br/>";
    echo 
"<pre>";
    
print_r($_SESSION);
    echo 
"<pre>"

?>