关于 十月, 2007 的文章

突如其来的一个想法

相信很多人都有这样的困惑:
“我还是个新手,因为工作和学习中遇到了技术上的困惑,需要查找资料来弥补。
于是,百度、Google ……,ChinaUnix、CSDN ……;
            急、高手帮帮忙、在线等、给我你的QQ/MSN ……;
结果呢,查找到的文档太多,太杂,太散甚至太乱,转载的人太多,文档不适用、不全、错误多,论坛里久久等不到高手来援,要QQ/MSN也没那么容易 …… ”
 
我同样还是个新手,到目前为止工作1年半,我想制作一些电子书来解决自己如上面的那些烦恼。
 
做书时,我会始终明确几点:
电子书尽量做成CHM的帮助文档格式,不是自己的创造一定要说明版权,是自己的创造一定要指明参考文献,所有的文档名皆加入时间以区分版本,文档尽量做成中英文相对照,文档尽量做到简朴并易于阅读,所有的文档首页要感谢并献给自己身边可爱的人;
努力成长并明白自己还属菜鸟,做书的目的是为了更好的学习,给自己方便并共享出来予以大家的方便,尽量吸引大家来一同完善这一份文档并在文档中记录所有参与文档修正的朋友名字(ID),有更优秀的其他作者的文档一定推荐并加以借鉴和参考。
 
我的开门电子书项目:DOS命令全集(中英文对照)v200712XX 与 Linux命令全集(中英文对照)v200712XX;
我将会努力在今年之前完成它,而这两本书将分别送给我的虹儿和我的妈妈,并及时的发布到互联网与大家共享。

,

No Comments

DOS下常用的12个网络相关命令解释 (华为内部参考文档)

注:该文档为网络上共享的华为内部参考文档。
 
DOS下常用网络相关命令解释
 
第一章引言
1. 概述
在我们的工作之中经常要和网络打交道而win95/98或是NT又是较常用的操作系统在使用这些操作系统过程中使用频率最高也最容易获得的工具就是DOS虚拟机中自带的DOS下的常用网络相关命令。
由于目前DOS下的常用网络相关命令大家使用的不多而DOS下的网络命令又相当的丰富有些命令虽然常用但大家对其参数却不甚了了因此我想通过本文作一归纳使大家对这一常用的工具有所了解。
本文共对DOS下12条命令及其参数进行了详细的介绍希望这份命令手册式的文档能够对大家有用。
2. 命令行格式说明
本文命令行表达式中[ ] 中的表示参数可选。
 
第二章 DOS下网络命令介绍
1. Arp
显示和修改地址解析协议(ARP) 所使用的到以太网的 IP 或令牌环物理地址翻译表该命令只有在安装了 TCP/IP 协议之后才可用
arp -a [inet_addr] [-N [if_addr]]
arp -d inet_addr [if_addr]
arp -s inet_addr ether_addr [if_addr]
参数
-a
通过询问 TCP/IP 显示当前 ARP 项如果指定了 inet_addr 则只显示指定计算机的IP 和物理地址
-g
与 -a 相同
inet_addr
以加点的十进制标记指定 IP 地址
-N
显示由 if_addr 指定的网络界面 ARP 项
if_addr
指定需要修改其地址转换表接口的 IP 地址如果有的话如果不存在将使用第一个可适用的接口
-d
删除由 inet_addr 指定的项
-s
在 ARP 缓存中添加项将 IP 地址 inet_addr 和物理地址 ether_addr 关联物理地址由以连字符分隔的 6 个十六进制字节给定使用带点的十进制标记指定 IP 地址项是永久性的即在超时到期后项自动从缓存删除
ether_addr
指定物理地址
2. Finger
在运行 Finger 服务的指定系统上显示有关用户的信息根据远程系统输出不同的变量该命令只有在安装了 TCP/IP 协议之后才可用
finger [-l] [user]@computer[...]
参数
-l
以长列表格式显示信息
user
指定要获得相关信息的用户省略用户参数以显示指定计算机上所有用户的信息
@computer
3. Ftp
将文件传送到正在运行 FTP 服务的远程计算机或从正在运行 FTP 服务的远程计算机传送文件有时称作 daemon Ftp 可以交互使用单击相关主题列表中的
ftp 命令以获得可用的ftp 子命令描述该命令只有在安装了 TCP/IP 协议之后才可用Ftp 是一种服务一旦启动将创建在其中可以使用 ftp 命令的子环境通过键入 quit 子命令可以从子环境返回到 Windows 2000 命令提示符当 ftp 子环境运行时它由 ftp 命令提示符代表
ftp [-v] [-n] [-i] [-d] [-g] [-s:filename] [-a] [-w:windowsize] [computer]
参数
-v
禁止显示远程服务器响应
-n
禁止自动登录到初始连接
-i
多个文件传送时关闭交互提示
-d
启用调试显示在客户端和服务器之间传递的所有 ftp 命令
-g
禁用文件名组它允许在本地文件和路径名中使用通配符字符* 和 ? 请参阅联机命令参考中的 glob 命令
-s: filename
指定包含 ftp 命令的文本文件当 ftp 启动后这些命令将自动运行该参数中不允许有空格使用该开关而不是重定向 (>)
-a
在捆绑数据连接时使用任何本地接口
-w:windowsize
替代默认大小为 4096 的传送缓冲区
computer
指定要连接到远程计算机的计算机名或 IP 地址如果指定计算机必须是行的最后一个参数
4. Nbtstat
该诊断命令使用 NBT TCP/IP 上的 NetBIOS 显示协议统计和当前 TCP/IP 连接该命令只有在安装了 TCP/IP 协议之后才可用
nbtstat [-a remotename] [-A IP address] [-c] [-n] [-R] [-r] [-S] [-s] [interval]
参数
-a remotename
使用远程计算机的名称列出其名称表
-A IP address
使用远程计算机的 IP 地址并列出名称表
-c
给定每个名称的 IP 地址并列出 NetBIOS 名称缓存的内容
-n
列出本地 NetBIOS 名称已注册表明该名称已被广播 (Bnode) 或者 WINS 其他节点类型注册
-R
清除 NetBIOS 名称缓存中的所有名称后重新装入 Lmhosts 文件
-r
列出 Windows 网络名称解析的名称解析统计在配置使用 WINS 的 Windows 2000计算机上此选项返回要通过广播或 WINS 来解析和注册的名称数
-S
显示客户端和服务器会话只通过 IP 地址列出远程计算机
-s
显示客户端和服务器会话尝试将远程计算机 IP 地址转换成使用主机文件的名称
interval
重新显示选中的统计在每个显示之间暂停 interval 秒按 CTRL+C 停止重新显示统计信息如果省略该参数nbtstat 打印一次当前的配置信息
5. Netstat
显示协议统计和当前的 TCP/IP 网络连接该命令只有在安装了 TCP/IP 协议后才可以使用
netstat [-a] [-e] [-n] [-s] [-p protocol] [-r] [interval]
参数
-a
显示所有连接和侦听端口服务器连接通常不显示
-e
显示以太网统计该参数可以与 -s 选项结合使用
-n
以数字格式显示地址和端口号而不是尝试查找名称
-s
显示每个协议的统计默认情况下显示 TCP UDP ICMP 和 IP 的统计-p 选项可以用来指定默认的子集
-p protocol
显示由 protocol 指定的协议的连接protocol 可以是 tcp 或 udp 如果与 -s 选项一同使用显示每个协议的统计protocol 可以是 tcp udp icmp 或 ip
-r
显示路由表的内容
interval
重新显示所选的统计在每次显示之间暂停 interval 秒按 CTRL+B 停止重新显示统计如果省略该参数netstat 将打印一次当前的配置信息
6. Ping
验证与远程计算机的连接该命令只有在安装了 TCP/IP 协议后才可以使用
ping [-t] [-a] [-n count] [-l length] [-f] [-i ttl] [-v tos] [-r count] [-s count] [[-j computer-list] |
[-k computer-list]] [-w timeout] destination-list
参数
-t
Ping 指定的计算机直到中断
-a
将地址解析为计算机名
-n count
发送 count 指定的 ECHO 数据包数默认值为 4
-l length
发送包含由 length 指定的数据量的 ECHO 数据包默认为 32 字节最大值是65,527
-f
在数据包中发送不要分段标志数据包就不会被路由上的网关分段
-i ttl
将生存时间字段设置为 ttl 指定的值
-v tos
将服务类型字段设置为 tos 指定的值
-r count
在记录路由字段中记录传出和返回数据包的路由count 可以指定最少 1 台
最多 9 台计算机
-s count
指定 count 指定的跃点数的时间戳
-j computer-list
利用 computer-list 指定的计算机列表路由数据包连续计算机可以被中间网关分隔路由稀疏源IP 允许的最大数量为 9
-k computer-list
利用 computer-list 指定的计算机列表路由数据包连续计算机不能被中间网关分隔路由严格源IP 允许的最大数量为 9
-w timeout
指定超时间隔单位为毫秒
destination-list
指定要 ping 的远程计算机
7. Rcp
在 Windows 2000 计算机和运行远程外壳端口监控程序 rshd 的系统之间复制文件rcp 命令是一个连接命令从 Windows 2000 计算机发出该命令时也可以用于其他传输在两台运行 rshd 的计算机之间复制文件rshd 端口监控程序可以在 UNIX 计算机上使用而在 Windows 2000 上不能使用所以 Windows 2000 计算机仅可以作为发出命令的系统参与远程计算机必须也通过运行 rshd 提供 rcp 实用程序
rcp [-a | -b] [-h] [-r] source1 source2 ... sourceN destination
参数
-a
指定 ASCII 传输模式此模式在传出文件上将回车/换行符转换为回车符在传入文件中将换行符转换为回车/换行符该模式为默认的传输模式
-b
指定二进制图像传输模式没有执行回车/换行符转换
-h
传输 Windows 2000 计算机上标记为隐藏属性的源文件如果没有该选项在 rcp 命令行上指定隐藏文件的效果与文件不存在一样
-r
将源的所有子目录内容递归复制到目标source 和 destination 都必须是目录虽然即使源不是目录使用 -r 也能够工作但将没有递归
source 和 destination
格式必须为 [computer[.user]:]filename 如果忽略了 [computer[.user]:] 部分计算机将假定为本地计算机如果省略了 [.user] 部分将使用当前登录的 Windows 2000 用户名如果使用了完全合格的计算机名其中包含句点 (.) 分隔符则必须包含[.user] 否则计算机名的最后部分将解释为用户名如果指定了多个源文件则destination 必须是目录。
如果文件名不是以 UNIX 的正斜杠 (/) 或 Windows 2000 系统的反斜杠 (\) 打头则假定相对于当前的工作目录在Windows 2000 中这是发出命令的目录在远程系统中这是远程用户的登录目录句点 (.) 表示当前的目录在远程路径中使用转义字符\ " 或 ' 以便在远程计算机中使用通配符。
8. Rexec
在运行 REXEC 服务的远程计算机上运行命令rexec 命令在执行指定命令前验证远程计算机上的用户名只有安装了TCP/IP 协议后才可以使用该命令。
rexec computer [-l username] [-n] command
参数
computer
指定要运行 command 的远程计算机
-l username
指定远程计算机上的用户名
-n
将 rexec 的输入重定向到 NULL
command
指定要运行的命令
9. Route
控制网络路由表该命令只有在安装了 TCP/IP 协议后才可以使用
route [-f] [-p] [command [destination] [mask subnetmask] [gateway] [metric costmetric]]
参数
-f
清除所有网关入口的路由表如果该参数与某个命令组合使用路由表将在运行命令前清除
-p
该参数与 add 命令一起使用时将使路由在系统引导程序之间持久存在默认情况下系统重新启动时不保留路由与 print 命令一起使用时显示已注册的持久路由列表忽略其他所有总是影响相应持久路由的命令
command
指定下列的一个命令
命令目的
print 打印路由
add 添加路由
delete 删除路由
change 更改现存路由
destination
指定发送 command 的计算机
mask subnetmask
指定与该路由条目关联的子网掩码如果没有指定将使用 255.255.255.255
gateway
指定网关
名为 Networks 的网络数据库文件和名为 Hosts 的计算机名数据库文件中均引用全部destination 或 gateway 使用的符号名称如果命令是 print 或 delete 目标和网关还可以使用通配符也可以省略网关参数
metric costmetric
指派整数跃点数从 1 到 9999 在计算最快速最可靠和或最便宜的路由时使

10. Rsh
在运行 RSH 服务的远程计算机上运行命令该命令只有在安装了 TCP/IP 协议后才可以使用
rsh computer [-l username] [-n] command
参数
computer
指定运行 command 的远程计算机
-l username
指定远程计算机上使用的用户名如果省略则使用登录的用户名
-n
将 rsh 的输入重定向到 NULL
command
指定要运行的命令
11. Tftp
将文件传输到正在运行 TFTP 服务的远程计算机或从正在运行 TFTP 服务的远程计算机传输文件该命令只有在安装了 TCP/IP 协议后才可以使用
tftp [-i] computer [get | put] source [destination]
参数
-i
指定二进制图像传送模式也称为八位字节在二进制图像模式中文件一个字节接一个字节地逐字移动在传送二进制文件时使用该模式如果省略了 -i 文件将以 ASCII 模式传送这是默认的传送模式此模式将 EOL字符转换为 UNIX 的回车符和个人计算机的回车符/换行符在传送文本文件时应使用此模式如果文件传送成功将显示数据传输率
computer
指定本地或远程计算机
put
将本地计算机上的文件 destination 传送到远程计算机上的文件 source
get
将远程计算机上的文件 destination 传送到本地计算机上的文件 source如果将本地计算机上的文件 file-two 传送到远程计算机上的文件 file-one 请指定put 如果将远程计算机上的文件 file-two 传送到远程计算机上的文件 file-one 请指定 get因为 tftp 协议不支持用户身份验证所以用户必须登录并且文件在远程计算机上必须可以写入
source
指定要传送的文件如果本地文件指定为 - 则远程文件在 stdout 上打印出来如果获取或从 stdin 如果放置读取
destination
指定将文件传送到的位置如果省略了 destination 将假定与 source 同名
12. Tracert
该诊断实用程序将包含不同生存时间 (TTL) 值的 Internet 控制消息协议 (ICMP) 回显数据包发送到目标以决定到达目标采用的路由要在转发数据包上的 TTL 之前至少递减 1 必需路径上的每个路由器所以 TTL 是有效的跃点计数数据包上的TTL 到达 0 时路由器应该将ICMP 已超时的消息发送回源系统Tracert 先发送 TTL 为 1 的回显数据包,并在随后的每次发送过程将 TTL 递增 1 直到目标响应或 TTL 达到最大值从而确定路由路由通过检查中级路由器发送回的ICMP 已超时的消息来确定路由不过有些路由器悄悄地下传包含过期 TTL 值的数据包而 tracert 看不到
tracert [-d] [-h maximum_hops] [-j computer-list] [-w timeout] target_name
参数
/d
指定不将地址解析为计算机名
-h maximum_hops
指定搜索目标的最大跃点数
-j computer-list
指定沿 computer-list 的稀疏源路由
-w timeout
每次应答等待 timeout 指定的微秒数
target_name
目标计算机的名称

No Comments

通过IP欺骗进行攻击的原理和预防

原文:
首发于黑客防线2003年11期
WriteBy: LionD8
email: LionD8@126.com
Wesite:   http://liond8.126.com
 
通过IP欺骗进行攻击的原理和预防
本文的目的在于向读者解释IP 欺骗的实现方法和预防措施。它要求您掌握有关Unix 和TCP/IP 的少量知识。如果您没有,也没有关系,相信下面的说明能给您以足够的背景知识。

IP欺骗是适用于TCP/IP环境的一种复杂的技术攻击,它由若干部分组成。目前,在Internet领域中,它成为黑客攻击时采用的一种重要手段,因此有必要充分了解它的工作原理和防范措施,以充分保护自己的合法权益。

实际上,IP 欺骗不是进攻的结果,而是进攻的手段。进攻实际上是信任关系的破坏。然而,在本文中,IP 欺骗将被看作是涉及到的整个攻击,对于利用IP欺骗建立起来的虚假信任关系进行破坏的其它行为不作为我们讨论的内容。本文将详尽地解释攻击的全过程,包括有关的操作系统与网络信息。

背景知识
有关主机定义
A:目标主机
B:对于A来说,可信任的主机
X:不能到达的主机
Z:进攻主机

1(2):主机1化装成主机2
图示符号定义
本文中有若干图示,它们将类比以下示例进行解释:
时间序列主机a 控制主机b
1 A --SYN --> B
时间序列:时间流逝的单位,可以无穷细化。一般认为是很小的单位,表示事件发生的先后顺序。
主机a:参与一次TCP 对话的机器。
控制:显示有关TCP控制字段头部的控制字符和该字段的流动方向。
主机b:参与一次TCP 对话的机器。
这个图示中,在第一参考时间点上主机A发送TCP 字段给主机B,控制字段中的SYN控制位将作为该TCP字段的主要信息。除非特别说明,我们一般不关心TCP 字段中的数据部分。
信任关系
在Unix 领域中,信任关系能够很容易得到。假如您在主机A和B上各有一个帐户,您在使用当中发现,在主机A上使用时需要输入在A上的相应帐户,在主机B上使用时必须输入在B上的帐户,主机A和B把您当作两个互不相关的用户,显然有些不便。为了减少这种不便,您可以在主机A和主机B中建立起两个帐户的相互信任关系。在主机A和主机B上您的home目录中创建.rhosts 文件。从主机A上,在您的home目录中输入'echo " B username " >~/.rhosts' ;从主机B上,在您的home目录中输入'echo " A username " >~/.rhosts' 。至此,您能毫无阻碍地使用任何以r*开头的远程调用命令,如:rlogin,rcall,rsh等,而无口令验证的烦恼。这些命令将允许以地址为基础的验证,或者允许或者拒绝以IP地址为基础的存取服务。

Rlogin
Rlogin 是一个简单的客户/服务器程序,它利用TCP传输。Rlogin 允许用户从一台主机登录到另一台主机上,并且,如果目标主机信任它,Rlogin 将允许在不应答口令的情况下使用目标主机上的资源。安全验证完全是基于源主机的IP 地址。因此,根据以上所举的例子,我们能利用Rlogin 来从B远程登录到A,而且不会被提示输入口令。

Internet协议(IP)
IP 是TCP/IP协议组中非面向连接、非可靠传输的网络协议。它由两个32bit的头字段提供地址信息。IP数据包占TCP/IP协议网络流量中的很大部分,可以说是最为繁忙的部分。IP 的工作在于在网络环境中发送数据包,它不提供保证可靠性的任何机制,对于可靠性的要求,由上层协议来完成。IP只是发送数据包,并且保证它的完整性。如果不能收到完整的IP数据包,IP会向源地址发送一个ICMP 错误信息,希望重新处理。然而这个包也可能丢失(ICMP 是网际控制消息协议,Internet Control Message Protocol,它是用于根据网络条件保证数据传送的协议,主要是向IP层或其它层发送不同的错误信息)。由于IP是非面向连接的,所以不保持任何连接状态的信息。每个IP数据包被松散地发送出去,而不关心前一个和后一个数据包的情况。由此我们不难看出,可以对IP堆栈进行修改,在源地址和目的地址中放入任意满足要求的IP地址,也就是说,提供虚假的IP地址。

传输控制协议(TCP)
TCP 是在TCP/IP协议组中面向连接、提供可靠传输的协议。面向连接意味着参与对话的两个主机必须首先建立起连接,然后才能进行数据交换。可靠性是由数据包中的多位控制字来提供的,但是,其中仅仅有两个是与我们的讨论有关。它们是数据序列和数据确认,分别用SYN和ACK来表示。TCP 向每一个数据字节分配一个序列号,并且可以向已成功接收的、源地址所发送的数据包表示确认(目的地址ACK 所确认的数据包序列是源地址的数据包序列,而不是自己发送的数据包序列)。ACK在确认的同时,还携带了下一个期望获得的数据序列号。显然,TCP提供的这种可靠性相对于IP来说更难于愚弄。

序列编号、确认和其它标志信息
由于TCP是基于可靠性的,它能够提供处理数据包丢失,重复或是顺序紊乱等不良情况的机制。实际上,通过向所传送出的所有字节分配序列编号,并且期待接收端对发送端所发出的数据提供收讫确认,TCP 就能保证可靠的传送。接收端利用序列号确保数据的先后顺序,除去重复的数据包。TCP 序列编号可以看作是32位的计数器。它们从0至232-1 排列。每一个TCP连接(由一定的标示位来表示)交换的数据都是顺序编号的。在TCP数据包中定义序列号(SYN)的标示位位于数据段的前端。确认位(ACK)对所接收的数据进行确认,并且指出下一个期待接收的数据序列号。
TCP通过滑动窗口的概念来进行流量控制。设想在发送端发送数据的速度很快而接收端接收速度却很慢的情况下,为了保证数据不丢失,显然需要进行流量控制,协调好通信双方的工作节奏。所谓滑动窗口,可以理解成接收端所能提供的缓冲区大小。TCP利用一个滑动的窗口来告诉发送端对它所发送的数据能提供多大的缓冲区。由于窗口由16位BIT所定义,所以接收端TCP 能最大提供65535个字节的缓冲。由此,可以利用窗口大小和第一个数据的序列号计算出最大可接收的数据序列号。
其它TCP标示位有RST(连接复位,Reset the connection)、PSH(压入功能,Push function)和FIN (发送者无数据,No more data from sender)。如果RST 被接收,TCP连接将立即断开。RST 通常在接收端接收到一个与当前连接不相关的数据包时被发送。有些时候,TCP模块需要立即传送数据而不能等整段都充满时再传。一个高层的进程将会触发在TCP头部的PSH标示,并且告诉TCP模块立即将所有排列好的数据发给数据接收端。FIN 表示一个应用连接结束。当接收端接收到FIN时,确认它,认为将接收不到任何数据了。

TCP连接的建立
为了利用TCP 连接交换数据,主机间首先必须建立一个连接。TCP 建立连接时可以分为3个步骤,称为三步握手法。如果主机A运行rlogin客户程序,并且希望连接到主机B上的 rlogin daemon服务器程序上,连接过程如图1所示。
1 A ---SYN---> B
2 A <--SYN/ACK-- B
3 A ---ACK---> B   图1
需要提醒读者的是,主机A和B的TCP模块分别使用自己的序列编号。在时刻1时,客户端通过设置标志位SYN=1告诉服务器它需要建立连接。同时,客户端在其TCP头中的序列号领域SEQ放置了它的初始序列号(ISN),并且告诉服务器序列号标示域是有效的,应该被检查。在时刻2时,服务器端在接收了上面的SYN后,作出的反应是将自己的ISN 和对客户端的ACK发向客户端并且告知下一个期待获得的数据序列号是(ISN+1)。客户端在第3时刻,对服务器的ISN进行确认。这时,数据传输就可以进行了。

ISN与序列号的递增
了解序数编号如何选择初始序列号和如何根据时间变化是很重要的。似乎应该有这种情况,当主机启动后序列编号初始化为1,但实际上并非如此。初始序列号是由tcp_init函数确定的。ISN每秒增加128000,如果有连接出现,每次连接将把计数器的数值增加64000。很显然,这使得用于表示ISN的32位计数器在没有连接的情况下每9.32 小时复位一次。之所以这样,是因为这样有利于最大限度地减少旧有连接的信息干扰当前连接的机会。这里运用了2MSL 等待时间的概念(不在本文讨论的范围之内)。如果初始序列号是随意选择的,那么不能保证现有序列号是不同于先前的。假设有这样一种情况,在一个路由回路中的数据包最终跳出了循环,回到了“旧有”的连接(此时其实是不同于前者的现有连接),显然会发生对现有连接的干扰。

端口号
为了提供对TCP 模块的并行访问,TCP 提供了叫做端口的用户接口。端口被操作系统内核利用来标示不同的网络进程,也就是严格区分传输层入口的标示(就是说,IP 不关心他们的存在)。TCP端口与IP 地址一起提供网络端到端的通信。事实上,在任何时刻任何Internet连接都能由4个要素来描述:源IP 地址、源地址端口号、目的IP 地址和目的地址端口号。服务器程序一般被绑定在标准的端口号上。例如, rlogin daemon被绑定在TCP 513端口。

IP欺骗
IP欺骗由若干步骤组成,这里先简要地描述一下,随后再做详尽地解释。先做以下假定:首先,目标主机已经选定。其次,信任模式已被发现,并找到了一个被目标主机信任的主机。黑客为了进行IP欺骗,进行以下工作:使得被信任的主机丧失工作能力,同时采样目标主机发出的TCP 序列号,猜测出它的数据序列号。然后,伪装成被信任的主机,同时建立起与目标主机基于地址验证的应用连接。如果成功,黑客可以使用一种简单的命令放置一个系统后门,以进行非授权操作。

IP欺骗是一种不光彩的进攻
一个经常被忽略,但却是非常关键的事实就是IP欺骗是不光彩的进攻。进攻者将取代真正被信任的主机,从而破坏目标主机的安全体系。黑客常常利用如下所描述的方法使得真正被信任的主机丧失工作能力。安全防范程度不高的主机在它正在和一个可以信赖的主机通信时,处于Internet某个阴暗角落的一个攻击者实际上是可以使真正被信任的主机处于停顿状态,而自己大量模仿它的数据包,将之发向目标主机。可悲的是目标主机全然没有感觉。由攻击者模仿的TCP数据包到达了目标地址,而由目标地址发往真正被信任主机的TCP数据包却永远到达不了攻击者的主机(两者的真实IP地址不同)。当然,一旦目标地址发送的TCP数据包到达了真正被信任的主机时,信息虽然进入协议堆栈,到达TCP处理模块,但是会被取消。所以,攻击者需要知道目标主机发送了什么,期待什么样的反应。攻击者虽然不能看到目标主机发送的内容,但是它能预料到将发送的内容。围绕着这些内容,攻击者将展开它不光彩的进攻。

信任模式
在选择好进攻目标后,黑客需要确定该主机的信任模式。为了讨论起见,我们假设目标主机确实信任某个主机。找出某个主机信任谁或不信任谁是不容易的。 ′showmount
  你也许想了解以下主题:ip欺骗攻击,ip攻击原理,如何利用ip进行攻击,如何进行ip攻击,arp欺骗原理,dns欺骗原理,ip欺骗,ip地址欺骗,ip欺骗工具,什么是ip欺骗,ip欺骗软件,如何防范ip欺骗,ip欺骗定义,ip欺骗防范,ip欺骗的防范,防止ip欺骗,什么叫ip欺骗,ip欺骗病毒,防ip欺骗工具,ip欺骗如何防备。

No Comments

必备资料之103个Windows运行命令

 

原贴地址:http://www.pconline.com.cn/pcjob/system/microsoft/article/0605/797736.html
 
辅助功能选项   access.cpl
添加硬件向导   hdwwiz.cpl
添加或删除程序       appwiz.cpl
管理工具 control admintools
自动更新 wuaucpl.cpl
Bluetooth文件传送向导   fsquirt
计算器     calc
证书管理控制台       certmgr.msc
字符映射表      charmap
磁盘检查工具   chkdsk
剪贴簿查看器   clipbrd
命令行提示符   cmd
组件服务 dcomcnfg
计算机管理      compmgmt.msc
日期和时间属性       timedate.cpl
DDE共享 ddeshare
设备管理器      devmgmt.msc
Direct X控制面板(如果已经安装)*   directx.cpl
Direct X诊断工具     dxdiag
磁盘清理工具   cleanmgr
磁盘碎片整理程序    dfrg.msc
磁盘管理 diskmgmt.msc
磁盘分区管理器       diskpart
显示属性 control desktop
显示属性 desk.cpl
显示属性的外观选项卡     control color
Dr. Watson系统诊断工具 drwtsn32
Driver Verifier Manager    verifier
事件查看器      eventvwr.msc
文件签名验证   sigverif
快速查找 findfast.cpl
文件夹选项      control folders
字体文件夹      control fonts
字体文件夹      fonts
空档接龙游戏   freecell
游戏控制 joy.cpl
组策略编辑器(XP专业版) gpedit.msc
红心大战游戏   mshearts
Iexpress向导   iexpress
索引服务 ciadv.msc
Internet属性   inetcpl.cpl
IP配置实用程序(显示连接配置)       ipconfig /all
IP配置实用程序(显示DNS缓存内容)       ipconfig /displaydns
IP配置实用程序(删除DNS缓存内容)       ipconfig /flushdns
IP配置实用程序(释放全部(或指定)适配器的由DHCP分配的动态IP地址) ipconfig /release
IP配置实用程序(为全部适配器重新分配IP地址)      ipconfig /renew
IP配置实用程序(刷新DHCP并重新注册DNS)   ipconfig /registerdns
IP配置实用程序(显示DHCP Class ID)       ipconfig /showclassid
IP配置实用程序(修改DHCP Class ID)       ipconfig /setclassid
Java控制面板(如果已经安装)   jpicpl32.cpl
Java控制面板(如果已经安装)   javaws
键盘属性 control keyboard
本地安全设置   secpol.msc
本地用户和组   lusrmgr.msc
从Windows注销     logoff
微软聊天程序   winchat
扫雷游戏 winmine
鼠标属性 control mouse
鼠标属性 main.cpl
网络连接 control netconnections
网络连接 ncpa.cpl
网络安装向导   netsetup.cpl
ODBC数据源管理器 odbccp32.cpl
屏幕键盘 osk
AC3解码器(如果已经安装)      ac3filter.cpl
密码属性 password.cpl
性能 perfmon.msc
性能 perfmon
电话与调制解调器选项     telephon.cpl
电源选项属性   powercfg.cpl
打印机和传真   control printers
打印机文件夹   printers
TrueType造字程序   eudcedit
Quicktime(如果已经安装) QuickTime.cpl
区域和语言选项       intl.cpl
注册表编辑器   regedit
注册表编辑器   regedit32
远程桌面 mstsc
可移动存储      ntmsmgr.msc
可移动存储操作请求 ntmsoprq.msc
策略的结果集 (XP专业版)       rsop.msc
扫描仪与相机   sticpl.cpl
任务计划 control schedtasks
Windows安全中心   wscui.cpl
服务 services.msc
共享文件夹      fsmgmt.msc
关闭Windows shutdown
声音和音频设备属性 mmsys.cpl
蜘蛛牌游戏      spider
SQL Client客户端网络实用工具       cliconfg
系统配置编辑器       sysedit
系统配置实用程序    msconfig
系统文件检查工具(立即扫描)    sfc /scannow
系统文件检查工具(下次启动时扫描) sfc /scanonce
系统文件检查工具(每次启动时扫描) sfc /scanboot
系统文件检查工具(返回默认设置)     sfc /revert
系统文件检查工具(清除文件缓存)     sfc /purgecache
系统文件检查工具(设置缓存大小=x) sfc /cachesize=x
系统属性 sysdm.cpl
任务管理器      taskmgr
Telnet客户端   telnet
用户帐户管理   nusrmgr.cpl
辅助工具管理器       utilman
Windows防火墙      firewall.cpl
Windows放大镜      magnify
Windows管理体系结构    wmimgmt.msc
Windows系统安全工具    syskey
运行Windows更新 wupdmgr
漫游Windows XP    tourstart
写字板     Write
记事本     notepad
Nview桌面管理器(如果已经安装)     nvtuicpl.cpl
对象包装程序   packager

No Comments

在Linux下用Shell写的俄罗斯方块程序

转载自http://bbs.chinaunix.net/thread-184858-1-1.html

touch tetris.sh
chmod +x tetris.sh
vim tetris.sh

#!/bin/bash
# Tetris Game
# 10.21.2003 xhchen<[email]xhchen@winbond.com.tw[/email]>

#APP declaration
APP_NAME="${0##*[\\/]}"
APP_VERSION="1.0"

#颜色定义
cRed=1
cGreen=2
cYellow=3
cBlue=4
cFuchsia=5
cCyan=6
cWhite=7
colorTable=($cRed $cGreen $cYellow $cBlue $cFuchsia $cCyan $cWhite)

#位置和大小
iLeft=3
iTop=2
((iTrayLeft = iLeft + 2))
((iTrayTop = iTop + 1))
((iTrayWidth = 10))
((iTrayHeight = 15))

#颜色设置
cBorder=$cGreen
cScore=$cFuchsia
cScoreValue=$cCyan

#控制信号
#改游戏使用两个进程,一个用于接收输入,一个用于游戏流程和显示界面;
#当前者接收到上下左右等按键时,通过向后者发送signal的方式通知后者。
sigRotate=25
sigLeft=26
sigRight=27
sigDown=28
sigAllDown=29
sigExit=30

#七中不同的方块的定义
#通过旋转,每种方块的显示的样式可能有几种
box0=(0 0 0 1 1 0 1 1)
box1=(0 2 1 2 2 2 3 2 1 0 1 1 1 2 1 3)
box2=(0 0 0 1 1 1 1 2 0 1 1 0 1 1 2 0)
box3=(0 1 0 2 1 0 1 1 0 0 1 0 1 1 2 1)
box4=(0 1 0 2 1 1 2 1 1 0 1 1 1 2 2 2 0 1 1 1 2 0 2 1 0 0 1 0 1 1 1 2)
box5=(0 1 1 1 2 1 2 2 1 0 1 1 1 2 2 0 0 0 0 1 1 1 2 1 0 2 1 0 1 1 1 2)
box6=(0 1 1 1 1 2 2 1 1 0 1 1 1 2 2 1 0 1 1 0 1 1 2 1 0 1 1 0 1 1 1 2)

#所有其中方块的定义都放到box变量中
box=(${box0[@]} ${box1[@]} ${box2[@]} ${box3[@]} ${box4[@]} ${box5[@]} ${box6[@]})

#各种方块旋转后可能的样式数目
countBox=(1 2 2 2 4 4 4)

#各种方块再box数组中的偏移
offsetBox=(0 1 3 5 7 11 15)

#每提高一个速度级需要积累的分数
iScoreEachLevel=50  #be greater than 7

#运行时数据
sig=0   #接收到的signal
iScore=0  #总分
iLevel=0  #速度级
boxNew=() #新下落的方块的位置定义
cBoxNew=0 #新下落的方块的颜色
iBoxNewType=0 #新下落的方块的种类
iBoxNewRotate=0 #新下落的方块的旋转角度
boxCur=() #当前方块的位置定义
cBoxCur=0 #当前方块的颜色
iBoxCurType=0 #当前方块的种类
iBoxCurRotate=0 #当前方块的旋转角度
boxCurX=-1  #当前方块的x坐标位置
boxCurY=-1  #当前方块的y坐标位置
iMap=()   #背景方块图表

#初始化所有背景方块为-1, 表示没有方块
for ((i = 0; i < iTrayHeight * iTrayWidth; i++)); do iMap[$i]=-1; done

#接收输入的进程的主函数
function RunAsKeyReceiver()
{
  local pidDisplayer key aKey sig cESC sTTY
  pidDisplayer=$1
  aKey=(0 0 0)
  cESC=`echo -ne "\033"`
  cSpace=`echo -ne "\040"`

  #保存终端属性。在read -s读取终端键时,终端的属性会被暂时改变。
  #如果在read -s时程序被不幸杀掉,可能会导致终端混乱,
  #需要在程序退出时恢复终端属性。
  sTTY=`stty -g`

  #捕捉退出信号
  trap "MyExit;" INT TERM
  trap "MyExitNoSub;" $sigExit

  #隐藏光标
  echo -ne "\033[?25l"
  while :
  do
    #读取输入。注-s不回显,-n读到一个字符立即返回
    read -s -n 1 key
    aKey[0]=${aKey[1]}
    aKey[1]=${aKey[2]}
    aKey[2]=$key
    sig=0

    #判断输入了何种键
    if [[ $key == $cESC && ${aKey[1]} == $cESC ]]
    then
      #ESC键
      MyExit
    elif [[ ${aKey[0]} == $cESC && ${aKey[1]} == "[" ]]
    then
      if [[ $key == "A" ]]; then sig=$sigRotate #<向上键>
      elif [[ $key == "B" ]]; then sig=$sigDown #<向下键>
      elif [[ $key == "D" ]]; then sig=$sigLeft #<向左键>
      elif [[ $key == "C" ]]; then sig=$sigRight  #<向右键>
      fi
    elif [[ $key == "W" || $key == "w" ]]; then sig=$sigRotate  #W, w
    elif [[ $key == "S" || $key == "s" ]]; then sig=$sigDown  #S, s
    elif [[ $key == "A" || $key == "a" ]]; then sig=$sigLeft  #A, a
    elif [[ $key == "D" || $key == "d" ]]; then sig=$sigRight #D, d
    elif [[ "[$key]" == "[]" ]]; then sig=$sigAllDown #空格键
    elif [[ $key == "Q" || $key == "q" ]]     #Q, q
    then
      MyExit
    fi
    if [[ $sig != 0 ]]
    then
      #向另一进程发送消息
      kill -$sig $pidDisplayer
    fi
  done
}

#退出前的恢复
function MyExitNoSub()
{
  local y

  #恢复终端属性
  stty $sTTY
  ((y = iTop + iTrayHeight + 4))

  #显示光标
  echo -e "\033[?25h\033[${y};0H"
  exit
}

function MyExit()
{
  #通知显示进程需要退出
  kill -$sigExit $pidDisplayer
  MyExitNoSub
}

#处理显示和游戏流程的主函数
function RunAsDisplayer()
{
  local sigThis
  InitDraw

  #挂载各种信号的处理函数
  trap "sig=$sigRotate;" $sigRotate
  trap "sig=$sigLeft;" $sigLeft
  trap "sig=$sigRight;" $sigRight
  trap "sig=$sigDown;" $sigDown
  trap "sig=$sigAllDown;" $sigAllDown
  trap "ShowExit;" $sigExit
  while :
  do
    #根据当前的速度级iLevel不同,设定相应的循环的次数
    for ((i = 0; i < 21 - iLevel; i++))
    do
      sleep 0.02
      sigThis=$sig
      sig=0

      #根据sig变量判断是否接受到相应的信号
      if ((sigThis == sigRotate)); then BoxRotate;  #旋转
      elif ((sigThis == sigLeft)); then BoxLeft;  #左移一列
      elif ((sigThis == sigRight)); then BoxRight;  #右移一列
      elif ((sigThis == sigDown)); then BoxDown;  #下落一行
      elif ((sigThis == sigAllDown)); then BoxAllDown;  #下落到底
      fi
    done
    #kill -$sigDown $$
    BoxDown #下落一行
  done
}

#BoxMove(y, x), 测试是否可以把移动中的方块移到(x, y)的位置, 返回0则可以, 1不可以
function BoxMove()
{
  local j i x y xTest yTest
  yTest=$1
  xTest=$2
  for ((j = 0; j < 8; j += 2))
  do
    ((i = j + 1))
    ((y = ${boxCur[$j]} + yTest))
    ((x = ${boxCur[$i]} + xTest))
    if (( y < 0 || y >= iTrayHeight || x < 0 || x >= iTrayWidth))
    then
      #撞到墙壁了
      return 1
    fi
    if ((${iMap[y * iTrayWidth + x]} != -1 ))
    then
      #撞到其他已经存在的方块了
      return 1
    fi
  done
  return 0;
}

#将当前移动中的方块放到背景方块中去,
#并计算新的分数和速度级。(即一次方块落到底部)
function Box2Map()
{
  local j i x y xp yp line

  #将当前移动中的方块放到背景方块中去
  for ((j = 0; j < 8; j += 2))
  do
    ((i = j + 1))
    ((y = ${boxCur[$j]} + boxCurY))
    ((x = ${boxCur[$i]} + boxCurX))
    ((i = y * iTrayWidth + x))
    iMap[$i]=$cBoxCur
  done

  #消去可被消去的行
  line=0
  for ((j = 0; j < iTrayWidth * iTrayHeight; j += iTrayWidth))
  do
    for ((i = j + iTrayWidth - 1; i >= j; i--))
    do
      if ((${iMap[$i]} == -1)); then break; fi
    done
    if ((i >= j)); then continue; fi
    ((line++))
    for ((i = j - 1; i >= 0; i--))
    do
      ((x = i + iTrayWidth))
      iMap[$x]=${iMap[$i]}
    done
    for ((i = 0; i < iTrayWidth; i++))
    do
      iMap[$i]=-1
    done
  done
  if ((line == 0)); then return; fi

  #根据消去的行数line计算分数和速度级
  ((x = iLeft + iTrayWidth * 2 + 7))
  ((y = iTop + 11))
  ((iScore += line * 2 - 1))

  #显示新的分数
  echo -ne "\033[1m\033[3${cScoreValue}m\033[${y};${x}H${iScore}         "
  if ((iScore % iScoreEachLevel < line * 2 - 1))
  then
    if ((iLevel < 20))
    then
      ((iLevel++))
      ((y = iTop + 14))

      #显示新的速度级
      echo -ne "\033[3${cScoreValue}m\033[${y};${x}H${iLevel}        "
    fi
  fi
  echo -ne "\033[0m"

  #重新显示背景方块
  for ((y = 0; y < iTrayHeight; y++))
  do
    ((yp = y + iTrayTop + 1))
    ((xp = iTrayLeft + 1))
    ((i = y * iTrayWidth))
    echo -ne "\033[${yp};${xp}H"
    for ((x = 0; x < iTrayWidth; x++))
    do
      ((j = i + x))
      if ((${iMap[$j]} == -1))
      then
        echo -ne "  "
      else
        echo -ne "\033[1m\033[7m\033[3${iMap[$j]}m\033[4${iMap[$j]}m[]\033[0m"
      fi
    done
  done
}

#下落一行
function BoxDown()
{
  local y s
  ((y = boxCurY + 1)) #新的y坐标
  if BoxMove $y $boxCurX  #测试是否可以下落一行
  then
    s="`DrawCurBox 0`"  #将旧的方块抹去
    ((boxCurY = y))
    s="$s`DrawCurBox 1`"  #显示新的下落后方块
    echo -ne $s
  else
    #走到这儿, 如果不能下落了
    Box2Map   #将当前移动中的方块贴到背景方块中
    RandomBox #产生新的方块
  fi
}

#左移一列
function BoxLeft()
{
  local x s
  ((x = boxCurX - 1))
  if BoxMove $boxCurY $x
  then
    s=`DrawCurBox 0`
    ((boxCurX = x))
    s=$s`DrawCurBox 1`
    echo -ne $s
  fi
}

#右移一列
function BoxRight()
{
  local x s
  ((x = boxCurX + 1))
  if BoxMove $boxCurY $x
  then
    s=`DrawCurBox 0`
    ((boxCurX = x))
    s=$s`DrawCurBox 1`
    echo -ne $s
  fi
}

#下落到底
function BoxAllDown()
{
  local k j i x y iDown s
  iDown=$iTrayHeight
  #计算一共需要下落多少行
  for ((j = 0; j < 8; j += 2))
  do
    ((i = j + 1))
    ((y = ${boxCur[$j]} + boxCurY))
    ((x = ${boxCur[$i]} + boxCurX))
    for ((k = y + 1; k < iTrayHeight; k++))
    do
      ((i = k * iTrayWidth + x))
      if (( ${iMap[$i]} != -1)); then break; fi
    done
    ((k -= y + 1))
    if (( $iDown > $k )); then iDown=$k; fi
  done
  s=`DrawCurBox 0`  #将旧的方块抹去
  ((boxCurY += iDown))
  s=$s`DrawCurBox 1`  #显示新的下落后的方块
  echo -ne $s
  Box2Map   #将当前移动中的方块贴到背景方块中
  RandomBox #产生新的方块
}

#旋转方块
function BoxRotate()
{
  local iCount iTestRotate boxTest j i s
  iCount=${countBox[$iBoxCurType]}  #当前的方块经旋转可以产生的样式的数目

  #计算旋转后的新的样式
  ((iTestRotate = iBoxCurRotate + 1))
  if ((iTestRotate >= iCount))
  then
    ((iTestRotate = 0))
  fi

  #更新到新的样式, 保存老的样式(但不显示)
  for ((j = 0, i = (${offsetBox[$iBoxCurType]} + $iTestRotate) * 8; j < 8; j++, i++))
  do
    boxTest[$j]=${boxCur[$j]}
    boxCur[$j]=${box[$i]}
  done
  if BoxMove $boxCurY $boxCurX  #测试旋转后是否有空间放的下
  then
    #抹去旧的方块
    for ((j = 0; j < 8; j++))
    do
      boxCur[$j]=${boxTest[$j]}
    done
    s=`DrawCurBox 0`

    #画上新的方块
    for ((j = 0, i = (${offsetBox[$iBoxCurType]} + $iTestRotate) * 8; j < 8; j++, i++))
    do
      boxCur[$j]=${box[$i]}
    done
    s=$s`DrawCurBox 1`
    echo -ne $s
    iBoxCurRotate=$iTestRotate
  else
    #不能旋转,还是继续使用老的样式
    for ((j = 0; j < 8; j++))
    do
      boxCur[$j]=${boxTest[$j]}
    done
  fi
}

#DrawCurBox(bDraw), 绘制当前移动中的方块, bDraw为1, 画上, bDraw为0, 抹去方块。
function DrawCurBox()
{
  local i j t bDraw sBox s
  bDraw=$1
  s=""
  if (( bDraw == 0 ))
  then
    sBox="\040\040"
  else
    sBox="[]"
    s=$s"\033[1m\033[7m\033[3${cBoxCur}m\033[4${cBoxCur}m"
  fi
  for ((j = 0; j < 8; j += 2))
  do
    ((i = iTrayTop + 1 + ${boxCur[$j]} + boxCurY))
    ((t = iTrayLeft + 1 + 2 * (boxCurX + ${boxCur[$j + 1]})))

    #\033[y;xH, 光标到(x, y)处
    s=$s"\033[${i};${t}H${sBox}"
  done
  s=$s"\033[0m"
  echo -n $s
}

#更新新的方块
function RandomBox()
{
  local i j t

  #更新当前移动的方块
  iBoxCurType=${iBoxNewType}
  iBoxCurRotate=${iBoxNewRotate}
  cBoxCur=${cBoxNew}
  for ((j = 0; j < ${#boxNew[@]}; j++))
  do
    boxCur[$j]=${boxNew[$j]}
  done

  #显示当前移动的方块
  if (( ${#boxCur[@]} == 8 ))
  then
    #计算当前方块该从顶端哪一行"冒"出来
    for ((j = 0, t = 4; j < 8; j += 2))
    do
      if ((${boxCur[$j]} < t)); then t=${boxCur[$j]}; fi
    done
    ((boxCurY = -t))
    for ((j = 1, i = -4, t = 20; j < 8; j += 2))
    do
      if ((${boxCur[$j]} > i)); then i=${boxCur[$j]}; fi
      if ((${boxCur[$j]} < t)); then t=${boxCur[$j]}; fi
    done
    ((boxCurX = (iTrayWidth - 1 - i - t) / 2))

    #显示当前移动的方块
    echo -ne `DrawCurBox 1`

    #如果方块一出来就没处放,Game over!
    if ! BoxMove $boxCurY $boxCurX
    then
      kill -$sigExit ${PPID}
      ShowExit
    fi
  fi

  #清除右边预显示的方块
  for ((j = 0; j < 4; j++))
  do
    ((i = iTop + 1 + j))
    ((t = iLeft + 2 * iTrayWidth + 7))
    echo -ne "\033[${i};${t}H        "
  done

  #随机产生新的方块
  ((iBoxNewType = RANDOM % ${#offsetBox[@]}))
  ((iBoxNewRotate = RANDOM % ${countBox[$iBoxNewType]}))
  for ((j = 0, i = (${offsetBox[$iBoxNewType]} + $iBoxNewRotate) * 8; j < 8; j++, i++))
  do
    boxNew[$j]=${box[$i]};
  done
  ((cBoxNew = ${colorTable[RANDOM % ${#colorTable[@]}]}))

  #显示右边预显示的方块
  echo -ne "\033[1m\033[7m\033[3${cBoxNew}m\033[4${cBoxNew}m"
  for ((j = 0; j < 8; j += 2))
  do
    ((i = iTop + 1 + ${boxNew[$j]}))
    ((t = iLeft + 2 * iTrayWidth + 7 + 2 * ${boxNew[$j + 1]}))
    echo -ne "\033[${i};${t}H[]"
  done
  echo -ne "\033[0m"
}

#初始绘制
function InitDraw()
{
  clear
  RandomBox #随机产生方块,这时右边预显示窗口中有方快了
  RandomBox #再随机产生方块,右边预显示窗口中的方块被更新,原先的方块将开始下落
  local i t1 t2 t3

  #显示边框
  echo -ne "\033[1m"
  echo -ne "\033[3${cBorder}m\033[4${cBorder}m"
  ((t2 = iLeft + 1))
  ((t3 = iLeft + iTrayWidth * 2 + 3))
  for ((i = 0; i < iTrayHeight; i++))
  do
    ((t1 = i + iTop + 2))
    echo -ne "\033[${t1};${t2}H||"
    echo -ne "\033[${t1};${t3}H||"
  done
  ((t2 = iTop + iTrayHeight + 2))
  for ((i = 0; i < iTrayWidth + 2; i++))
  do
    ((t1 = i * 2 + iLeft + 1))
    echo -ne "\033[${iTrayTop};${t1}H=="
    echo -ne "\033[${t2};${t1}H=="
  done
  echo -ne "\033[0m"

  #显示"Score"和"Level"字样
  echo -ne "\033[1m"
  ((t1 = iLeft + iTrayWidth * 2 + 7))
  ((t2 = iTop + 10))
  echo -ne "\033[3${cScore}m\033[${t2};${t1}HScore"
  ((t2 = iTop + 11))
  echo -ne "\033[3${cScoreValue}m\033[${t2};${t1}H${iScore}"
  ((t2 = iTop + 13))
  echo -ne "\033[3${cScore}m\033[${t2};${t1}HLevel"
  ((t2 = iTop + 14))
  echo -ne "\033[3${cScoreValue}m\033[${t2};${t1}H${iLevel}"
  echo -ne "\033[0m"
}

#退出时显示GameOVer!
function ShowExit()
{
  local y
  ((y = iTrayHeight + iTrayTop + 3))
  echo -e "\033[${y};0HGameOver!\033[0m"
  exit
}

#显示用法.
function Usage
{
  cat << EOF
Usage: $APP_NAME
Start tetris game.
  -h, --help              display this help and exit
      --version           output version information and exit
EOF
}

#游戏主程序在这儿开始.
if [[ "$1" == "-h" || "$1" == "--help" ]]; then
  Usage
elif [[ "$1" == "--version" ]]; then
  echo "$APP_NAME $APP_VERSION"
elif [[ "$1" == "--show" ]]; then
  #当发现具有参数--show时,运行显示函数
  RunAsDisplayer
else
  bash $0 --show& #以参数--show将本程序再运行一遍
  RunAsKeyReceiver $! #以上一行产生的进程的进程号作为参数
fi

./tetris.sh
tetris_shell

No Comments

Linux 下 TOP 命令详解

公司需要时刻监控服务器的运行状态,目前的监控方式之一就是通过查看top指令的输出信息。那么,这里便有必要对top指令进行更进一步深入的了解了。

top命令和ps命令的基本作用是相同的,显示系统当前的进程和其他状况;
 
但是top是一个动态显示过程,即可以通过用户按键来不断刷新当前状态。如? 前台执行该命令,它将独占前台,直到用户终止该程序为止。
比较准确的说,top命令提供了实时的对系统处理器的状态监视。它将显示系统中CPU最“敏感”的任务列表。该命令可以按CPU使用。
内存使用和执行时间对任务进行排序;而且该命令的很多特性都可以通过交互式命令或者在个人定制文件中进行设定。在后面的介绍中将把命令参数和交互命令分开讲述。

下面是该命令的语法格式:
top [-] [d delay] [q] [c] [s] [S] [i]

d 指定每两次屏幕信息刷新之间的时间间隔。当然用户可以使用s交互命令来改变之。
q 该选项将使top没有任何延迟的进行刷新。如果调用程序有超级用户权限,那么top将以尽可能高的优先级运行。
S 指定累计模式。
s 使top命令在安全模式中运行。这将去除交互命令所带来的潜在危险。
i 使top不显示任何闲置或者僵死进程。
c 显示整个命令行而不只是显示命令名

top命令显示的项目很多,默认值是每5秒更新一次,当然这是可以设置的。

显示的各项目为:
uptime 该项显示的是系统启动时间、已经运行的时间和三个平均负载值(最近1秒,5秒,15秒的负载值)。
processes 自最近一次刷新以来的运行进程总数。当然这些进程被分为正在运行的,休眠的,停止的等很多种类。进程和状态显示可以通过交互命令t来实现。
CPU states 显示用户模式,系统模式,优先级进程(只有优先级为负的列入考虑)和闲置等各种情况所占用CPU时间的百分比。优先级进程所消耗的时间也被列入到用户和系统的时间中,所以总的百分比将大于100%。
Mem 内存使用情况统计,其中包括总的可用内存,空闲内存,已用内存,共享内存和缓存所占内存的情况。
Swap 交换空间统计,其中包括总的交换空间,可用交换空间,已用交换空间。
PID 每个进程的ID。
PPID 每个进程的父进程ID。
UID 每个进程所有者的UID 。
USER 每个进程所有者的用户名。
PRI 每个进程的优先级别。
NI 该进程的优先级值。
SIZE 该进程的代码大小加上数据大小再加上堆栈空间大小的总数。单位是KB。
TSIZE 该进程的代码大小。对于内核进程这是一个很奇怪的值。
DSIZE 数据和堆栈的大小。
TRS 文本驻留大小。
D 被标记为“不干净”的页项目。
LIB 使用的库页的大小。对于ELF进程没有作用。
RSS 该进程占用的物理内存的总数量,单位是KB。
SHARE 该进程使用共享内存的数量。
STAT 该进程的状态。其中S代表休眠状态;D代表不可中断的休眠状态;R代表运行状态;Z代表僵死状态;T代表停止或跟踪状态。
TIME 该进程自启动以来所占用的总CPU时间。如果进入的是累计模式,那么该时间还包括这个进程子进程所占用的时间。且标题会变成CTIME。
%CPU 该进程自最近一次刷新以来所占用的CPU时间和总时间的百分比。
%MEM 该进程占用的物理内存占总内存的百分比。
COMMAND 该进程的命令名称,如果一行显示不下,则会进行截取。内存中的进程会有一个完整的命令行。

下面介绍在top命令执行过程中可以使用的一些交互命令。从使用角度来看,熟练的掌握这些命令比掌握选项还重要一些。这些命令都是单字母的,如果在命令行选项中使用了s选项,则可能其中一些命令会被屏蔽掉。

空格 立即刷新显示。
Ctrl+L 擦除并且重写屏幕。
h 或者 ? 显示帮助画面,给出一些简短的命令总结说明。
k 终止一个进程。系统将提示用户输入需要终止的进程PID,以及需要发送给该进程什么样的信号。一般的终止进程可以使用15信号;如果不能正常结束那就使用信号9强制结束该进程。默认值是信号15。在安全模式中此命令被屏蔽。
i 忽略闲置和僵死进程。这是一个开关式命令。
q 退出程序。
r 重新安排一个进程的优先级别。系统提示用户输入需要改变的进程PID。
S 切换到累计模式。
s 改变两次刷新之间的延迟时间。系统将提示用户输入新的时间,单位为s。如果有小数,就换算成m s。输入0值则系统将不断刷新,默认值是5 s。需要注意的是如果设置太小的时间,很可能会引起不断刷新,从而根本来不及看清显示的情况,而且系统负载也会大大增加。
f 或者 F 从当前显示中添加或者删除项目。
o 或者 O 改变显示项目的顺序。
l 切换显示平均负载和启动时间信息。
m 切换显示内存信息。
t 切换显示进程和CPU状态信息。
c 切换显示命令名称和完整命令行。
M 根据驻留内存大小进行排序。
P 根据CPU使用百分比大小进行排序。
T 根据时间/累计时间进行排序。
W 将当前设置写入~/.toprc文件中。这是写top配置文件的推荐方法。

从上面的介绍中可以看到,top命令是一个功能十分强大的监控系统的工具,尤其对于系统管理员而言更是如此。一般的用户可能会觉得ps命令其实就够用了,但是top命令的强劲功能确实提供了不少方便。下面来看看实际使用的情况。
 
键入top命令查看系统状况:
$ top
---
top - 01:06:48 up   1:22,   1 user,   load average: 0.06, 0.60, 0.48
Tasks:   29 total,    1 running,   28 sleeping,    0 stopped,    0 zombie
Cpu(s):   0.3% us,   1.0% sy,   0.0% ni, 98.7% id,   0.0% wa,   0.0% hi,   0.0% si
Mem:     191272k total,    173656k used,     17616k free,     22052k buffers
Swap:    192772k total,         0k used,    192772k free,    123988k cached
 
PID USER       PR   NI   VIRT   RES   SHR S %CPU %MEM     TIME+   COMMAND
1379 root        16    0   7976 2456 1980 S   0.7   1.3    0:11.03 sshd
14704 root       16    0   2128   980   796 R   0.7   0.5    0:02.72 top
1 root           16    0   1992   632   544 S   0.0   0.3    0:00.90 init
2 root           34   19      0     0     0 S   0.0   0.0    0:00.00 ksoftirqd/0
3 root           RT    0      0     0     0 S   0.0   0.0    0:00.00 watchdog/0
---

第一行的项目依次为当前时间、系统启动时间、当前系统登录用户数目、平均负载。
第二行为进程情况,依次为进程总数、休眠进程数、运行进程数、僵死进程数、终止进程数。
第三行为CPU状态,依次为用户占用、系统占用、优先进程占用、闲置进程占用。
第四行为内存状态,依次为平均可用内存、已用内存、空闲内存、共享内存、缓存使用内存。
第五行为交换状态,依次为平均可用交换容量、已用容量、闲置容量、高速缓存容量。
然后下面就是和ps相仿的各进程情况列表了。
 
总的来说,top命令的功能强于ps,但需要长久占用前台,所以用户应该根据自己的情况来使用这个命令。

No Comments