2010年11月08日

nmap是一个网络探测和安全扫描程序, 系统管理者和个人可以使用这个软件扫描大型的网络,获取那台主机正在运行以及提供什么服务等信息。nmap支持很多扫描技术,例如:UDP、TCP connect()、TCP SYN(半开扫描)、ftp代理(bounce攻击)、反向标志、ICMP、FIN、ACK扫描、圣诞树(Xmas Tree)、SYN扫描和null扫描。从扫描类型一节可以得到细节。nmap还提供了一些高级的特征,例如:通过TCP/IP协议栈特征探测操作系统类 型,秘密扫描,动态延时和重传计算,并行扫描,通过并行ping扫描探测关闭的主机,诱饵扫描,避开端口过滤检测,直接RPC扫描(无须端口影射),碎片 扫描,以及灵活的目标和端口设定.
——————————————————————————–

1.名称

nmap-网络探测和安全扫描工具

2.语法

nmap [Scan Type(s)] [Options]

3.描述

nmap是一个网络探测和安全扫描程 序,系统管理者和个人可以使用这个软件扫描大型的网络,获取那台主机正在运行以及提供什么服务等信息。nmap支持很多扫描技术,例如:UDP、TCP connect()、TCP SYN(半开扫描)、ftp代理(bounce攻击)、反向标志、ICMP、FIN、ACK扫描、圣诞树(Xmas Tree)、SYN扫描和null扫描。从扫描类型一节可以得到细节。nmap还提供了一些高级的特征,例如:通过TCP/IP协议栈特征探测操作系统类 型,秘密扫描,动态延时和重传计算,并行扫描,通过并行ping扫描探测关闭的主机,诱饵扫描,避开端口过滤检测,直接RPC扫描(无须端口影射),碎片 扫描,以及灵活的目标和端口设定。

为了提高nmap在non-root状态下的性能,软件的设计者付出了很大的努力。很不幸,一些内核界面(例如raw socket)需要在root状态下使用。所以应该尽可能在root使用nmap。

nmap运行通常会得到被扫描主机端 口的列表。nmap总会给出well known端口的服务名(如果可能)、端口号、状态和协议等信息。每个端口的状态有:open、filtered、unfiltered。open状态意 味着目标主机能够在这个端口使用accept()系统调用接受连接。filtered状态表示:防火墙、包过滤和其它的网络安全软件掩盖了这个端口,禁止 nmap探测其是否打开。unfiltered表示:这个端口关闭,并且没有防火墙/包过滤软件来隔离nmap的探测企图。通常情况下,端口的状态基本都 是unfiltered状态,只有在大多数被扫描的端口处于filtered状态下,才会显示处于unfiltered状态的端口。

根据使用的功能选项,nmap也可以报告远程主机的下列特征:使用的操作系统、TCP序列、运行绑定到每个端口上的应用程序的用户名、DNS名、主机地址是否是欺骗地址、以及其它一些东西。

4.功能选项

功能选项可以组合使用。一些功能选项只能够在某种扫描模式下使用。nmap会自动识别无效或者不支持的功能选项组合,并向用户发出警告信息。

如果你是有经验的用户,可以略过结尾的示例一节。可以使用nmap -h快速列出功能选项的列表。

4.1 扫描类型

-sT
TCP connect()扫描:这是最基本的TCP扫描方式。connect()是一种系统调用,由操作系统提供,用来打开一个连接。如果目标端口有程序监听, connect()就会成功返回,否则这个端口是不可达的。这项技术最大的优点是,你勿需root权限。任何UNIX用户都可以自由使用这个系统调用。这 种扫描很容易被检测到,在目标主机的日志中会记录大批的连接请求以及错误信息。
-sS
TCP同步扫描(TCP SYN):因为不必全部打开一个TCP连接,所以这项技术通常称为半开扫描(half-open)。你可以发出一个TCP同步包(SYN),然后等待回 应。如果对方返回SYN|ACK(响应)包就表示目标端口正在监听;如果返回RST数据包,就表示目标端口没有监听程序;如果收到一个SYN|ACK包, 源主机就会马上发出一个RST(复位)数据包断开和目标主机的连接,这实际上有我们的操作系统内核自动完成的。这项技术最大的好处是,很少有系统能够把这 记入系统日志。不过,你需要root权限来定制SYN数据包。
-sF -sF -sN
秘密FIN数据包扫描、圣诞树 (Xmas Tree)、空(Null)扫描模式:即使SYN扫描都无法确定的情况下使用。一些防火墙和包过滤软件能够对发送到被限制端口的SYN数据包进行监视,而 且有些程序比如synlogger和courtney能够检测那些扫描。这些高级的扫描方式可以逃过这些干扰。这些扫描方式的理论依据是:关闭的端口需要 对你的探测包回应RST包,而打开的端口必需忽略有问题的包(参考RFC 793第64页)。FIN扫描使用暴露的FIN数据包来探测,而圣诞树扫描打开数据包的FIN、URG和PUSH标志。不幸的是,微软决定完全忽略这个标 准,另起炉灶。所以这种扫描方式对Windows95/NT无效。不过,从另外的角度讲,可以使用这种方式来分别两种不同的平台。如果使用这种扫描方式可 以发现打开的端口,你就可以确定目标注意运行的不是Windows系统。如果使用-sF、-sX或者-sN扫描显示所有的端口都是关闭的,而使用SYN扫 描显示有打开的端口,你可以确定目标主机可能运行的是Windwos系统。现在这种方式没有什么太大的用处,因为nmap有内嵌的操作系统检测功能。还有 其它几个系统使用和windows同样的处理方式,包括Cisco、BSDI、HP/UX、MYS、IRIX。在应该抛弃数据包时,以上这些系统都会从打 开的端口发出复位数据包。
-sP
ping扫描:有时你只是想知道此时网络上哪些主机正在运行。通过向你指定的网络内的每个 IP地址发送ICMP echo请求数据包,nmap就可以完成这项任务。如果主机正在运行就会作出响应。不幸的是,一些站点例如:microsoft.com阻塞ICMP echo请求数据包。然而,在默认的情况下nmap也能够向80端口发送TCP ack包,如果你收到一个RST包,就表示主机正在运行。nmap使用的第三种技术是:发送一个SYN包,然后等待一个RST或者SYN/ACK包。对于 非root用户,nmap使用connect()方法。
在默认的情况下(root用户),nmap并行使用ICMP和ACK技术。
注意,nmap在任何情况下都会进行ping扫描,只有目标主机处于运行状态,才会进行后续的扫描。如果你只是想知道目标主机是否运行,而不想进行其它扫描,才会用到这个选项。
-sU
UDP扫描:如果你想知道在某台主机上提供哪些UDP(用户数据报协议,RFC768)服务,可以使用这种扫描方法。nmap首先向目标主机的每个端口发出一个0字节的UDP包,如果我们收到端口不可达的ICMP消息,端口就是关闭的,否则我们就假设它是打开的。
有些人可能会想UDP扫描是没有什么意思的。但是,我经常会想到最近出现的solaris rpcbind缺陷。rpcbind隐藏在一个未公开的UDP端口上,这个端口号大于32770。所以即使端口111(portmap的众所周知端口号) 被防火墙阻塞有关系。但是你能发现大于30000的哪个端口上有程序正在监听吗?使用UDP扫描就能!cDc Back Orifice的后门程序就隐藏在Windows主机的一个可配置的UDP端口中。不考虑一些通常的安全缺陷,一些服务例如:snmp、tftp、NFS 使用UDP协议。不幸的是,UDP扫描有时非常缓慢,因为大多数主机限制ICMP错误信息的比例(在RFC1812中的建议)。例如,在Linux内核中 (在net/ipv4/icmp.h文件中)限制每4秒钟只能出现80条目标不可达的ICMP消息,如果超过这个比例,就会给1/4秒钟的处罚。 solaris的限制更加严格,每秒钟只允许出现大约2条ICMP不可达消息,这样,使扫描更加缓慢。nmap会检测这个限制的比例,减缓发送速度,而不 是发送大量的将被目标主机丢弃的无用数据包。
不过Micro$oft忽略了RFC1812的这个建议,不对这个比例做任何的限制。所以我们可以能够快速扫描运行Win95/NT的主机上的所有65K个端口。
-sA
ACK扫描:这项高级的扫描方法通常用来穿过防火墙的规则集。通常情况下,这有助于确定一个防火墙是功能比较完善的或者是一个简单的包过滤程序,只是阻塞进入的SYN包。
这种扫描是向特定的端口发送ACK包(使用随机的应答/序列号)。如果返回一个RST包,这个端口就标记为unfiltered状态。如果什么都没有返 回,或者返回一个不可达ICMP消息,这个端口就归入filtered类。注意,nmap通常不输出unfiltered的端口,所以在输出中通常不显示 所有被探测的端口。显然,这种扫描方式不能找出处于打开状态的端口。
-sW
对滑动窗口的扫描:这项高级扫描技术非常类似于 ACK扫描,除了它有时可以检测到处于打开状态的端口,因为滑动窗口的大小是不规则的,有些操作系统可以报告其大小。这些系统至少包括:某些版本的 AIX、Amiga、BeOS、BSDI、Cray、Tru64 UNIX、DG/UX、OpenVMS、Digital UNIX、OpenBSD、OpenStep、QNX、Rhapsody、SunOS 4.x、Ultrix、VAX、VXWORKS。从nmap-hackers邮件3列表的文档中可以得到完整的列表。
-sR
RPC扫描。这种方法和nmap的其它不同的端口扫描方法结合使用。选择所有处于打开状态的端口向它们发出SunRPC程序的NULL命令,以确定它们 是否是RPC端口,如果是,就确定是哪种软件及其版本号。因此你能够获得防火墙的一些信息。诱饵扫描现在还不能和RPC扫描结合使用。
-b
FTP反弹攻击(bounce attack):FTP协议(RFC 959)有一个很有意思的特征,它支持代理FTP连接。也就是说,我能够从evil.com连接到FTP服务器target.com,并且可以要求这台 FTP服务器为自己发送Internet上任何地方的文件!1985年,RFC959完成时,这个特征就能很好地工作了。然而,在今天的Internet 中,我们不能让人们劫持FTP服务器,让它向Internet上的任意节点发送数据。如同Hobbit在1995年写的文章中所说的,这个协议”能够用来 做投递虚拟的不可达邮件和新闻,进入各种站点的服务器,填满硬盘,跳过防火墙,以及其它的骚扰活动,而且很难进行追踪”。我们可以使用这个特征,在一台代 理FTP服务器扫描TCP端口。因此,你需要连接到防火墙后面的一台FTP服务器,接着进行端口扫描。如果在这台FTP服务器中有可读写的目录,你还可以 向目标端口任意发送数据(不过nmap不能为你做这些)。
传递给-b功能选项的参数是你要作为代理的FTP服务器。语法格式为:
-b username:password@server:port。
除了server以外,其余都是可选的。如果你想知道什么服务器有这种缺陷,可以参考我在Phrack 51发表的文章。还可以在nmap的站点得到这篇文章的最新版本。

4.2 通用选项

这些内容不是必需的,但是很有用。

-P0
在扫描之前,不必ping主机。有些网络的防火墙不允许ICMP echo请求穿过,使用这个选项可以对这些网络进行扫描。microsoft.com就是一个例子,因此在扫描这个站点时,你应该一直使用-P0或者-PT 80选项。
-PT
扫描之前,使用TCP ping确定哪些主机正在运行。nmap不是通过发送ICMP echo请求包然后等待响应来实现这种功能,而是向目标网络(或者单一主机)发出TCP ACK包然后等待回应。如果主机正在运行就会返回RST包。只有在目标网络/主机阻塞了ping包,而仍旧允许你对其进行扫描时,这个选项才有效。对于非 root用户,我们使用connect()系统调用来实现这项功能。使用-PT <端口号>来设定目标端口。默认的端口号是80,因为这个端口通常不会被过滤。
-PS
对于root用户,这个选项让nmap使用SYN包而不是ACK包来对目标主机进行扫描。如果主机正在运行就返回一个RST包(或者一个SYN/ACK包)。
-PI
设置这个选项,让nmap使用真正的ping(ICMP echo请求)来扫描目标主机是否正在运行。使用这个选项让nmap发现正在运行的主机的同时,nmap也会对你的直接子网广播地址进行观察。直接子网广 播地址一些外部可达的IP地址,把外部的包转换为一个内向的IP广播包,向一个计算机子网发送。这些IP广播包应该删除,因为会造成拒绝服务攻击(例如 smurf)。
-PB
这是默认的ping扫描选项。它使用ACK(-PT)和ICMP(-PI)两种扫描类型并行扫描。如果防火墙能够过滤其中一种包,使用这种方法,你就能够穿过防火墙。
-O
这个选项激活对TCP/IP指纹特征(fingerprinting)的扫描,获得远程主机的标志。换句话说,nmap使用一些技术检测目标主机操作系 统网络协议栈的特征。nmap使用这些信息建立远程主机的指纹特征,把它和已知的操作系统指纹特征数据库做比较,就可以知道目标主机操作系统的类型。
-I
这个选项打开nmap的反向标志扫描功能。Dave Goldsmith 1996年向bugtap发出的邮件注意到这个协议,ident协议(rfc 1413)允许使用TCP连接给出任何进程拥有者的用户名,即使这个进程并没有初始化连接。例如,你可以连接到HTTP端口,接着使用identd确定这 个服务器是否由root用户运行。这种扫描只能在同目标端口建立完全的TCP连接时(例如:-sT扫描选项)才能成功。使用-I选项是,远程主机的 identd精灵进程就会查询在每个打开的端口上监听的进程的拥有者。显然,如果远程主机没有运行identd程序,这种扫描方法无效。
-f
这个选项使nmap使用碎片IP数据包发送SYN、FIN、XMAS、NULL。使用碎片数据包增加包过滤、入侵检测系统的难度,使其无法知道你的企 图。不过,要慎重使用这个选项!有些程序在处理这些碎片包时会有麻烦,我最喜欢的嗅探器在接受到碎片包的头36个字节时,就会发生 segmentation faulted。因此,在nmap中使用了24个字节的碎片数据包。虽然包过滤器和防火墙不能防这种方法,但是有很多网络出于性能上的考虑,禁止数据包的 分片。
注意这个选项不能在所有的平台上使用。它在Linux、FreeBSD、OpenBSD以及其它一些UNIX系统能够很好工作。
-v
冗余模式。强烈推荐使用这个选项,它会给出扫描过程中的详细信息。使用这个选项,你可以得到事半功倍的效果。使用-d选项可以得到更加详细的信息。
-h
快速参考选项。
-oN
把扫描结果重定向到一个可读的文件logfilename中。
-oM
把扫描结果重定向到logfilename文件中,这个文件使用主机可以解析的语法。你可以使用-oM -来代替logfilename,这样输出就被重定向到标准输出stdout。在这种情况下,正常的输出将被覆盖,错误信息荏苒可以输出到标准错误 std

err。要注意,如果同时使用了-v选项,在屏幕上会打印出其它的信息。
-oS    thIs l0gz th3 r3suLtS of YouR ScanZ iN a s|   THe fiL3 U sPecfy 4s an arGuMEnT! U kAn gIv3 the 4rgument -
(wItHOUt qUOteZ) to sh00t output iNT0 stDouT!@!! 莫名其妙,下面是我猜着翻译的,相形字?
把扫描结果重定向到一个文件logfilename中,这个文件使用一种”黑客方言”的语法形式(作者开的玩笑?)。同样,使用-oS -就会把结果重定向到标准输出上。
-resume
某个网络扫描可能由于control-C或者网络损失等原因被中断,使用这个选项可以使扫描接着以前的扫描进行。logfilename是被取消扫描的 日志文件,它必须是可读形式或者机器可以解析的形式。而且接着进行的扫描不能增加新的选项,只能使用与被中断的扫描相同的选项。nmap会接着日志文件中 的最后一次成功扫描进行新的扫描。
-iL
从inputfilename文件中读取扫描的目标。在这个文件中要有一个主机或者网络的列表,由空格键、制表键或者回车键作为分割符。如果使用-iL -,nmap就会从标准输入stdin读取主机名字。你可以从指定目标一节得到更加详细的信息。
-iR
让nmap自己随机挑选主机进行扫描。
-p <端口范围>
这个选项让你选择要进行扫描的端口号的范围。例如,-p 23表示:只扫描目标主机的23号端口。-p 20-30,139,60000-表示:扫描20到30号端口,139号端口以及所有大于60000的端口。在默认情况下,nmap扫描从1到1024号 以及nmap-services文件(如果使用RPM软件包,一般在/usr/share/nmap/目录中)中定义的端口列表。
-F
快速扫描模式,只扫描在nmap-services文件中列出的端口。显然比扫描所有65535个端口要快。
-D
使用诱饵扫描方法对目标网络/主机进行扫描。如果nmap使用这种方法对目标网络进行扫描,那么从目标主机/网络的角度来看,扫描就象从其它主机 (decoy1,等)发出的。从而,即使目标主机的IDS(入侵检测系统)对端口扫描发出报警,它们也不可能知道哪个是真正发起扫描的地址,哪个是无辜 的。这种扫描方法可以有效地对付例如路由跟踪、response-dropping等积极的防御机制,能够很好地隐藏你的IP地址。
每个 诱饵主机名使用逗号分割开,你也可以使用ME选项,它代表你自己的主机,和诱饵主机名混杂在一起。如果你把ME放在第六或者更靠后的位置,一些端口扫描检 测软件几乎根本不会显示你的IP地址。如果你不使用ME选项,nmap会把你的IP地址随机夹杂在诱饵主机之中。
注意:你用来作为诱饵的 主机应该正在运行或者你只是偶尔向目标发送SYN数据包。很显然,如果在网络上只有一台主机运行,目标将很轻松就会确定是哪台主机进行的扫描。或许,你还 要直接使用诱饵的IP地址而不是其域名,这样诱饵网络的域名服务器的日志上就不会留下关于你的记录。
还要注意:一些愚蠢的端口扫描检测软件会拒绝路由试图进行端口扫描的主机。因而,你需要让目标主机和一些诱饵断开连接。如果诱饵是目标主机的网关或者就是其自己时,会给目标主机造成很大问题。所以你需要慎重使用这个选项。
诱饵扫描既可以在起始的ping扫描也可以在真正的扫描状态下使用。它也可以和-O选项组合使用。
使用太多的诱饵扫描能够减缓你的扫描速度甚至可能造成扫描结果不正确。同时,有些ISP会把你的欺骗包过滤掉。虽然现在大多数的ISP不会对此进行限制。
-S <IP_Address>
在一些情况下,nmap可能无法确定你的源地址(nmap会告诉你)。在这种情况使用这个选项给出你的IP地址。
在欺骗扫描时,也使用这个选项。使用这个选项可以让目标认为是其它的主机对自己进行扫描。
-e
告诉nmap使用哪个接口发送和接受数据包。nmap能够自动对此接口进行检测,如果无效就会告诉你。
-g
设置扫描的源端口。一些天真的防火墙和包过滤器的规则集允许源端口为DNS(53)或者FTP-DATA(20)的包通过和实现连接。显然,如果攻击者 把源端口修改为20或者53,就可以摧毁防火墙的防护。在使用UDP扫描时,先使用53号端口;使用TCP扫描时,先使用20号端口。注意只有在能够使用 这个端口进行扫描时,nmap才会使用这个端口。例如,如果你无法进行TCP扫描,nmap会自动改变源端口,即使你使用了-g选项。
对于一些扫描,使用这个选项会造成性能上的微小损失,因为我有时会保存关于特定源端口的一些有用的信息。
-r
告诉nmap不要打乱被扫描端口的顺序。
–randomize_hosts
使nmap在扫描之前,打乱每组扫描中的主机顺序,nmap每组可以扫描最多2048台主机。这样,可以使扫描更不容易被网络监视器发现,尤其和–scan_delay 选项组合使用,更能有效避免被发现。
-M
设置进行TCP connect()扫描时,最多使用多少个套接字进行并行的扫描。使用这个选项可以降低扫描速度,避免远程目标宕机。

4.3 适时选项

通常,nmap在运行时,能够很好地根据网络特点进行调整。扫描时,nmap会尽量减少被目标检测到的机会,同时尽可能加快扫描速度。然而,nmap默认的适时策略有时候不太适合你的目标。使用下面这些选项,可以控制nmap的扫描timing:

-T
设置nmap的适时策略。Paranoid:为了避开IDS的检测使扫描速度极慢,nmap串行所有的扫描,每隔至少5分钟发送 一个包; Sneaky:也差不多,只是数据包的发送间隔是15秒;Polite:不增加太大的网络负载,避免宕掉目标主机,串行每个探测,并且使每个探测有0.4 秒种的间隔;Normal:nmap默认的选项,在不是网络过载或者主机/端口丢失的情况下尽可能快速地扫描;Aggressive:设置5分钟的超时限 制,使对每台主机的扫描时间不超过5分钟,并且使对每次探测回应的等待时间不超过1.5秒钟;b>Insane:只适合快速的网络或者你不在意丢失 某些信息,每台主机的超时限制是75秒,对每次探测只等待0.3秒钟。你也可是使用数字来代替这些模式,例如:-T 0等于-T Paranoid,-T 5等于-T Insane。
这些适时模式不能下面的适时选项组合使用。
–host_timeout
设置扫描一台主机的时间,以毫秒为单位。默认的情况下,没有超时限制。
–max_rtt_timeout
设置对每次探测的等待时间,以毫秒为单位。如果超过这个时间限制就重传或者超时。默认值是大约9000毫秒。
–min_rtt_timeout
当目标主机的响应很快时,nmap就缩短每次探测的超时时间。这样会提高扫描的速度,但是可能丢失某些响应时间比较长的包。使用这个选项,可以让nmap对每次探测至少等待你指定的时间,以毫秒为单位。
–initial_rtt_timeout
设置初始探测的超时值。一般这个选项只在使用-P0选项扫描有防火墙保护的主机才有用。默认值是6000毫秒。
–max_parallelism
设置最大的并行扫描数量。–max_parallelism 1表示同时只扫描一个端口。这个选项对其它的并行扫描也有效,例如ping sweep, RPC scan。
–scan_delay
设置在两次探测之间,nmap必须等待的时间。这个选项主要用于降低网络的负载。

4.4 目标设定

在nmap的所有参数中,只有目标参数是必须给出的。其最简单的形式是在命令行直接输入一个主机名或者一个IP地址。如果你希望扫描某个IP地 址的一个子网,你可以在主机名或者IP地址的后面加上/掩码。掩码在0(扫描整个网络)到32(只扫描这个主机)。使用/24扫描C类地址,/16扫描B 类地址。

除此之外,nmap还有更加强大的表示方式让你更加灵活地指定IP地址。例如,如果要扫描这个B类网络128.210.*.*,你可以使用下面 三种方式来指定这些地址:128.210.*.*、128.21-.0-255.0-255或者128.210.0.0/16这三种形式是等价的。

5.例子

本节将由浅入深地举例说明如何使用nmap。

nmap -v target.example.com
扫描主机target.example.com的所有TCP端口。-v打开冗余模式。

nmap -sS -O target.example.com/24
发起对target.example.com所在网络上的所有255个IP地址的秘密SYN扫描。同时还探测每台主机操作系统的指纹特征。需要root权限。

nmap -sX -p 22,53,110,143,4564 128.210.*.1-127
对B类IP地址128.210中255个可能的8位子网的前半部分发起圣诞树扫描。确定这些系统是否打开了sshd、DNS、pop3d、imapd和4564端口。注意圣诞树扫描对Micro$oft的系统无效,因为其协议栈的TCP层有缺陷。

nmap -v –randomize_hosts -p 80 *.*.2.3-5
只扫描指定的IP范围,有时用于对这个 Internet进行取样分析。nmap将寻找Internet上所有后两个字节是.2.3、.2.4、.2.5的 IP地址上的WEB服务器。如果你想发现更多有意思的主机,你可以使用127-222,因为在这个范围内有意思的主机密度更大。

host -l company.com | cut -d -f 4 | ./nmap -v -iL -
列出company.com网络的所有主机,让nmap进行扫描。注意:这项命令在GNU/Linux下使用。如果在其它平台,你可能要使用 其它的命令/选项

2010年11月02日

手头有三台机器,为了安全,就打算做一个网络备份,让这三台机器互相备份一些重要文档。上网逛了一会,发现bacula(www.bacula.org)挺符合自己的要求。

bacula采用模块化设计,采用c/s构架,理论上可以把任意n台主机的资料备份到任意n台中,而你不需要在每台机器上都写一个配置文件控制他们运 作,所有主要的工作都在一台director上控制。登陆上director你就可以知道什么备份正在运行,什么备份成功了,什么备份失败了,所有的 log也会集中到你指定的地方,让管理工作更简单一点。恢复的时候也很简单,简单运行几个命令你就可以把指定的备份恢复。支持完全备份,差异备份,增量备 份;支持把备份写到硬盘文件中,也支持写到磁带中。支持平台相当多,设置包括win平台(备份win,还不支持备份到win)。当然也有一些缺点,比如对 并发备份支持未经彻底测试,作者宣称最好不要尝试,除非你自己经过测试。还有一点就是文档中没有一个quick start。。。。文档太详细了点,没有点耐心读不完。。。。

1,前期准备

bacula有三个模块组成。一个是 Director,用于指挥整个系统运行,job schedule,通知另外两个模块工作。一个是Storage Daemon,它是存储端,负责把网络中传来的数据备份到本机,恢复的时候负责把数据传出去。最后一个是File Daemon,备份时把文件传出,恢复时接受数据并恢复。其实上面的三个模块并不能让bacula运行,另外一个模块是数据库模块。这个模块可以通过 SQLite(编译进bacula),也可以使用MySql和PostgreSql,作者推荐的是mysql。还需要一些第三方库才能编译:GZIP和 Readline。文档中没有说明,但其实还需要另外一个软件才能保证正常运行:ntp。因为差异备份和增量备份都依赖于文件修改时间来决定是否备份。单 机备份问题不大,网络备份就需要考虑各个主机的时间差异了。所以我推荐所有主机每天运行两次ntpdate来调准时间。如果你在sjtu网络里面,可以使 用dns.sjtu.edu.cn来调校时间。如果你使用的是磁带机备份,还需要检查一下你的磁带机是否被支持。而且最好去阅读文档中的 Understanding Pools, Volumes and Labels一节。否则配置的时候你会搞得晕乎乎的。

2,编译

编译过程很简单,文档也很详细,就不具体介绍了。注意一点是被备份机器上可以使用–enable-client-only编译。

3,数据库建立

下面说说mysql的建立过程。首先在代码根目录中

cd src/cats/

./grant_mysql_privileges

./create_mysql_database

./make_mysql_tables

如果mysql不是在本机上,可以增加-h参数指定。默认采用空密码的root用户,可以用-p参数使其采用密码验证。如果要采用其它用户就只能修改脚本了,很简单的。

默认建立的bacula用户,而且是空密码。推荐还是修改密码。

bacula可以使用任意多的数据库,也就是说你可以使用两个数据库,然后再让这两个数据库互相备份。

4,运行File Daemon(fd)

配置前先说明一点需要注意的,配置中指定主机地址时,最好使用ip,我配置时使用主机名貌似不可以。。。而且要是对外的ip,用127.0.0.1不行

fd运行在被备份主机上。配置相当简单,指定哪个Director可以运行调度它,密码是什么,fd的名字,工作目录,log往哪里发就可以了。修改修改标配就可以了。

5,运行Storage Daemon(sd)

sd运行在接受备份的机器上。配置也相当简单,只是比fd多出了一个device用于指定使用什么硬件备份数据。可以把多个数据备份到一个 device,如果是磁带机备份bacula在恢复的时候会告诉你要使用哪个磁带。因为我使用的是文件备份的模式,所以就给每个备份配置一个 device,把不同的备份放到不同目录去,下面是一个简单文件备份device配置当然可以schedule还可以配置很多东西,比如增量备份以及更灵 活的时间调度。可以参考文档。

FileSet项目告诉dir应该备份什么文件,不应该备份什么文件

FileSet {
Name = dbfs
Include = compression=GZIP { #备份运行fd机器上的/var/db目录,用gzip
压缩,
/var/db/
}
Exclude = { #不包括所有的.log文件
*.log
}
}

FileSet也可以灵活配置,甚至可以在job运行时才指定备份文件Catalog告诉dir去哪里找数据库

Catalog {
Name = dbcatalog
dbname = bacula
user = bacula
password = xxxxxxxxx
DB Address = 202.120.x.x  #不要用localhost
DB Port = 3306
}

Pool告诉dir使用哪个Pool备份数据,这个概念比较搞,到配置job的时候会清晰一点。

Pool{
Name = dbpool
Pool Type = Backup
Maximum Volume Jobs = 1  #每次备份使用一个文件
Recycle = yes       #重复使用
AutoPrune = yes      #自动清除
Volume Retention = 15 days #备份保留时间
Maximum Volumes = 30    #最多保存多少个文件
Recycle Current Volume = yes #使用最近过期的文件存储新备份
#文件如何命名,下面的格式会产生如下的命名形式db-2004-03-19-id20
Label Format =
"db-${Year}-${Month:p/2/0/r}-${Day:p/2/0/r}-id${JobId}"
}
Message项目告诉dir如何保存log,以及保存格式Messages {
Name = Standard
# mailcommand = "/usr/local/bacula/bin/smtp -h 202.120.x.x -f "(Bacula)
%r
" -s "Bacula: %t %e of %c %l" %r"
# operatorcommand = "/usr/local/bacula/bin/smtp -h 202.120.x.x -f
"(Bacula)
%r" -s "Bacula: Intervention needed for %j" %r"
# mail = root@202.120.x.x = all, !skipped
# operator = root@202.120.x.x = mount
# console = all, !skipped, !saved
#
# WARNING! the following will create a file that you must cycle from
#     time to time as it will grow indefinitely. However, it will
#     also keep all your messages if they scroll off the console.
#
append = "/var/log/bacula.log" = all, !skipped
append ="/var/log/bacula.err.log" = error, warning, fatal
}

我保留了两份log,一份包括所有信息,一份只包括错误信息可以看到,bacula支持把log发到邮箱中~~被我注释掉了。

Job是上面所有配置的一个组合,给用户最大的灵活性配置

Job {
Name = dbjob
Type = Backup  #还有restore之类的类型,也有一些其它选项,可以实现一
些很有意思的功能
Level = Full  #默认备份程度,schedule中的配置会覆盖这里的选择
Client = dbfd
FileSet = dbfs
Messages = Standard
Pool = dbpool
Storage = dbsd
Schedule = dbscd #如果没有指定schedule,默认不运行,可以通过console调度
}

还有一个counter的配置。。不配置他也能运行,不说了

7,console运行

console是你动态管理bacula的窗口,配置很简单。运行console可以实现很多很有价值的管理活动。具体可以参考文档说明。

8,让整个系统运行。

没什么好说的,只要配置正确,就没有什么挫折。不能正常运行就去看看log,bacula的log非常详细。

9,性能和稳定性。

性能不错,瓶颈明显在带宽,cpu占用不高(不使用gizp)。稳定性尚不清楚,据作者说非常好。稳定运行一年半载不成问题。

10,有趣的工作。

用bacula你可以实现一个额外的功能,类似tripwire文件系统检查机制。具体看文档。

我说了很多具体看文档~~~~bacula的文档确实很不错,很翔实,如果你需要借重他来备份,多看看不会错。

2010年10月28日

vim 是一个具有很多命令的功能非常强大的编辑器。限于篇幅,在本教程当中
就不详细介绍了。本教程的设计目标是讲述一些必要的基本命令,而掌握好这
些命令,您就能够很容易将vim当作一个通用的万能编辑器来使用了。

完成本教程的内容大约需要25-30分钟,取决于您训练的时间。

每一节的命令操作将会更改本文。推荐您复制本文的一个副本,然后在副本上
进行训练(如果您是通过”vimtutor”来启动教程的,那么本文就已经是副本了)。

切记一点∶本教程的设计思路是在使用中进行学习的。也就是说,您需要通过
执行命令来学习它们本身的正确用法。如果您只是阅读而不操作,那么您可能
会很快遗忘这些命令的!

好了,现在请确定您的Shift-Lock(大小写锁定键)还没有按下,然后按键盘上
的字母键 j 足够多的次数来移动光标,直到第一节的内容能够完全充满屏幕。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第一讲第一节∶移动光标

※※ 要移动光标,请依照说明分别按下 h、j、k、l 键。 ※※

11111^
11111k111111111提示∶ h 的键位于左边,每次按下就会向左移动。
11< h 11l >1111111111l 的键位于右边,每次按下就会向右移动。
11111j 1111111111111j 键看起来很象一支尖端方向朝下的箭头。
11111v

1. 请随意在屏幕内移动光标,直至您觉得舒服为止。

2. 按下下行键(j),直到出现光标重复下行。

—> 现在您应该已经学会如何移动到下一讲吧。

3. 现在请使用下行键,将光标移动到第二讲。

提示∶如果您不敢确定您所按下的字母,请按下<ESC>键回到正常(Normal)模式。
然后再次从键盘输入您想要的命令。

提示∶光标键应当也能正常工作的。但是使用hjkl键,在习惯之后您就能够快速
地在屏幕内四处移动光标了。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第一讲第二节∶VIM的进入和退出

!! 特别提示∶敬请阅读完整本一节的内容,然后才能执行以下所讲解的命令。

1. 请按<ESC>键(这是为了确保您处在正常模式)。

2. 然后输入∶ :q! <回车>

—> 这种方式的退出编辑器绝不会保存您进入编辑器以来所做的改动。
如果您想保存更改再退出,请输入∶
:wq <回车>

3. 如果您看到了命令行提示符,请输入能够带您回到本教程的命令,那就是∶

vimtutor <回车>

通常情况下您也可以用这种方式∶

vim tutor <回车>

—> 这里的 ‘vim’ 表示进入vim编辑器,而 ‘tutor’则是您准备要编辑的文件。

4. 如果您自信已经牢牢记住了这些步骤的话,请从步骤1执行到步骤3退出,然
后再次进入编辑器。接着将光标移动到第一讲第三节来继续我们的教程讲解。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第一讲第三节∶文本编辑之删除

** 在正常(Normal)模式下,可以按下 x 键来删除光标所在位置的字符。**

1. 请将光标移动到本节中下面标记有 —> 的那一行。

2. 为了修正输入错误,请将光标移至准备删除的字符的位置处。

3. 然后按下 x 键将错误字符删除掉。

4. 重复步骤2到步骤4,直到句子修正为止。

—> The ccow jumpedd ovverr thhe mooon.

5. 好了,该行已经修正了,下一节内容是第一讲第四节。

特别提示∶在您浏览本教程时,不要强行记忆。记住一点∶在使用中学习。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第一讲第四节∶文本编辑之插入

** 在正常模式下,可以按下 i 键来插入文本。**

1. 请将光标移动到本节中下面标记有 —> 的第一行。

2. 为了使得第一行内容雷同于第二行,请将光标移至文本第一个字符准备插入
的位置。

3. 然后按下 i 键,接着输入必要的文本字符。

4. 所有文本都修正完毕,请按下 <ESC> 键返回正常模式。
重复步骤2至步骤4以便修正句子。

—> There is text misng this .
—> There is some text missing from this line.

5. 如果您对文本插入操作已经很满意,请接着阅读下面的小结。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第一讲小结

1. 光标在屏幕文本中的移动既可以用箭头键,也可以使用 hjkl 字母键。
h (左移) j (下行) k (上行) l (右移)

2. 欲进入vim编辑器(从命令行提示符),请输入∶vim 文件名 <回车>

3. 欲退出vim编辑器,请输入以下命令放弃所有修改∶

<ESC> :q! <回车>

或者输入以下命令保存所有修改∶

<ESC> :wq <回车>

4. 在正常模式下删除光标所在位置的字符,请按∶ x

5. 在正常模式下要在光标所在位置开始插入文本,请按∶

i 输入必要文本 <ESC>

特别提示∶按下 <ESC> 键会带您回到正常模式或者取消一个不期望或者部分完成
的命令。

好了,第一讲到此结束。下面接下来继续第二讲的内容。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第二讲第一节∶删除类命令

** 输入 dw 可以从光标处删除至一个单字/单词的末尾。**

1. 请按下 <ESC> 键确保您处于正常模式。

2. 请将光标移动到本节中下面标记有 —> 的那一行。

3. 请将光标移至准备要删除的单词的开始。

4. 接着输入 dw 删除掉该单词。

特别提示∶您所输入的 dw 会在您输入的同时出现在屏幕的最后一行。如果您输
入有误,请按下 <ESC> 键取消,然后重新再来。

—> There are a some words fun that don’t belong paper in this sentence.

5. 重复步骤3至步骤4,直至句子修正完毕。接着继续第二讲第二节内容。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第二讲第二节∶其他删除类命令

** 输入 d$ 从当前光标删除到行末。**

1. 请按下 <ESC> 键确保您处于正常模式。

2. 请将光标移动到本节中下面标记有 —> 的那一行。

3. 请将光标移动到该行的尾部(也就是在第一个点号‘.’后面)。

4. 然后输入 d$ 从光标处删至当前行尾部。

—> Somebody typed the end of this line twice. end of this line twice.

5. 请继续学习第二讲第三节就知道是怎么回事了。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第二讲第三节∶关于命令和对象

删除命令 d 的格式如下∶

[number] d object 或者 d [number] object

其意如下∶
number – 代表执行命令的次数(可选项,缺省设置为 1 )。
d – 代表删除。
object – 代表命令所要操作的对象(下面有相关介绍)。

一个简短的对象列表∶
w – 从当前光标当前位置直到单字/单词末尾,包括空格。
e – 从当前光标当前位置直到单字/单词末尾,但是 *不* 包括空格。
$ – 从当前光标当前位置直到当前行末。

特别提示∶
对于勇于探索者,请在正常模式下面仅按代表相应对象的键而不使用命令,则
将看到光标的移动正如上面的对象列表所代表的一样。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第二讲第四节∶对象命令的特殊情况

** 输入 dd 可以删除整一个当前行。 **

鉴于整行删除的高频度,VIM 的设计者决定要简化整行删除,仅需要在同一行上
击打两次 d 就可以删除掉光标所在的整行了。

1. 请将光标移动到本节中下面的短句段落中的第二行。
2. 输入 dd 删除该行。
3. 然后移动到第四行。
4. 接着输入 2dd (还记得前面讲过的 number-command-object 吗?) 删除两行。

1) Roses are red,
2) Mud is fun,
3) Violets are blue,
4) I have a car,
5) Clocks tell time,
6) Sugar is sweet
7) And so are you.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第二讲第五节∶撤消类命令

** 输入 u 来撤消最后执行的命令,输入 U 来修正整行。**

1. 请将光标移动到本节中下面标记有 —> 的那一行,并将其置于第一个错误
处。
2. 输入 x 删除第一个不想保留的字母。
3. 然后输入 u 撤消最后执行的(一次)命令。
4. 这次要使用 x 修正本行的所有错误。
5. 现在输入一个大写的 U ,恢复到该行的原始状态。
6. 接着多次输入 u 以撤消 U 以及更前的命令。
7. 然后多次输入 CTRL-R (先按下 CTRL 键不放开,接着输入 R 键) ,这样就
可以执行恢复命令,也就是撤消掉撤消命令。

—> Fiix the errors oon thhis line and reeplace them witth undo.

8. 这些都是非常有用的命令。下面是第二讲的小结了。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第二讲小结

1. 欲从当前光标删除至单字/单词末尾,请输入∶dw

2. 欲从当前光标删除至当前行末尾,请输入∶d$

3. 欲删除整行,请输入∶dd

4. 在正常模式下一个命令的格式是∶

[number] command object 或者 command [number] object
其意是∶
number – 代表的是命令执行的次数
command – 代表要做的事情,比如 d 代表删除
object – 代表要操作的对象,比如 w 代表单字/单词,$ 代表到行末等等。
$ (to the end of line), etc.

5. 欲撤消以前的操作,请输入∶u (小写的u)
欲撤消在一行中所做的改动,请输入∶U (大写的U)
欲撤消以前的撤消命令,恢复以前的操作结果,请输入∶CTRL-R

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第三讲第一节∶置入类命令

** 输入 p 将最后一次删除的内容置入光标之后 **

1. 请将光标移动到本节中下面示范段落的首行。

2. 输入 dd 将该行删除,这样会将该行保存到vim的缓冲区中。

3. 接着将光标移动到准备置入的位置的上方。记住∶是上方哦。

4. 然后在正常模式下(<ESC>键进入),输入 p 将该行粘贴置入。

5. 重复步骤2至步骤4,将所有的行依序放置到正确的位置上。

d) Can you learn too?
b) Violets are blue,
c) Intelligence is learned,
a) Roses are red,

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第三讲第二节∶替换类命令

** 输入 r 和一个字符替换光标所在位置的字符。**

1. 请将光标移动到本节中下面标记有 —> 的第一行。

2. 请移动光标到第一个错误的适当位置。

3. 接着输入 r ,这样就能将错误替换掉了。

4. 重复步骤2和步骤3,直到第一行已经修改完毕。

—> Whan this lime was tuoed in, someone presswd some wrojg keys!
—> When this line was typed in, someone pressed some wrong keys!

5. 然后我们继续学校第三讲第三节。

特别提示∶切记您要在使用中学习,而不是在记忆中学习。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第三讲第三节∶更改类命令

** 要改变一个单字/单词的部分或者全部,请输入 cw **

1. 请将光标移动到本节中下面标记有 —> 的第一行。

2. 接着把光标放在单词 lubw 的字母 u 的位置那里。

3. 然后输入 cw 就可以修正该单词了(在本例这里是输入 ine 。)

4. 最后按 <ESC> 键,然后光标定位到下一个错误第一个准备更改的字母处。

5. 重复步骤3和步骤4,直到第一个句子完全雷同第二个句子。

—> This lubw has a few wptfd that mrrf changing usf the change command.
—> This line has a few words that need changing using the change command.

提示∶请注意 cw 命令不仅仅是替换了一个单词,也让您进入文本插入状态了。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第三讲第四节∶使用c指令的其他更改类命令

** 更改类指令可以使用同删除类命令所使用的对象参数。**

1. 更改类指令的工作方式跟删除类命令是一致的。操作格式是∶

[number] c object 或者 c [number] object

2. 对象参数也是一样的,比如 w 代表单字/单词,$代表行末等等。

3. 请将光标移动到本节中下面标记有 —> 的第一行。

4. 接着将光标移动到第一个错误处。

5. 然后输入 c$ 使得该行剩下的部分更正得同第二行一样。最后按 <ESC> 键。

—> The end of this line needs some help to make it like the second.
—> The end of this line needs to be corrected using the c$ command.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第三讲小结

1. 要重新置入已经删除的文本内容,请输入小写字母 p。该操作可以将已删除
的文本内容置于光标之后。如果最后一次删除的是一个整行,那么该行将置
于当前光标所在行的下一行。

2. 要替换光标所在位置的字符,请输入小写的 r 和要替换掉原位置字符的新字
符即可。

3. 更改类命令允许您改变指定的对象,从当前光标所在位置直到对象的末尾。
比如输入 cw 可以替换当前光标到单词的末尾的内容;输入 c$ 可以替换当
前光标到行末的内容。

4. 更改类命令的格式是∶

[number] c object 或者 c [number] object

下面我们继续学习下一讲。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第四讲第一节∶定位及文件状态

** 输入 CTRL-g 显示当前编辑文件中当前光标所在行位置以及文件状态信息。
输入 SHIFT-G 则直接跳转到文件中的某一指定行。**

提示∶切记要先通读本节内容,之后才可以执行以下步骤!!!

1. 按下 CTRL 键不放开然后按 g 键。然后就会看到页面最底部出现一个状态信
息行,显示的内容是当前编辑的文件名和文件的总行数。请记住步骤3的行号。

2. 按下 SHIFT-G 键可以使得当前光标直接跳转到文件最后一行。

3. 输入您曾停留的行号,然后按下 SHIFT-G。这样就可以返回到您第一次按下
CTRL-g 时所在的行好了。注意∶输入行号时,行号是不会在屏幕上显示出来
的。

4. 如果愿意,您可以继续执行步骤1至步骤三。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第四讲第二节∶搜索类命令

** 输入 / 以及尾随的字符串可以用以在当前文件中查找该字符串。**

1. 在正常模式下输入 / 字符。您此时会注意到该字符和光标都会出现在屏幕底
部,这跟 : 命令是一样的。

2. 接着输入 errroor <回车>。那个errroor就是您要查找的字符串。

3. 要查找同上一次的字符串,只需要按 n 键。要向相反方向查找同上一次的字
符串,请输入 Shift-N 即可。

4. 如果您想逆向查找字符串,请使用 ? 代替 / 进行。

—> When the search reaches the end of the file it will continue at the start.

“errroor” is not the way to spell error; errroor is an error.

提示∶如果查找已经到达文件末尾,查找会自动从文件头部继续查找。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第四讲第三节∶配对括号的查找

** 按 % 可以查找配对的括号 )、]、}。**

1. 把光标放在本节下面标记有 –> 那一行中的任何一个 (、[ 或 { 处。

2. 接着按 % 字符。

3. 此时光标的位置应当是在配对的括号处。

4. 再次按 % 就可以跳回配对的第一个括号处。

---> This ( is a test line with ('s, ['s ] and {’s } in it. ))

提示∶在程序调试时,这个功能用来查找不配对的括号是很有用的。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第四讲第四节∶修正错误的方法之一

** 输入 :s/old/new/g 可以替换 old 为 new。**

1. 请将光标移动到本节中下面标记有 —> 的那一行。

2. 输入 :s/thee/the <回车> 。请注意该命令只改变光标所在行的第一个匹配
串。

3. 输入 :s/thee/the/g 则是替换全行的匹配串。

—> the best time to see thee flowers is in thee spring.

4. 要替换两行之间出现的每个匹配串,请输入 :#,#s/old/new/g (#,#代表的是
两行的行号)。输入 :%s/old/new/g 则是替换整个文件中的每个匹配串。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第四讲小结

1. Ctrl-g 用于显示当前光标所在位置和文件状态信息。Shift-G 用于将光标跳
转至文件最后一行。先敲入一个行号然后按 Shift-G 则是将光标移动至该行
号代表的行。

2. 输入 / 然后紧随一个字符串是则是在当前所编辑的文档中向后查找该字符串。
输入问号 ? 然后紧随一个字符串是则是在当前所编辑的文档中向前查找该字
符串。完成一次查找之后按 n 键则是重复上一次的命令,可在同一方向上查
找下一个字符串所在;或者按 Shift-N 向相反方向查找下该字符串所在。

3. 如果光标当前位置是括号(、)、[、]、{、},按 % 可以将光标移动到配对的
括号上。

4. 在一行内替换头一个字符串 old 为新的字符串 new,请输入 :s/old/new
在一行内替换所有的字符串 old 为新的字符串 new,请输入 :s/old/new/g
在两行内替换所有的字符串 old 为新的字符串 new,请输入 :#,#s/old/new/g
在文件内替换所有的字符串 old 为新的字符串 new,请输入 :%s/old/new/g
进行全文替换时询问用户确认每个替换需添加 c 选项,请输入 :%s/old/new/gc

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第五讲第一节∶在 VIM 内执行外部命令的方法

** 输入 :! 然后紧随著输入一个外部命令可以执行该外部命令。**

1. 按下我们所熟悉的 : 命令设置光标到屏幕底部。这样就可以让您输入命令了。

2. 接着输入感叹号 ! 这个字符,这样就允许您执行外部的 shell 命令了。

3. 我们以 ls 命令为例。输入 !ls <回车> 。该命令就会列举出您当前目录的
内容,就如同您在命令行提示符下输入 ls 命令的结果一样。如果 !ls 没起
作用,您可以试试 :!dir 看看。

—> 提示∶ 所有的外部命令都可以以这种方式执行。

—> 提示∶ 所有的 : 命令都必须以 <回车> 告终。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第五讲第二节∶关于保存文件的更多信息

** 要将对文件的改动保存到文件中,请输入 :w FILENAME 。**

1. 输入 :!dir 或者 :!ls 获知当前目录的内容。您应当已知道最后还得敲
<回车> 吧。

2. 选择一个尚未存在文件名,比如 TEST 。

3. 接着输入 :w TEST (此处 TEST 是您所选择的文件名。)

4. 该命令会以 TEST 为文件名保存整个文件 (VIM 教程)。为了确保正确保存,
请再次输入 :!dir 查看您的目录列表内容。

—> 请注意∶如果您退出 VIM 然后在以文件名 TEST 为参数进入,那么该文件内
容应该同您保存时的文件内容是完全一样的。

5. 现在您可以通过输入 :!rm TEST 来删除 TEST 文件了。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第五讲第三节∶一个具有选择性的保存命令

** 要保存文件的部分内容,请输入 :#,# w FILENAME **

1. 再来执行一次 :!dir 或者 :!ls 获知当前目录的内容,然后选择一个合适的
不重名的文件名,比如 TEST 。

2. 接着将光标移动至本页的最顶端,然后按 CTRL-g 找到该行的行号。别忘了
行号哦。

3. 接着把光标移动至本页的最底端,再按一次 CTRL-g 。也别忘了这个行好哦。

4. 为了只保存文章的某个部分,请输入 :#,# w TEST 。这里的 #,# 就是上面
要求您记住的行号(顶端行号,底端行号),而 TEST 就是选定的文件名。

5. 最后,用 :!dir 确认文件是否正确保存。但是这次先别删除掉。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第五讲第四节∶提取和合并文件

** 要向当前文件中插入另外的文件的内容,请输入 :r FILENAME **

1. 请键入 :!dir 确认您前面创建的 TEST 文件还在。

2. 然后将光标移动至当前页面的顶端。

特别提示∶ 执行步骤3之后您将看到第五讲第三节,请届时再往下移动回到这里来。

3. 接着通过 :r TEST 将前面创建的名为 TEST 的文件提取进来。

特别提示∶您所提取进来的文件将从光标所在位置处开始置入。

4. 为了确认文件已经提取成功,移动光标回到原来的位置就可以注意有两份第
五讲第三节,一份是原本,另外一份是来自文件的副本。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第五讲小结

1. :!command 用于执行一个外部命令 command。

请看一些实际例子∶
:!dir – 用于显示当前目录的内容。
:!rm FILENAME - 用于删除名为 FILENAME 的文件。

2. :w FILENAME 可将当前 VIM 中正在编辑的文件保存到名为 FILENAME 的文
件中。

3. :#,#w FILENAME 可将当前编辑文件第 # 行至第 # 行的内容保存到文件
FILENAME 中。

4. :r FILENAME 可提取磁盘文件 FILENAME 并将其插入到当前文件的光标位置
后面。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第六讲第一节∶打开类命令

** 输入 o 将在光标的下方打开新的一行并进入插入模式。**

1. 请将光标移动到本节中下面标记有 —> 的那一行。

2. 接着输入小写的 o 在光标 *下方* 打开新的一行并进入插入模式。

3. 然后复制标记有 —> 的行并按 <ESC> 键退出插入模式而进入正常模式。

—> After typing o the cursor is placed on the open line in Insert mode.

4. 为了在光标 *上方* 打开新的一行,只需要输入大写的 O 而不是小写的 o
就可以了。请在下行测试一下吧。当光标处在在该行上时,按 Shift-O可以
在该行上方新开一行。

Open up a line above this by typing Shift-O while the cursor is on this line.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第六讲第二节∶光标后插入类命令

** 输入 a 将可在光标之后插入文本。 **

1. 请在正常模式下通过输入 $ 将光标移动到本节中下面标记有 —> 的第一行
的末尾。

2. 接着输入小写的 a 则可在光标之后插入文本了。大写的 A 则可以直接在行
末插入文本。

提示∶输入大写 A 的操作方法可以在行末插入文本,避免了输入 i,光标定位到
最后一个字符,输入的文本,<ESC> 回复正常模式,箭头右键移动光标以及
x 删除当前光标所在位置字符等等诸多繁杂的操作。

3. 操作之后第一行就可以补充完整了。请注意光标后插入文本与插入模式是基
本完全一致的,只是文本插入的位置定位稍有不同罢了。

—> This line will allow you to practice
—> This line will allow you to practice appending text to the end of a line.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第六讲第三节∶另外一个置换类命令的版本

** 输入大写的 R 可连续替换多个字符。**

1. 请将光标移动到本节中下面标记有 —> 的第一行。

2. 移动光标到第一行中不同于标有 —> 的第二行的第一个单词的开始,即单
词 last 处。

3. 然后输入大写的 R 开始把第一行中的不同于第二行的剩余字符逐一输入,就
可以全部替换掉原有的字符而使得第一行完全雷同第二行了。

—> To make the first line the same as the last on this page use the keys.
—> To make the first line the same as the second, type R and the new text.

4. 请注意∶如果您按 <ESC> 退出置换模式回复正常模式,尚未替换的文本将仍
然保持原状。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第六讲第四节∶设置类命令的选项

** 设置可使查找或者替换可忽略大小写的选项 **

1. 要查找单词 ignore 可在正常模式下输入 /ignore 。要重复查找该词,可以
重复按 n 键。

2. 然后设置 ic 选项(ic就是英文忽略大小写Ignore Case的首字母缩写词),即
输入∶
:set ic

3. 现在可以通过键入 n 键再次查找单词 ignore。重复查找可以重复键入 n 键。

4. 然后设置 hlsearch 和 incsearch 这两个选项,输入以下内容∶
:set hls is

5. 现在可以再次输入查找命令,看看会有什么效果∶
/ignore

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第六讲小结

1. 输入小写的 o 可以在光标下方打开新的一行并将光标置于新开的行首,进入
插入模式。
输入大写的 O 可以在光标上方打开新的一行并将光标置于新开的行首,进入
插入模式。

2. 输入小写的 a 可以在光标所在位置之后插入文本。
输入大写的 A 可以在光标所在行的行末之后插入文本。

3. 输入大写的 R 将进入替换模式,直至按 <ESC> 键退出替换模式而进入正常
模式。

4. 输入 :set xxx 可以设置 xxx 选项。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第七讲∶在线帮助命令

** 使用在线帮助系统 **

Vim 拥有一个细致全面的在线帮助系统。要启动该帮助系统,请选择如下三种方
法之一∶
- 按下 <HELP> 键 (如果键盘上有的话)
- 按下 <F1> 键 (如果键盘上有的话)
- 输入 :help <回车>

输入 :q <回车> 可以关闭帮助窗口。

提供一个正确的参数给”:help”命令,您可以找到关于该主题的帮助。请试验以
下参数(可别忘了按回车键哦。:)∶

:help w <回车>
:help c_<T <回车>
:help insert-index <回车>
:help user-manual <回车>

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第八讲∶创建一个启动脚本

** 启用vim的功能 **

Vim的功能特性要比vi多得多,但大部分功能都没有缺省激活。为了启动更多的
功能,您得创建一个vimrc文件。

1. 开始编辑vimrc文件,这取决于您所使用的操作系统∶

:edit ~/.vimrc 这是Unix系统所使用的命令
:edit $VIM/_vimrc 这是Windows系统所使用的命令

2. 接着导入vimrc范例文件∶

:read $VIMRUNTIME/vimrc_example.vim

3. 保存文件,命令为∶

:write

在下次您启动vim的时候,编辑器就会有了语法高亮的功能。您可以继续把您喜
欢的其它功能设置添加到这个vimrc文件中。

2010年09月26日
在新立得软件包管理器中删除swfdec-mozilla,以及swfdec-gmone,这两个软件和adobe flash有些冲突。然后安装adobe flash即可!
2010年09月15日

腾讯QQ不能在64位UBUNTU系统中安装,还是不甘心,于是搜索到64位系统安装32位软件的方法,要安装32位的包,sudo apt-get install ia32-libs ia32-libs-gtk linux32 lib32asound2
根据以下命令终于安装了腾讯LINUXQQ

安装命令QQ 命令 如下

腾讯网站下载32位安装包
进入安装包所在的目录
sudo dpkg -i –force-all linuxqq_v1.0-preview2_i386.deb

2010年09月14日

Liunx操作系统跟Windos XP一样,有一批系统服务随机而启动;略懂电脑的Windows XP用户会禁止那些不必要的服务,以提高开机速度;如今安装了Ubuntu操作系统,咱们也有必要了解Ubuntu的服务,然后根据自己的需要,将不必要 的服务禁止掉,这样既可以提高Ubuntu的启动速度,还能够提高系统的安全性(尽管Ubuntu 8.10本身已经非常安全;p)
我推荐Ubuntu用户安装sysv-rc-conf图形界面工具,禁止掉那些你不需要启动的服务。
例如,我的笔记本没有蓝牙和 PCMCIA,所以我就不需要启动它,于是禁止掉那些不需要的服务。
代码:  sudo apt-get install sysv-rc-conf
然后: 代码: sudo sysv-rc-conf
以下是部分Ubuntu操作系统服务详解,你可以参考关闭或者开启服务:
1. acpi-support – 你最好使其在S运行等级处于“X”状态。
2. acpid – acpi守护程序.这两个用于电源管理,对于笔记本和台式电脑很重要,所以让它们开启。
3. alsa – 如果你使用alsa声音子系统,是的,开启它。
4. alsa-utils -在我系统里,此服务取代了alsa,所以我关闭了alsa并在S运行等级将此服务开启。**注意**,我所说的“关闭”是指在所有运行等级里面去除所有 “X”。如果在你系统里没有它,没问题。让我们继续。
5. anacron – 一个cron子系统,当时间到达时用于执行任何没有被执行的cron作业。当某种cron 作业时间准备好时,很可能你或许已经关闭了你的计算机。打个比方,updatedb被计划在每天2点执行,但是在那个时候,你的计算机是关闭的,然后如果 ananron服务如果是开启的话,它将设法抓起那个updatedb cron… 我将它关闭是因为我不经常关闭我的笔记本,但是否开启此服务完全取决于你。
6. apmd – 这是十分困惑我的一个服务。我已经开启了acpid服务,那同时开启apmd有啥好处呢?如果你的计算机不是那么老,甚至不能支持acpi,然后你可以设法关闭它。无论如何,我是关闭它的。
7. atd – 就像cron,一个作业调度程序。我把它关了
8. binfmt-support – 核心支持其他二进制的文件格式。我让它开着
9. bluez-utiles – 我把它关了因为我没有任何蓝牙设备
10. bootlogd – 开启它
11. cron – 开启它
12. cupsys – 管理打印机的子系统。我没有打印机所以我关闭它了,如果你有打印机,开启他。
13. dbus – 消息总线系统(message bus system)。非常重要,开启它。
14. dns-clean – 当使用拨号连接,主要用于清除dns信息。我不用拨号,所以我关闭了它。
15. evms – 企业卷管理系统(Enterprise Volumn Management system). 我关闭了它。
16. fetchmail – 一个邮件接受守护进程,我关闭了它。
17. gdm – gnome桌面管理器。 无论如何我关闭它了,因为我将系统用终端引导。如果你想直接引导到图形用户界面,这取决于你。
18. gdomap – 事实上我也不知道为什么此服务必需开启。我没有在其他系统见过这个守护程序,所以我将其关闭并且我没觉得我失去了什么。开启它对笔记本或者台式机有任何好处吗?
19. gpm – 终端鼠标支持。如果你觉得你在终端使用鼠标更好,那么在运行等级 1 和2 开启它。那正是你所需要的。
20. halt – 别更改它。
21. hdparm – 调整硬盘的脚本。我在运行等级 2,3,4,5去除了它但是在S 运行等级添加了它。我觉得早点打开DMA,32bit I/O等等将对其余过程有益。我自己也将原来的脚本精简了一下。如果我知道我正做什么,我觉得做过多的检查没用。相应配置文件是/etc /hdparm.conf。
22. hibernate – 如果你的系统支持休眠,把它打开,否则它对你没用。
23. hotkey-setup – 此守护进程为你的笔记本建立一些热键映射。支持的制造商包括:HP, Acer, ASUS, Sony, Dell, 和IBM。如果你有那些品牌的笔记本,你可以打开它,否则它或许对你没有任何好处。
24. hotplug and hotplug-net #激活热插拔系统是费时的。我将考虑关掉它们。我在的/etc/network/interfaces文件作了很多修改,并将其设置为自动运行,而不是在 热插拔进程期间映射我的无线网卡。所以我可以将它们关掉。我已经测试过了,甚至我将它们关闭,ubuntu仍旧可以检测到我的usb驱动器,我的数码相 机,等等。所以我认为关掉它们是很安全的**注意**如果在关闭热插拔服务以后发现你的声卡部工作了,你可以将服务打开,或者编辑 /etc/modules文件并添加声卡驱动模块。经测试,后者比较快。
25. hplip – HP打印机和图形子系统,我将其关闭了。
26. ifrename – 网络接口重命名(network interface rename)脚本。听上去很酷但是我把它关掉了。主要用于管理多网络接口名称。虽然我有无线网卡和以太网卡,两者被内核标识为eth0和ath0,所以此服务对我不是很有用。
27. ifupdown and ifupdown-clean – 打开它,它们是开机时网络及口激活脚本。
28. inetd or inetd.real – 查看文件/etc/inetd.conf 注释掉所有你不需要的服务。如果该文件不包含任何服务,那关闭它是很安全的。
29. klogd – 打开它。
30. linux-restricted-modules-common – 你应该去查看下是否你的系统装载有任何受限制的模块。既然我需要madwifi ath_pci 模块,所以我将其开启。受限制的模块可以从/lib/linux-restricted-modules查看到。如果你发现你没有使用任何受限制的模块, 那关掉这个服务没事。
31. lvm – 我没有使用逻辑卷所以我将此服务关闭。让它开启如果你 *确实* 有lvm(lvm是逻辑卷管理器在此不再扩充).
32. makedev – 打开它。
33. mdamd – Raid管理工具。不使用Raid所以我将此服务关闭。
34. module-init-tools – 从/etc/modules加载扩展模块。你可以研究/etc/modules文件查看是否有一些你不需要的模块。通常我们将此服务开启。
35. networking – 在启动期间通过扫描/etc/network/interfaces文件增加网络接口和配置dns信息。让它开着。
36. ntpdate – 通过ubuntu时间服务器同步时间 。在开机的时候我不需要它,故我关掉了此服务。
37. nvidia-kernel – 我自己编译了nvidia驱动,所以此服务对我没用。如果你从受限制模块中使用nvidia驱动,那打开此服务。
38. pcmcia – 激活pcmica设备。我将此服务打开在S运行等级而不是分别在2,3,4,5运行等级打开此服务,因为我觉得起先让硬件设备准备更好。如果你在使用没有 pcmica卡的台式机的话,请关闭此服务。
39. portmap – 管理像nis,nfs等等之类服务的守护程序。如果你的笔记本或台式机是纯粹的客户端,那么关闭此服务。
40. powernowd – 管理CPU频率的客户端程序。主要用于支持CPU speed stepping技术的笔记本。通常如果你在配置一台笔记本,你应该开启此服务。如果是台式机,那此服务应该没有用。
41. ppp and ppp-dns – 对我没用,我不使用拨号。
42. readahead – **感谢 mr_pouit!** readahead似乎是一种“预加载程序”。在开机时它将一些库文件加载到内存,以便一些程序启动的更快。但是它给启动时间增加了3-4秒。所以,你可 以留着它…或者不。**更新**,经我测试我觉得加载程序没有什么不同。所以我决定关闭此服务。如果你有打开此服务的理由,那就打开它 。
43. reboot – 别更改它。
44. resolvconf – 按照你的网络状态自动配置DSN信息,我将它打开着。
45. rmnologin – 如果发现nologin,那么去除它。此情况不会在笔记本上面发生,所以我摆脱它。
46. rsync – rsync守护程序. 我不打算在我的笔记本上使用rsync协议,所以我将其关闭
47. sendsigs – 在重启和关机期间发送信号。顺其自然。
48. single – 激活单用户模式。顺其自然。
49. ssh – ssh守护程序。 我需要ssh,所以我将此服务打开。
50. stop-bootlogd – 从2,3,4,5运行等级停止bootlogd。顺其自然。
51. sudo – 检查sudo 状态。我没在一台笔记本或者台式机客户端上看到任何使用sudo的好处,因此我关闭了它。
52. sysklogd – 顺其自然。
53. udev and udev-mab – 用户空间dev文件系统(userspace dev filesystem)。好东西,我将它们打开。
54. umountfs – 顺其自然。
55. urandom – 随机数生成器。可能没什么用处,但是我留着它。
56. usplash – 嗯,如果你想看到漂亮的开机画面,顺其自然。无论如何沃关闭此服务了。如果你想关闭它,你也可以编辑/boot/grub/menu.lst文件注释掉splashimage行,除去开机 splash核心选项。
57. vbesave – 显卡BIOS配置工具。它能保存你显卡的状态。我将其开启。
58. xorg-common – 设置X服务ICE socket。我将其从在S运行等级开启移动到2,3,4,5,运行等级。如果我引导到单用户模式,那我不需要此服务。在最初引导期间这种方法将不占用时间。
59. adjtimex – 这也是调整核心hw时钟的工具。通常你不会在开机列表中看见它。在非常少有的情况如果你确实在开机进程中看见它了,事出有因,因此最好顺其自然。在我的情况里,它是关闭的。
60. dirmngr – 证书列表管理工具(certification lists management tool)。和gnupg一起工作。你必须看看你是否需要它。在我的情况里,我是关掉它的。
61. hwtools – 一个优化irqs的工具。不确定打开它的好处。在我的情况里,我是关掉它的。
62. libpam-devperm – 在系统崩溃之后用于修理设备文件许可的一个守护程序。听起来不错,因此我打开它了。
63. lm-sensors – 如果你的主板内建一些传感芯片,通过用户空间(userspace)查看hw状态可能是有帮助的。我运行了它,但是它提示“没有发现传感器”,因此我关闭了此服务。
64. mdadm-raid – 作用和mdadm服务相同。用来管RAID设备。如果你没有此类设备,那尽管关掉它好了。
65. screen-cleanup – 一个用来清除开机屏幕的脚本。嗯,是否关闭它有你决定。在我的情况里,我打开它了。
66. xinetd – 用来管理其他守护进程的一个inetd超级守护程序。在我的系统里,xinetd管理chargen, daytime, echo和time (在 /etc/xinetd.d 目录找到的),我不关系任何一个,因此我关掉了此服务。如果在xinetd下你确实有一些重要的服务,那打开它。

http://www.virtualbox.org/

sudo adduser billow vboxusers

2010年08月19日

|grep -v 反向选择

rm -fr [!s]* 删除当前目录下所有不以s 开头的文件(含文件夹)

2010年08月18日

* * * * * cmd
* * * * * (sleep 10 && cmd)
* * * * * (sleep 20 && cmd)
* * * * * (sleep 30 && cmd)
* * * * * (sleep 40 && cmd)
* * * * * (sleep 50 && cmd)

2010年08月13日

ps -eo pid,cmd,etime,lstart
或者ps -eo “%p %c %t”