<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>PT Ubuntu Blog &#187; shell</title>
	<atom:link href="http://www.ptubuntu.com/tag/shell/feed" rel="self" type="application/rss+xml" />
	<link>http://www.ptubuntu.com</link>
	<description>Ruijin to linux 生活中的每一点点滴滴……</description>
	<lastBuildDate>Mon, 30 Jan 2012 09:17:42 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Iptables 控制企业内部网络的安全</title>
		<link>http://www.ptubuntu.com/2009/08/3003.html</link>
		<comments>http://www.ptubuntu.com/2009/08/3003.html#comments</comments>
		<pubDate>Mon, 10 Aug 2009 15:51:04 +0000</pubDate>
		<dc:creator>ptubuntu</dc:creator>
				<category><![CDATA[iptables]]></category>
		<category><![CDATA[Linux Server]]></category>
		<category><![CDATA[shell]]></category>
		<category><![CDATA[Linux]]></category>

		<guid isPermaLink="false">http://www.ptubuntu.com/?p=3003</guid>
		<description><![CDATA[相信大家懂的Iptables吧.但是很多新手还不是很熟练.或是你还没有找到一个合适你模板.不过要先iptables那么你先要了解相关的基础本命令.那下面先了解一下.后面再给你介绍详细配置方案.配置基于debian. 先给你介绍的是网卡的设置这是一个关键: # ifconfig eth0      Link encap:Ethernet  HWaddr 00:e0:4c:c8:39:b9 inet addr:192.168.0.1  Bcast:192.168.0.255  Mask:255.255.255.0 inet6 addr: fe80::2e0:4cff:fec8:39b9/64 Scope:Link UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1 RX packets:502065636 errors:22329 dropped:21701 overruns:8006 frame:0 TX packets:401033134 errors:0 dropped:0 overruns:2 carrier:0 collisions:0 txqueuelen:1000 RX bytes:3487518346 (3.2 GiB)  TX bytes:2143557870 (1.9 GiB) Interrupt:5 Base address:0xd000 eth1      Link encap:Ethernet [...]]]></description>
			<content:encoded><![CDATA[<p>相信大家懂的Iptables吧.但是很多新手还不是很熟练.或是你还没有找到一个合适你模板.不过要先iptables那么你先要了解相关的基础本命令.那下面先了解一下.后面再给你介绍详细配置方案.配置基于debian.</p>
<p>先给你介绍的是网卡的设置这是一个关键:</p>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"># ifconfig</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">eth0      Link encap:Ethernet  HWaddr 00:e0:4c:c8:39:b9</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">inet addr:192.168.0.1  Bcast:192.168.0.255  Mask:255.255.255.0</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">inet6 addr: fe80::2e0:4cff:fec8:39b9/64 Scope:Link</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">RX packets:502065636 errors:22329 dropped:21701 overruns:8006 frame:0</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">TX packets:401033134 errors:0 dropped:0 overruns:2 carrier:0</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">collisions:0 txqueuelen:1000</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">RX bytes:3487518346 (3.2 GiB)  TX bytes:2143557870 (1.9 GiB)</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Interrupt:5 Base address:0xd000</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">eth1      Link encap:Ethernet  HWaddr 00:d0:4c:bf:64:7b</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">inet addr:59.58.97.2  Bcast:59.58.97.7  Mask:255.255.255.248</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">inet6 addr: fe80::2d0:4cff:febf:647b/64 Scope:Link</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">RX packets:406220891 errors:50131 dropped:38667 overruns:17485 frame:0</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">TX packets:505473378 errors:0 dropped:0 overruns:1 carrier:0</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">collisions:0 txqueuelen:1000</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">RX bytes:1976175154 (1.8 GiB)  TX bytes:3851143830 (3.5 GiB)</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Interrupt:10 Base address:0xb800</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">eth2      Link encap:Ethernet  HWaddr 00:ee:b1:02:55:91</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">inet addr:192.168.9.1  Bcast:192.168.9.255  Mask:255.255.255.0</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">inet6 addr: fe80::2ee:b1ff:fe02:5591/64 Scope:Link</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">RX packets:439427 errors:1892 dropped:1776 overruns:724 frame:0</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">TX packets:273258 errors:0 dropped:0 overruns:0 carrier:0</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">collisions:0 txqueuelen:1000</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">RX bytes:616630361 (588.0 MiB)  TX bytes:22112074 (21.0 MiB)</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Interrupt:11 Base address:0xb400</div>
<p>ptubuntu.com# ifconfig</p>
<blockquote><p><span style="color: #ff0000;">eth0</span> Link encap:Ethernet  HWaddr 00:e0:pt:ub:un:tu</p>
<p>inet addr:<span style="color: #ff0000;">192.168.0.1</span> Bcast:192.168.0.255  Mask:255.255.255.0</p>
<p><span style="color: #ff0000;">eth1</span> Link encap:Ethernet  HWaddr 00:e0:pt:ub:un:tu</p>
<p>inet addr:<span style="color: #ff0000;">58.58.98.8</span> Bcast:58.58.98.8   Mask:255.255.255.248</p>
<p><span style="color: #ff0000;">eth2</span> Link encap:Ethernet  HWaddr 00:e0:pt:ub:un:tu</p>
<p>inet addr:<span style="color: #ff0000;">192.168.9.1</span> Bcast:192.168.9.255  Mask:255.255.255.0</p>
<p><span style="color: #ff0000;"> 注:eht0,eht2 内网IP地址 eth1外网IP地址</span></p></blockquote>
<p>下面这个是配置iptables配置文档.</p>
<blockquote><p>ptubuntu.com#vi /etc/init.d/<a href="http://www.ptubuntu.com/tag/iptables" class="st_tag internal_tag" rel="tag" title="标签 iptables 下的日志">iptables</a></p></blockquote>
<p><span id="more-3003"></span></p>
<blockquote><p>#fLUSH THE FILTER,NAT,Mangle chain!</p>
<p>/sbin/iptables -F -t filter</p>
<p>/sbin/iptables -F -t nat</p>
<p>/sbin/iptables -F -t mangle</p>
<p>#Flush the user&#8217;s chain</p>
<p>/sbin/iptables -t filter -X</p>
<p>/sbin/iptables -t nat -X</p>
<p>/sbin/iptables -t mangle -X</p>
<p>#Set default policies to DROP</p>
<p>/sbin/iptables -P INPUT ACCEPT</p>
<p>/sbin/iptables -P OUTPUT ACCEPT</p>
<p>/sbin/iptables -P FORWARD ACCEPT</p>
<p>#LAN NAT  内网转外网.</p>
<p>/sbin/iptables -A POSTROUTING -t nat -s 192.168.0.0/255.255.255.0 -o eth1 -j MASQUERADE</p>
<p>#/sbin/iptables -A POSTROUTING -t nat -s 192.168.0.0/255.255.255.0 -o eth0 -j MASQUERADE</p>
<p>/sbin/iptables -A POSTROUTING -t nat -s 192.168.9.2 -o eth1 -j MASQUERADE</p>
<p>#Drop Web Server  阻止外网的IP地址.</p>
<p>/sbin/iptables -A FORWARD -i eth0 -p tcp -d 218.5.00.116 -j DROP</p>
<p>#Drop out 80 port (FORWARD -i <span style="font-family: Verdana; line-height: 15px; ">-i -in-interface [!] [name]</span></p>
<p><span style="font-family: Verdana; line-height: 15px; ">i -进入的（网络）接口 [!][名称]<br />
</span></p>
<p><span style="font-family: Verdana; line-height: 15px; ">这是包经由该接口接收的可选的入口名称，包通过该接口接收（在链INPUT、FORWORD和PREROUTING中进入的包）。当在接口名前使用”!”说明后，指的是相反的名称。如果接口名后面加上”+”，则所有以此接口名开头的接口都会被匹配。如果这个选项被忽略，会假设为”+”，那么将匹配任意接口。</span> )</p>
<p>#/sbin/iptables -A FORWARD -i eth0 -p tcp &#8211;dport 80 -j DROP</p>
<p>所以上面这行说明阻止任何80端口进入服务器.</p>
<p>if [ -f /etc/access_mac.conf ]</p>
<p>then</p>
<p>for i in `cat /etc/access_mac.conf | grep “^[^#]” | tr -s “[\012]” | cut -c1-17` ; do</p>
<p>/sbin/iptables -A FORWARD -m mac &#8211;mac-source $i -i eth0 -j ACCEPT</p>
<p>done</p>
<p>fi</p>
<p>上面这段是设置相关的mac地址.只有在这个mac地址的电脑才可以上网.这个主要是用shell语言写的.</p>
<p>/sbin/iptables -A FORWARD -i eth0 -j DROP</p>
<p>#Drop Incomeing Hacker</p>
<p>/sbin/iptables -A INPUT -s 202.194.0.0 -i eth1 -j DROP</p>
<p>#Http Services DNAT</p>
<p>/sbin/iptables -A PREROUTING -t nat -p tcp -m tcp -i eth0 -d 59.00.00.0 &#8211;dport 8080 -j DNAT &#8211;to-destination 192.168.0.2:80</p>
<div>这个是内部机器的端口转换.</div>
</blockquote>
<p><span style="color: #ff0000;">有关mac址地的格式.</span></p>
<p><span style="color: #ff0000;"> </span></p>
<blockquote><p><span style="color: #000000;">ptubuntu.com#/etc/access_mac.conf</span></p>
<p><span style="color: #000000;">#MAC address            Employee Name OR SERVER Name</span></p>
<p><span style="color: #000000;">#Server Netcard Mac Address</span></p>
<p><span style="color: #000000;">00:14:38:0d:00:00     test</span></p>
<p><span style="color: #000000;">00:e0:4c:00:00:01       System Server eth0</span></p>
<p><span style="color: #000000;">00:e0:4c:00:00:02       System Server eth1</span></p></blockquote>
<p>相关参考如下:<a href="http://www.ptubuntu.com/tag/shell" class="st_tag internal_tag" rel="tag" title="标签 shell 下的日志">shell</a> tr语法查看:<a href="http://www.chinaitpower.com/2005September/2005-09-13/204673.html">http://www.chinaitpower.com</a></p>
<blockquote><p><span style="line-height: 15px;"><span style="color: #008000;">IPtables命令详解</span></span></p>
<p><span style="color: #008000;">用iptables -ADC 来指定链的规则，-A添加 -D删除 -C 修改<br />
iptables - [RI] chain rule num rule-specification[option]<br />
用iptables - RI 通过规则的顺序指定</span></p>
<p><span style="color: #008000;">iptables -D chain rule num[option]<br />
删除指定规则<br />
iptables -[LFZ] [chain][option]<br />
用iptables -LFZ 链名 [选项]</span></p>
<p><span style="color: #008000;">iptables -[NX] chain<br />
用 -NX 指定链</span></p>
<p><span style="color: #008000;">iptables -P chain target[options]<br />
指定链的默认目标</span></p>
<p><span style="color: #008000;">iptables -E old-chain-name new-chain-name<br />
-E 旧的链名 新的链名<br />
用新的链名取代旧的链名<br />
说明<br />
Iptalbes 是用来设置、维护和检查Linux内核的IP包过滤规则的。<br />
可以定义不同的表，每个表都包含几个内部的链，也能包含用户定义的链。每个链都是一个规则列表，对对应的包进行匹配：每条规则指定应当如何处理与之相匹配的包。这被称作&#8217;target&#8217;（目标），也可以跳向同一个表内的用户定义的链。</span></p>
<p><span style="color: #008000;">TARGETS<br />
防火墙的规则指定所检查包的特征，和目标。如果包不匹配，将送往该链中下一条规则检查；如果匹配,那么下一条规则由目标值确定.该目标值可以是用户定义的链名,或是某个专用值,如ACCEPT[通过], DROP[删除], QUEUE[排队], 或者 RETURN[返回]。<br />
ACCEPT 表示让这个包通过。DROP表示将这个包丢弃。QUEUE表示把这个包传递到用户空间。RETURN表示停止这条链的匹配，到前一个链的规则重新开始。如果到达了一个内建的链(的末端)，或者遇到内建链的规则是RETURN，包的命运将由链准则指定的目标决定。</span></p>
<p><span style="color: #008000;">TABLES<br />
当前有三个表（哪个表是当前表取决于内核配置选项和当前模块)。<br />
-t table<br />
这个选项指定命令要操作的匹配包的表。如果内核被配置为自动加载模块，这时若模块没有加载，(系统)将尝试(为该表)加载适合的模块。这些表如下：filter,这是默认的表，包含了内建的链INPUT（处理进入的包）、FORWORD（处理通过的包）和OUTPUT（处理本地生成的包）。nat,这个表被查询时表示遇到了产生新的连接的包,由三个内建的链构成：PREROUTING (修改到来的包)、OUTPUT（修改路由之前本地的包）、POSTROUTING（修改准备出去的包）。mangle 这个表用来对指定的包进行修改。它有两个内建规则：PREROUTING（修改路由之前进入的包）和OUTPUT（修改路由之前本地的包）。<br />
OPTIONS<br />
这些可被iptables识别的选项可以区分不同的种类。</span></p>
<p><span style="color: #008000;">COMMANDS<br />
这些选项指定执行明确的动作：若指令行下没有其他规定,该行只能指定一个选项.对于长格式的命令和选项名,所用字母长度只要保证iptables能从其他选项中区分出该指令就行了。<br />
-A -append<br />
在所选择的链末添加一条或更多规则。当源（地址）或者/与 目的（地址）转换为多个地址时，这条规则会加到所有可能的地址(组合)后面。</span></p>
<p><span style="color: #008000;">-D -delete<br />
从所选链中删除一条或更多规则。这条命令可以有两种方法：可以把被删除规则指定为链中的序号(第一条序号为1),或者指定为要匹配的规则。</span></p>
<p><span style="color: #008000;">-R -replace<br />
从选中的链中取代一条规则。如果源（地址）或者/与 目的（地址）被转换为多地址，该命令会失败。规则序号从1开始。</span></p>
<p><span style="color: #008000;">-I -insert<br />
根据给出的规则序号向所选链中插入一条或更多规则。所以，如果规则序号为1，规则会被插入链的头部。这也是不指定规则序号时的默认方式。</span></p>
<p><span style="color: #008000;">-L -list<br />
显示所选链的所有规则。如果没有选择链，所有链将被显示。也可以和z选项一起使用，这时链会被自动列出和归零。精确输出受其它所给参数影响。</span></p>
<p><span style="color: #008000;">-F -flush<br />
清空所选链。这等于把所有规则一个个的删除。</span></p>
<p><span style="color: #008000;">&#8211;Z -zero<br />
把所有链的包及字节的计数器清空。它可以和 -L配合使用，在清空前察看计数器，请参见前文。</span></p>
<p><span style="color: #008000;">-N -new-chain<br />
根据给出的名称建立一个新的用户定义链。这必须保证没有同名的链存在。</span></p>
<p><span style="color: #008000;">-X -delete-chain<br />
删除指定的用户自定义链。这个链必须没有被引用，如果被引用，在删除之前你必须删除或者替换与之有关的规则。如果没有给出参数，这条命令将试着删除每个非内建的链。</span></p>
<p><span style="color: #008000;">-P -policy<br />
设置链的目标规则。</span></p>
<p><span style="color: #008000;">-E -rename-chain<br />
根据用户给出的名字对指定链进行重命名，这仅仅是修饰，对整个表的结构没有影响。TARGETS参数给出一个合法的目标。只有非用户自定义链可以使用规则，而且内建链和用户自定义链都不能是规则的目标。</span></p>
<p><span style="color: #008000;">-h Help.<br />
帮助。给出当前命令语法非常简短的说明。</span></p>
<p><span style="color: #008000;">PARAMETERS<br />
参数<br />
以下参数构成规则详述，如用于add、delete、replace、append 和 check命令。</span></p>
<p><span style="color: #008000;">-p -protocal [!]protocol<br />
规则或者包检查(待检查包)的协议。指定协议可以是tcp、udp、icmp中的一个或者全部，也可以是数值，代表这些协议中的某一个。当然也可以使用在/etc/protocols中定义的协议名。在协议名前加上”!”表示相反的规则。数字0相当于所有all。Protocol all会匹配所有协议，而且这是缺省时的选项。在和check命令结合时，all可以不被使用。<br />
-s -source [!] address[/mask]<br />
指定源地址，可以是主机名、网络名和清楚的IP地址。mask说明可以是网络掩码或清楚的数字，在网络掩码的左边指定网络掩码左边”1&#8243;的个数，因此，mask值为24等于255.255.255.0。在指定地址前加上”!”说明指定了相反的地址段。标志 &#8211;src 是这个选项的简写。</span></p>
<p><span style="color: #008000;">-d &#8211;destination [!] address[/mask]<br />
指定目标地址，要获取详细说明请参见 -s标志的说明。标志 &#8211;dst 是这个选项的简写。</span></p>
<p><span style="color: #008000;">-j &#8211;jump target<br />
-j 目标跳转<br />
指定规则的目标；也就是说，如果包匹配应当做什么。目标可以是用户自定义链（不是这条规则所在的），某个会立即决定包的命运的专用内建目标，或者一个扩展（参见下面的EXTENSIONS）。如果规则的这个选项被忽略，那么匹配的过程不会对包产生影响，不过规则的计数器会增加。</span></p>
<p><span style="color: #008000;">-i -in-interface [!] [name]<br />
i -进入的（网络）接口 [!][名称]<br />
这是包经由该接口接收的可选的入口名称，包通过该接口接收（在链INPUT、FORWORD和PREROUTING中进入的包）。当在接口名前使用”!”说明后，指的是相反的名称。如果接口名后面加上”+”，则所有以此接口名开头的接口都会被匹配。如果这个选项被忽略，会假设为”+”，那么将匹配任意接口。</span></p>
<p><span style="color: #008000;">-o &#8211;out-interface [!][name]<br />
-o &#8211;输出接口[名称]<br />
这是包经由该接口送出的可选的出口名称，包通过该口输出（在链FORWARD、OUTPUT和POSTROUTING中送出的包）。当在接口名前使用”!”说明后，指的是相反的名称。如果接口名后面加上”+”，则所有以此接口名开头的接口都会被匹配。如果这个选项被忽略，会假设为”+”，那么将匹配所有任意接口。</span></p>
<p><span style="color: #008000;">[!] -f, &#8211;fragment<br />
[!] -f &#8211;分片<br />
这意味着在分片的包中，规则只询问第二及以后的片。自那以后由于无法判断这种把包的源端口或目标端口（或者是ICMP类型的），这类包将不能匹配任何指定对他们进行匹配的规则。如果”!”说明用在了”-f”标志之前，表示相反的意思。</span></p>
<p><span style="color: #008000;">OTHER OPTIONS<br />
其他选项<br />
还可以指定下列附加选项：</span></p>
<p><span style="color: #008000;">-v &#8211;verbose<br />
-v &#8211;详细<br />
详细输出。这个选项让list命令显示接口地址、规则选项（如果有）和TOS（Type of Service）掩码。包和字节计数器也将被显示，分别用K、M、G(前缀)表示1000、1,000,000和1,000,000,000倍（不过请参看-x标志改变它），对于添加,插入,删除和替换命令，这会使一个或多个规则的相关详细信息被打印。</span></p>
<p><span style="color: #008000;">-n &#8211;numeric<br />
-n &#8211;数字<br />
数字输出。IP地址和端口会以数字的形式打印。默认情况下，程序试显示主机名、网络名或者服务（只要可用）。</span></p>
<p><span style="color: #008000;">-x -exact<br />
-x -精确<br />
扩展数字。显示包和字节计数器的精确值，代替用K,M,G表示的约数。这个选项仅能用于 -L 命令。</span></p>
<p><span style="color: #008000;">&#8211;line-numbers<br />
当列表显示规则时，在每个规则的前面加上行号，与该规则在链中的位置相对应。</span></p>
<p><span style="color: #008000;">MATCH EXTENSIONS<br />
对应的扩展<br />
iptables能够使用一些与模块匹配的扩展包。以下就是含于基本包内的扩展包，而且他们大多数都可以通过在前面加上!来表示相反的意思。</span></p>
<p><span style="color: #008000;">tcp<br />
当 &#8211;protocol tcp 被指定,且其他匹配的扩展未被指定时,这些扩展被装载。它提供以下选项：</span></p>
<p><span style="color: #008000;">&#8211;source-port [!] [port[:port]]<br />
源端口或端口范围指定。这可以是服务名或端口号。使用格式端口：端口也可以指定包含的（端口）范围。如果首端口号被忽略，默认是”0&#8243;，如果末端口号被忽略，默认是”65535&#8243;，如果第二个端口号大于第一个，那么它们会被交换。这个选项可以使用 &#8211;sport的别名。</span></p>
<p><span style="color: #008000;">&#8211;destionation-port [!] [port:[port]]<br />
目标端口或端口范围指定。这个选项可以使用 &#8211;dport别名来代替。</span></p>
<p><span style="color: #008000;">&#8211;tcp-flags [!] mask comp<br />
匹配指定的TCP标记。第一个参数是我们要检查的标记，一个用逗号分开的列表，第二个参数是用逗号分开的标记表,是必须被设置的。标记如下：SYN ACK FIN RST URG PSH ALL NONE。因此这条命令：iptables -A FORWARD -p tcp &#8211;tcp-flags SYN, ACK, FIN, RST SYN只匹配那些SYN标记被设置而ACK、FIN和RST标记没有设置的包。</span></p>
<p><span style="color: #008000;">[!] &#8211;syn<br />
只匹配那些设置了SYN位而清除了ACK和FIN位的TCP包。这些包用于TCP连接初始化时发出请求；例如，大量的这种包进入一个接口发生堵塞时会阻止进入的TCP连接，而出去的TCP连接不会受到影响。这等于 &#8211;tcp-flags SYN, RST, ACK SYN。如果”&#8211;syn”前面有”!”标记，表示相反的意思。</span></p>
<p><span style="color: #008000;">&#8211;tcp-option [!] number<br />
匹配设置了TCP选项的。</span></p>
<p><span style="color: #008000;">udp<br />
当protocol udp 被指定,且其他匹配的扩展未被指定时,这些扩展被装载,它提供以下选项：</span></p>
<p><span style="color: #008000;">&#8211;source-port [!] [port:[port]]<br />
源端口或端口范围指定。详见 TCP扩展的&#8211;source-port选项说明。</span></p>
<p><span style="color: #008000;">&#8211;destination-port [!] [port:[port]]<br />
目标端口或端口范围指定。详见 TCP扩展的&#8211;destination-port选项说明。</span></p>
<p><span style="color: #008000;">icmp<br />
当protocol icmp被指定,且其他匹配的扩展未被指定时,该扩展被装载。它提供以下选项：<br />
&#8211;icmp-type [!] typename<br />
这个选项允许指定ICMP类型，可以是一个数值型的ICMP类型，或者是某个由命令iptables -p icmp -h所显示的ICMP类型名。</span></p>
<p><span style="color: #008000;">mac<br />
&#8211;mac-source [!] address<br />
匹配物理地址。必须是XX:XX:XX:XX:XX这样的格式。注意它只对来自以太设备并进入PREROUTING、FORWORD和INPUT链的包有效。</span></p>
<p><span style="color: #008000;">limit<br />
这个模块匹配标志用一个标记桶过滤器一一定速度进行匹配,它和LOG目标结合使用来给出有限的登陆数.当达到这个极限值时,使用这个扩展包的规则将进行匹配.(除非使用了”!”标记)</span></p>
<p><span style="color: #008000;">&#8211;limit rate<br />
最大平均匹配速率：可赋的值有&#8217;/second&#8217;, &#8217;/minute&#8217;, &#8217;/hour&#8217;, or &#8217;/day&#8217;这样的单位，默认是3/hour。</span></p>
<p><span style="color: #008000;">&#8211;limit-burst number<br />
待匹配包初始个数的最大值:若前面指定的极限还没达到这个数值,则概数字加1.默认值为5</span></p>
<p><span style="color: #008000;">multiport<br />
这个模块匹配一组源端口或目标端口,最多可以指定15个端口。只能和-p tcp 或者 -p udp 连着使用。</span></p>
<p><span style="color: #008000;">&#8211;source-port [port[, port]]<br />
如果源端口是其中一个给定端口则匹配</span></p>
<p><span style="color: #008000;">&#8211;destination-port [port[, port]]<br />
如果目标端口是其中一个给定端口则匹配</span></p>
<p><span style="color: #008000;">&#8211;port [port[, port]]<br />
若源端口和目的端口相等并与某个给定端口相等,则匹配。<br />
mark<br />
这个模块和与netfilter过滤器标记字段匹配（就可以在下面设置为使用MARK标记）。</span></p>
<p><span style="color: #008000;">&#8211;mark value [/mask]<br />
匹配那些无符号标记值的包（如果指定mask，在比较之前会给掩码加上逻辑的标记）。</span></p>
<p><span style="color: #008000;">owner<br />
此模块试为本地生成包匹配包创建者的不同特征。只能用于OUTPUT链，而且即使这样一些包（如ICMP ping应答）还可能没有所有者，因此永远不会匹配。</span></p>
<p><span style="color: #008000;">&#8211;uid-owner userid<br />
如果给出有效的user id，那么匹配它的进程产生的包。</span></p>
<p><span style="color: #008000;">&#8211;gid-owner groupid<br />
如果给出有效的group id，那么匹配它的进程产生的包。</span></p>
<p><span style="color: #008000;">&#8211;sid-owner seessionid<br />
根据给出的会话组匹配该进程产生的包。</span></p>
<p><span style="color: #008000;">state<br />
此模块，当与连接跟踪结合使用时，允许访问包的连接跟踪状态。</span></p>
<p><span style="color: #008000;">&#8211;state state<br />
这里state是一个逗号分割的匹配连接状态列表。可能的状态是:INVALID表示包是未知连接，ESTABLISHED表示是双向传送的连接，NEW表示包为新的连接，否则是非双向传送的，而RELATED表示包由新连接开始，但是和一个已存在的连接在一起，如FTP数据传送，或者一个ICMP错误。</span></p>
<p><span style="color: #008000;">unclean<br />
此模块没有可选项，不过它试着匹配那些奇怪的、不常见的包。处在实验中。</span></p>
<p><span style="color: #008000;">tos<br />
此模块匹配IP包首部的8位tos（服务类型）字段（也就是说，包含在优先位中）。</span></p>
<p><span style="color: #008000;">&#8211;tos tos<br />
这个参数可以是一个标准名称，（用iptables -m tos -h 察看该列表），或者数值。</span></p>
<p><span style="color: #008000;">TARGET EXTENSIONS<br />
iptables可以使用扩展目标模块：以下都包含在标准版中。</span></p>
<p><span style="color: #008000;">LOG<br />
为匹配的包开启内核记录。当在规则中设置了这一选项后，linux内核会通过printk()打印一些关于全部匹配包的信息（诸如IP包头字段等）。<br />
&#8211;log-level level<br />
记录级别（数字或参看 syslog.conf(5)）。<br />
&#8211;log-prefix prefix<br />
在纪录信息前加上特定的前缀：最多14个字母长，用来和记录中其他信息区别。</span></p>
<p><span style="color: #008000;">&#8211;log-tcp-sequence<br />
记录TCP序列号。如果记录能被用户读取那么这将存在安全隐患。</span></p>
<p><span style="color: #008000;">&#8211;log-tcp-options<br />
记录来自TCP包头部的选项。<br />
&#8211;log-ip-options<br />
记录来自IP包头部的选项。</span></p>
<p><span style="color: #008000;">MARK<br />
用来设置包的netfilter标记值。只适用于mangle表。</span></p>
<p><span style="color: #008000;">&#8211;set-mark mark</span></p>
<p><span style="color: #008000;">REJECT<br />
作为对匹配的包的响应，返回一个错误的包：其他情况下和DROP相同。</span></p>
<p><span style="color: #008000;">此目标只适用于INPUT、FORWARD和OUTPUT链，和调用这些链的用户自定义链。这几个选项控制返回的错误包的特性：</span></p>
<p><span style="color: #008000;">&#8211;reject-with type<br />
Type可以是icmp-net-unreachable、icmp-host-unreachable、icmp-port-nreachable、icmp-proto-unreachable、 icmp-net-prohibited 或者 icmp-host-prohibited，该类型会返回相应的ICMP错误信息（默认是port-unreachable）。选项 echo-reply也是允许的；它只能用于指定ICMP ping包的规则中，生成ping的回应。最后，选项tcp-reset可以用于在INPUT链中,或自INPUT链调用的规则，只匹配TCP协议：将回应一个TCP RST包。<br />
TOS<br />
用来设置IP包的首部八位tos。只能用于mangle表。</span></p>
<p><span style="color: #008000;">&#8211;set-tos tos<br />
你可以使用一个数值型的TOS 值，或者用iptables -j TOS -h 来查看有效TOS名列表。<br />
MIRROR<br />
这是一个试验示范目标，可用于转换IP首部字段中的源地址和目标地址，再传送该包,并只适用于INPUT、FORWARD和OUTPUT链，以及只调用它们的用户自定义链。</span></p>
<p><span style="color: #008000;">SNAT<br />
这个目标只适用于nat表的POSTROUTING链。它规定修改包的源地址（此连接以后所有的包都会被影响），停止对规则的检查，它包含选项：</span></p>
<p><span style="color: #008000;">&#8211;to-source [:port-port]<br />
可以指定一个单一的新的IP地址，一个IP地址范围，也可以附加一个端口范围（只能在指定-p tcp 或者-p udp的规则里）。如果未指定端口范围，源端口中512以下的（端口）会被安置为其他的512以下的端口；512到1024之间的端口会被安置为1024以下的，其他端口会被安置为1024或以上。如果可能，端口不会被修改。</span></p>
<p><span style="color: #008000;">&#8211;to-destiontion [:port-port]<br />
可以指定一个单一的新的IP地址，一个IP地址范围，也可以附加一个端口范围（只能在指定-p tcp 或者-p udp的规则里）。如果未指定端口范围，目标端口不会被修改。</span></p>
<p><span style="color: #008000;">MASQUERADE<br />
只用于nat表的POSTROUTING链。只能用于动态获取IP（拨号）连接：如果你拥有静态IP地址，你要用SNAT。伪装相当于给包发出时所经过接口的IP地址设置一个映像，当接口关闭连接会终止。这是因为当下一次拨号时未必是相同的接口地址（以后所有建立的连接都将关闭）。它有一个选项：</span></p>
<p><span style="color: #008000;">&#8211;to-ports<br />
指定使用的源端口范围，覆盖默认的SNAT源地址选择（见上面）。这个选项只适用于指定了-p tcp或者-p udp的规则。</span></p>
<p><span style="color: #008000;">REDIRECT<br />
只适用于nat表的PREROUTING和OUTPUT链，和只调用它们的用户自定义链。它修改包的目标IP地址来发送包到机器自身（本地生成的包被安置为地址127.0.0.1）。它包含一个选项：</span></p>
<p><span style="color: #008000;">&#8211;to-ports<br />
指定使用的目的端口或端口范围：不指定的话，目标端口不会被修改。只能用于指定了-p tcp 或 -p udp的规则。</span></p>
<p><span style="color: #008000;">DIAGNOSTICS<br />
诊断<br />
不同的错误信息会打印成标准错误：退出代码0表示正确。类似于不对的或者滥用的命令行参数错误会返回错误代码2，其他错误返回代码为1。</span></p>
<p><span style="color: #008000;">BUGS<br />
臭虫<br />
Check is not implemented (yet).<br />
检查还未完成。</span></p>
<p><span style="color: #008000;">COMPATIBILITY WITH IPCHAINS<br />
与ipchains的兼容性<br />
iptables和Rusty Russell的ipchains非常相似。主要区别是INPUT 链只用于进入本地主机的包,而OUTPUT只用于自本地主机生成的包。因此每个包只经过三个链的一个；以前转发的包会经过所有三个链。其他主要区别是 -i 引用进入接口；-o引用输出接口，两者都适用于进入FORWARD链的包。当和可选扩展模块一起使用默认过滤器表时，iptables是一个纯粹的包过滤器。这能大大减少以前对IP伪装和包过滤结合使用的混淆，所以以下选项作了不同的处理：<br />
-j MASQ<br />
-M -S<br />
-M -L<br />
在iptables中有几个不同的链。</span></p>
<p><span style="color: #008000;">看完那么多.那你还需要再看一些命吧&#8230;&#8230;接下看.</span></p>
<p><span style="color: #008000;">Iptables 命令使用举例<br />
1、链的基本操作 </span></p>
<p><span style="color: #008000;">（1） 清除所有规则</span></p>
<p><span style="color: #008000;">1）          清除预设表filter中所有规则链中的规则</span></p>
<p><span style="color: #008000;"># iptables –F</span></p>
<p><span style="color: #008000;">2) 清除预设表filter中使用者自定链中的规则</span></p>
<p><span style="color: #008000;"># iptables –X</span></p>
<p><span style="color: #008000;">3)将指定链中所有规则的包字节计数器清零</span></p>
<p><span style="color: #008000;">#  iptables –Z</span></p>
<p><span style="color: #008000;">(2)设置链的默认策略</span></p>
<p><span style="color: #008000;">1）先允许，再禁止</span></p>
<p><span style="color: #008000;">用下面的命令初始化</span></p>
<p><span style="color: #008000;"># iptables –P INPUT  ACCEPT</span></p>
<p><span style="color: #008000;"># iptables –P OUTPUT  ACCEPT</span></p>
<p><span style="color: #008000;"># iptables –P FORWARD  ACCEPT</span></p>
<p><span style="color: #008000;">2）          先禁止，再允许</span></p>
<p><span style="color: #008000;">用下面的命令初始化</span></p>
<p><span style="color: #008000;"># iptables –P INPUT  DROP</span></p>
<p><span style="color: #008000;"># iptables –P OUTPUT  DROP</span></p>
<p><span style="color: #008000;"># iptables –P FORWARD  DROP</span></p>
<p><span style="color: #008000;">（3）列出表/链中的所有规则</span></p>
<p><span style="color: #008000;"># iptables –L –n</span></p>
<p><span style="color: #008000;">（4）向链中添加规则。下面的语句用于开放网络接口</span></p>
<p><span style="color: #008000;">#  iptables –A INPUT –i lo –j ACCEPT</span></p>
<p><span style="color: #008000;">#  iptables –A OUTPUT –o lo –j ACCEPT</span></p>
<p><span style="color: #008000;">#  iptables –A INPUT –i eth0 –j ACCEPT</span></p>
<p><span style="color: #008000;">#  iptables –A OUTPUT –o eth0 –j ACCEPT</span></p>
<p><span style="color: #008000;">#  iptables –A FORWARD –i eth0 –j ACCEPT</span></p>
<p><span style="color: #008000;">#  iptables –A FORWARD –o eth0 –j ACCEPT</span></p>
<p><span style="color: #008000;">（5）使用用户自定义链</span></p>
<p><span style="color: #008000;">#  iptables –N custom</span></p>
<p><span style="color: #008000;">#  iptables –A custom –s 0/0 –d 0/0 –p icmp –j DROP</span></p>
<p><span style="color: #008000;">#  iptables –A INPUT –s 0/0 –d 0/0 –j custom </span></p>
<p><span style="color: #008000;">2、设置基本的规则匹配（忽略目标动作）<br />
（1） 指定协议匹配</span></p>
<p><span style="color: #008000;">1）          匹配指定的协议</span></p>
<p><span style="color: #008000;">#  iptables –A INPUT –p tcp</span></p>
<p><span style="color: #008000;">2）          匹配指定协议之外的所有协议</span></p>
<p><span style="color: #008000;">#  iptables –A INPUT –p ! tcp</span></p>
<p><span style="color: #008000;">（2） 指定地址匹配</span></p>
<p><span style="color: #008000;">1）          指定匹配的主机</span></p>
<p><span style="color: #008000;">#  iptables –A INPUT –s 192.168.0.1</span></p>
<p><span style="color: #008000;">2）          指定匹配的网络</span></p>
<p><span style="color: #008000;">#  iptables –A INPUT –s 192.168.0.0/24</span></p>
<p><span style="color: #008000;">3）          匹配指定主机之外的地址</span></p>
<p><span style="color: #008000;">#  iptables –A INPUT –s ! 192.168.0.1</span></p>
<p><span style="color: #008000;">4）          匹配指定网络之外的网络</span></p>
<p><span style="color: #008000;">#  iptables –A INPUT –s ! 192.168.0.1/24</span></p>
<p><span style="color: #008000;">（3） 指定网络接口匹配</span></p>
<p><span style="color: #008000;">1）          指定单一的网络接口匹配</span></p>
<p><span style="color: #008000;">#  iptables –A INPUT –i eth0</span></p>
<p><span style="color: #008000;">#  iptables –A FORWARD –o eth0</span></p>
<p><span style="color: #008000;">2）          指定同类型的网络接口匹配</span></p>
<p><span style="color: #008000;">#  iptables –A FORWARD –o ppp+</span></p>
<p><span style="color: #008000;">（4） 指定端口匹配</span></p>
<p><span style="color: #008000;">1）          指定单一的端口匹配</span></p>
<p><span style="color: #008000;">#  iptables –A INPUT –p tcp –sport wwww</span></p>
<p><span style="color: #008000;">#  iptables –A INPUT –p tcp –sport 80</span></p>
<p><span style="color: #008000;">#  iptables –A INPUT –p udp –sport 53</span></p>
<p><span style="color: #008000;">#  iptables –A INPUT –p udp –dport 53</span></p>
<p><span style="color: #008000;">2）          匹配指定端口之外的端口</span></p>
<p><span style="color: #008000;">#  iptables –A INPUT –p tcp –dport !22</span></p>
<p><span style="color: #008000;">3）          匹配指定的端口范围</span></p>
<p><span style="color: #008000;">#  ipbables –A INPUT –p tcp –sport 22:80</span></p>
<p><span style="color: #008000;">4）          匹配ICMP端口和ICMP 类型</span></p>
<p><span style="color: #008000;">#  iptables –A INPUT –p icmp-type 8</span></p>
<p><span style="color: #008000;">（5） 指定IP碎片</span></p>
<p><span style="color: #008000;">#  iptables –A FORWARD –p tcp –s 192.168.0.0/24 –d 192.168.2.100 –dport 80 –f ACCEPT</span></p>
<p><span style="color: #008000;">#  iptables –A FORWARD –f –s 192.168.0.0/24 –d 192.168.2.100 –j ACCEPT<br />
3、设置扩展的规则匹配（忽略目标动作）（1）多端口匹配扩展</span></p>
<p><span style="color: #008000;">1）匹配多个源端口</span></p>
<p><span style="color: #008000;">#  iptables –A INPUT –p tcp –m multiport –source-port 22,53,80,110</span></p>
<p><span style="color: #008000;">2）匹配多个目的端口</span></p>
<p><span style="color: #008000;">#  iptables –A INPUT –p tcp –m multiport –destination-port 22,53,80,110</span></p>
<p><span style="color: #008000;">3）匹配多个端口</span></p>
<p><span style="color: #008000;">#  iptables –A INPUT –p tcp –m multiport –prot 22,53,80,110</span></p>
<p><span style="color: #008000;">（2）指定TCP匹配扩展</span></p>
<p><span style="color: #008000;">通过使用&#8211;tcp-flags 选项可以根据TCP包的标志位进行过滤，第一个参数为要检查的标志位；第二个参数是标志位为1的标志</span></p>
<p><span style="color: #008000;">#  iptables –A INPUT –p tcp &#8211;tcp-flags SYN,FIN,ACK SYN</span></p>
<p><span style="color: #008000;">#  iptables –p tcp &#8211;syn</span></p>
<p><span style="color: #008000;">表示SYN、ACK、FIN的标志都要检查，但是只有设置了SYN的才匹配</span></p>
<p><span style="color: #008000;"># iptables –A INPUT –p tcp &#8211;tcp-flags ALL SYN,ACK</span></p>
<p><span style="color: #008000;">表示ALL（SYN，ACK，FIN，RST，USG，PSH）的标志都要检查，但是只有设置了SYN和ACK的才匹配</span></p>
<p><span style="color: #008000;">（3）limit速率匹配扩展</span></p>
<p><span style="color: #008000;">1）指定单位时间内允许通过的数据包个数</span></p>
<p><span style="color: #008000;"># iptables –A INPUT –m limit &#8211;limit 300/hour</span></p>
<p><span style="color: #008000;">表示限制每小时允许通过300个数据包</span></p>
<p><span style="color: #008000;">2）指定触发事件的阀值（默认值是5）</span></p>
<p><span style="color: #008000;"># iptables –A INPUT –m limit &#8211;limit-burst 10</span></p>
<p><span style="color: #008000;">表示一次涌入的封包超过10个将被直接丢弃</span></p>
<p><span style="color: #008000;">3）同时指定速率限制和触发阀值</span></p>
<p><span style="color: #008000;"># iptables –A INPUT –p icmp –m limit –limit 3/m –limit-burst 3</span></p>
<p><span style="color: #008000;">以上命令参考内容来处<a href="http://www.blogjava.net/fanyingjie/archive/2009/03/02/257301.html">http://www.blogjava.net</a></span></p>
<p><span style="color: #008000;"><a href="http://blog.chinaunix.net/u/5591/showart_304835.html">http://blog.chinaunix.net/</a><!--more--><br />
</span></p></blockquote>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fwww.ptubuntu.com%2F2009%2F08%2F3003.html&amp;title=Iptables%20%E6%8E%A7%E5%88%B6%E4%BC%81%E4%B8%9A%E5%86%85%E9%83%A8%E7%BD%91%E7%BB%9C%E7%9A%84%E5%AE%89%E5%85%A8" id="wpa2a_2"><img src="http://www.ptubuntu.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://www.ptubuntu.com/2009/08/3003.html/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>shell函数脚本的调用</title>
		<link>http://www.ptubuntu.com/2008/12/865.html</link>
		<comments>http://www.ptubuntu.com/2008/12/865.html#comments</comments>
		<pubDate>Wed, 10 Dec 2008 09:09:34 +0000</pubDate>
		<dc:creator>ptubuntu</dc:creator>
				<category><![CDATA[Linux Server]]></category>
		<category><![CDATA[shell]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[技术类]]></category>

		<guid isPermaLink="false">http://www.ptubuntu.com/?p=865</guid>
		<description><![CDATA[函数脚本的调用. root@ptubuntu:/lib/lsb# vi init-functions 察看函数 set 设置hello设置调用. root@ptubuntu:~# vi func !/bin/bash #func . fun set   //设置查看函数 echo “now going to the unction hello ” hello echo “back from the function” 查看函数hello是否被调用. root@ptubuntu:~# ./func    // TERM=xterm UID=0 USER=root XDG_SESSION_COOKIE=20ffd3439e326b98eada2fc9492fb7e6-1228894566.802095-1306568828 _=fun hello () { echo “Hello,taday is `date`”;     //这段就可以看到正确的函数数被调用出来. return 0 } now going to the unction [...]]]></description>
			<content:encoded><![CDATA[<p>函数脚本的调用.<br />
root@ptubuntu:/lib/lsb# vi init-functions</p>
<p><strong>察看函数 set</strong></p>
<p><span style="color: #0000ff;">设置hello设置调用.</span></p>
<blockquote><p>root@ptubuntu:~# vi func<br />
!/bin/bash<br />
#func<br />
. fun<br />
<span style="color: #ff0000;">set   //设置查看函数</span><br />
echo “now going to the unction hello ”<br />
hello<br />
echo “back from the function”</p></blockquote>
<p><span style="color: #0000ff;">查看函数hello是否被调用.<br />
</span><span id="more-865"></span></p>
<blockquote><p>root@ptubuntu:~# ./func    /<span style="color: #ff0000;">/</span><br />
TERM=xterm<br />
UID=0<br />
USER=root<br />
XDG_SESSION_COOKIE=20ffd3439e326b98eada2fc9492fb7e6-1228894566.802095-1306568828<br />
_=fun<br />
<span style="color: #ff0000;">hello ()<br />
{<br />
echo “Hello,taday is `date`”;     //这段就可以看到正确的函数数被调用出来.<br />
return 0<br />
}</span><br />
now going to the unction hello<br />
Hello,taday is Wed Dec 10 03:24:17 EST 2008<br />
back from the function</p></blockquote>
<p><strong><span style="color: #0000ff;">删除函数 unset</span></strong></p>
<blockquote><p>#!/bin/bash<br />
#func<br />
. fun<br />
<span style="color: #ff0000;">unset hello  //设置土删除hello函数</span><br />
echo “now going to the unction hello ”<br />
hello<br />
echo “back from the function”</p></blockquote>
<p><span style="color: #0000ff;">查看函数hello是否被调用.</span></p>
<blockquote><p>root@ptubuntu:~# ./func<br />
now going to the unction hello<br />
<span style="color: #ff0000;">./func: line 6: hello: command not found    // 在这里报错.没有找到相关的hello函数</span><br />
back from the function</p></blockquote>
<p><span style="color: #0000ff;">正确例子hello函数的调用.</span></p>
<blockquote><p>root@ptubuntu:~# vi<span style="color: #ff0000;"> fun</span> //设置hello函数<br />
#!/bin/bash<br />
#hellfunctions<br />
<span style="color: #ff0000;">function hello ()</span><br />
{<br />
echo “Hello,taday is `date`”<br />
<span style="color: #ff0000;">return 0   //返回状态值为0是一般为正确值.</span><br />
}</p></blockquote>
<blockquote><p>root@ptubuntu:~# vi function   //程序调用hello函数<br />
#!/bin/bash<br />
#func<br />
<span style="color: #ff0000;">. fun</span> <span style="color: #ff0000;">//在这里指到上面要调用到函数的库名fun</span><br />
echo “now oging to the function hello”<br />
hello<br />
echo $?<br />
echo “back from the function”</p></blockquote>
<p><span style="color: #0000ff;">输入的结果:</span></p>
<blockquote><p>root@ptubuntu:~# ./function<br />
now oging to the function hello<br />
Hello,taday is Wed Dec 10 03:15:38 EST 2008<br />
0<br />
back from the function</p>
<p><!--more--></p></blockquote>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fwww.ptubuntu.com%2F2008%2F12%2F865.html&amp;title=shell%E5%87%BD%E6%95%B0%E8%84%9A%E6%9C%AC%E7%9A%84%E8%B0%83%E7%94%A8" id="wpa2a_4"><img src="http://www.ptubuntu.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://www.ptubuntu.com/2008/12/865.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>continue 使用</title>
		<link>http://www.ptubuntu.com/2008/11/558.html</link>
		<comments>http://www.ptubuntu.com/2008/11/558.html#comments</comments>
		<pubDate>Wed, 26 Nov 2008 02:37:29 +0000</pubDate>
		<dc:creator>ptubuntu</dc:creator>
				<category><![CDATA[Linux Server]]></category>
		<category><![CDATA[shell]]></category>

		<guid isPermaLink="false">http://ptubuntu.com/?p=558</guid>
		<description><![CDATA[这是一个很精典的例子.这是跳出.跟跳出循环.在你输入1-5选择输入.打印出你选择的是1-5之间的数字.如果你选择超过5或是其他任意值.那么会跳到下个循环Wrong number,continue (y/n),问你是否要续继.这样不断的循环. #breakout while : do         echo -n “Enter any number [1...5]:”         read ANS         case $ANS in         1&#124;2&#124;3&#124;4&#124;5)                 echo “you enter a number between 1 and 5!”                 ;;         *)                 echo -n “Wrong number,continue (y/n)?:”                 read IS_CONTINUE                 case $IS_CONTINUE in                  y&#124;yes&#124;Y&#124;Yes)                         continue                         [...]]]></description>
			<content:encoded><![CDATA[<p><span style="color: #000000;">这是一个很精典的例子.这是跳出.跟跳出循环.在你输入1-5选择输入.打印出你选择的是1-5之间的数字.如果你选择超过5或是其他任意值.那么会跳到下个循环Wrong number,continue (y/n),问你是否要续继.这样不断的循环.</span></p>
<blockquote><p>#breakout<br />
while :<br />
do<br />
        echo -n “Enter any number [1...5]:”<br />
        read ANS<br />
        <a href="http://www.ptubuntu.com/tag/case" class="st_tag internal_tag" rel="tag" title="标签 case 下的日志">case</a> $ANS in<br />
        1|2|3|4|5)<br />
                echo “you enter a number between 1 and 5!”<br />
                ;;<br />
        *)<br />
                echo -n “Wrong number,continue (y/n)?:”<br />
<span style="color: #ff0000;">                read IS_CONTINUE<br />
                case $IS_CONTINUE in<br />
                 y|yes|Y|Yes)<br />
                        continue<br />
                        ;;<br />
#这个就是定义跳出循环跟跳回到循环当中.只有输入Y/yes,才能跳回循环中.如果是N/no或是任意值都跳出这个循环.</span><br />
                 *)<br />
                        break<br />
                        ;;<br />
                esac<br />
        esac<br />
done</p></blockquote>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fwww.ptubuntu.com%2F2008%2F11%2F558.html&amp;title=continue%20%E4%BD%BF%E7%94%A8" id="wpa2a_6"><img src="http://www.ptubuntu.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://www.ptubuntu.com/2008/11/558.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>调度cron任务 精</title>
		<link>http://www.ptubuntu.com/2008/11/556.html</link>
		<comments>http://www.ptubuntu.com/2008/11/556.html#comments</comments>
		<pubDate>Wed, 26 Nov 2008 01:27:31 +0000</pubDate>
		<dc:creator>ptubuntu</dc:creator>
				<category><![CDATA[Linux Server]]></category>
		<category><![CDATA[shell]]></category>
		<category><![CDATA[crontabs]]></category>

		<guid isPermaLink="false">http://ptubuntu.com/?p=556</guid>
		<description><![CDATA[    系统管理员通常需要在每天，每周，每月做备份和运行其他的进程。虽然这些进程都可以手工运行，但是通常都需要安排它们自动运行。cron守护进程的作用就在与此。 1．编辑/usr/spool/cron/crontabs/root文件（以root用户执行。若以其它用户执行，则编辑相应文件名）， 按 minute hour day_of_month month weekday command 的格式加入行。 如 30     8    8            *     *       echo “Hello”  即每月8日8:30执行命令echo “Hello”。 2．ps –ef &#124; grep cron -&#62; kill -9 cron的进程号 3．/etc/cron （2、3即重启cron进程，无须重启系统）     一、与crontab相关的目录 1、/usr/lib/cron                cron服务主目录，主要包括以下：      /usr/lib/cron/cron.allow   允许cron服务的列表。      /usr/lib/cron/cron.deny    禁止cron服务的列表。       默认情况下，仅仅有cron.deny空文件。cron.allow不存在，如果建立了cron.allow则只有root用户可用crontab命令。如相关文件存在，则存在优先原则；*.allow优先于*.deny。cron.*文件格式：用户名一行行的加入。      /usr/lib/cron/queuedefs    cron 数据文件      /usr/lib/cron/FIFO         当新的作业提交由crontab完成时，一个发送消息到cron守护进程的命令管道      /usr/lib/cron/log               cron执行的log文件 2、/usr/spool/cron/crontabs   crontab表目录，包括所有开启cron服务的用户文件，以用户名为文件名。用户属性随意，组属性为cron。 3、/etc/default/cron             [...]]]></description>
			<content:encoded><![CDATA[<div>
<p><span style="color: #000000;"><span style="font-family: 宋体;">    系统管理员通常需要在每天，每周，每月做备份和运行其他的进程。虽然这些进程都可以手工运行，但是通常都需要安排它们自动运行。cron守护进程的作用就在与此。</span></span></p>
<p><span style="color: #000000;"><span style="font-family: 宋体;">1．编辑/usr/spool/cron/<a href="http://www.ptubuntu.com/tag/crontabs" class="st_tag internal_tag" rel="tag" title="标签 crontabs 下的日志">crontabs</a>/root文件（以root用户执行。若以其它用户执行，则编辑相应文件名），</span></span></p>
<div><span style="color: #000000;"><span style="font-family: 宋体;">按 <strong>minute hour day_of_month month weekday command</strong> 的格式加入行。</span></span></div>
<div><span style="color: #000000;"><span style="font-family: 宋体;">如 <strong>30     8    8            *     *       echo “Hello”</strong>  即每月8日8:30执行命令echo “Hello”。<br />
2．ps –ef | grep cron -&gt; kill -9 cron的进程号<br />
3．/etc/cron</span></span></div>
<div><span style="font-family: 宋体;">（2、3即重启cron进程，无须重启系统）</span></div>
<div>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"></span> </p>
</div>
<div> <span id="more-556"></span></div>
</div>
<div><span style="color: #000000; font-family: 宋体;"><strong>一、与crontab相关的目录<br />
</strong>1、/usr/lib/cron                cron服务主目录，主要包括以下：<br />
     /usr/lib/cron/cron.allow   允许cron服务的列表。<br />
     /usr/lib/cron/cron.deny    禁止cron服务的列表。<br />
      默认情况下，仅仅有cron.deny空文件。cron.allow不存在，如果建立了cron.allow则只有root用户可用crontab命令。如相关文件存在，则存在优先原则；*.allow优先于*.deny。cron.*文件格式：用户名一行行的加入。<br />
     /usr/lib/cron/queuedefs    cron 数据文件<br />
     /usr/lib/cron/FIFO         当新的作业提交由crontab完成时，一个发送消息到cron守护进程的命令管道<br />
     /usr/lib/cron/log               cron执行的log文件<br />
2、/usr/spool/cron/crontabs   crontab表目录，包括所有开启cron服务的用户文件，以用户名为文件名。用户属性随意，组属性为cron。<br />
3、/etc/default/cron              CRONLOG设置为YES,该值默认为NO,系统将自动生成相应的日志文件/usr/lib/cron/log。    在/etc/default/cron中MAXLOGSIZE 限制了log文件的大小,该变量以512字节为单位设定的log的最大块数，缺省为2048块。MAXCRON变量，控制在同一时刻允许运行的最大进程数量，缺省为100。</span></div>
<div> </div>
<div><span style="color: #000000; font-family: 宋体;"><strong>二、crontab表的默认值</strong><br />
PATH=/bin:/usr/bin:<br />
<a href="http://www.ptubuntu.com/tag/shell" class="st_tag internal_tag" rel="tag" title="标签 shell 下的日志">SHELL</a>=/bin/sh<br />
HOME<br />
LOGNAME<br />
同时默认%为行结束符。</span></div>
<div> </div>
<div><span style="color: #000000; font-family: 宋体;"><strong>三、crontab命令格式与文件格式。<br />
</strong>1、crontab命令的格式<br />
   crontab [ -u user ] [-e | -l | -r | File]<br />
    -e    编辑当前用户的crontab文件，如不存在，则启动编辑佳话来创建之。<br />
    -l     显示用户的crontab文件内容<br />
    -r    从crontabs目录中删除用户的crontab文件<br />
    -u user 用root权限修改相应用户的crontab表。<br />
   File 该命令首先对File的内容进行合法性检查，如有效，则copy到 /var/admn/cron/crontabs目录中，并以用户名为文件名或覆盖当前用户原来的      crontab文件。<br />
2、crontab文件格式<br />
   crontab文件记录的格式：<br />
   minute  hour  day_of_month   month  weekday       command<br />
   0~59    0~23   1~31天   1~12   0~6   （0为星期日）  Shell命令或脚本<br />
   （1）从&#8230;到&#8230;.:数字用“-”连接，表范围，如1-5表示1，2，3，4，5。<br />
   （2）单独数字表示所属时间内，如Month中填6，表示6月内；<br />
   （3）逗号分隔，表示单列项，如1,3,5<br />
   （4）*号表所有合法值，如：*放在month表示1~12<br />
   （5）/表示每的意思，如：0/20放在minute表示0分钟开始每20分钟执行一次。正斜线（/）可以用来指定间隔频率。在范围后加上 /&lt;integer&gt; 意味着在范围内可以跳过 integer。譬如，0-59/2 可以用来在分钟字段定义每两分钟。间隔频率值还可以和星号一起使用。例如，*/3 的值可以用在月份字段中表示每三个月运行一次任务。 <br />
   （6）星期与天的关系是或的关系，如：1-10放在day，5放在weekday下。表示1到10日或星期5执行。</span></div>
<div> </div>
<div><span style="color: #000000; font-family: 宋体;"><strong>四、使用crontab命令三种方式：</strong><br />
    1、手动方式：crontab –e<br />
    2、脚本方式：<br />
      例：echo ‘0 12 * * * date &gt;/nowdate’ &gt;&gt;/var/spool/cron/crontabs/root<br />
          crontab /var/spool/cron/crontabs/root<br />
    3、脚本方式(必要root权限)：<br />
      例：echo ‘0 12 * * * date &gt;/nowdate’ &gt;&gt;/var/spool/cron/crontabs/root<br />
      ps –ef |awk ‘/cron/{print “kill -9”,$2}` |sh<br />
      rm /usr/lib/cron/FIFO<br />
      /etc/cron</span></div>
<div> </div>
<div><strong><span style="font-family: 宋体;">五、</span>控制对 cron 的使用:<br />
</strong>/etc/cron.allow 和 /etc/cron.deny 文件被用来限制对 cron 的使用。这两个使用控制文件的格式都是每行一个用户。两个文件都不允许空格。如果使用控制文件被修改了，cron 守护进程（crond）不必被重启。使用控制文件在每次用户添加或删除一项 cron 任务时都会被读取。<br />
无论使用控制文件中的规定如何，根用户都总是可以使用 cron。<br />
如果 cron.allow 文件存在，只有其中列出的用户才被允许使用 cron，并且 cron.deny 文件会被忽略。<br />
如果 cron.allow 文件不存在，所有在 cron.deny 中列出的用户都被禁止使用 cron。</p>
<p><strong><span style="font-family: 宋体;">六、</span>启动和停止服务</strong><br />
要启动 cron 服务，使用 /sbin/service crond start 命令。要停止该服务，使用 /sbin/service crond stop 命令。推荐你在引导时启动该服务。 <!--more--></div>
<p> </p>
<p> </p>
<p>其他参考资料:</p>
<p><span style="color: #33cccc;">　　</span><span style="color: #008080;">cron 是linux的内置服务，能够用以下的方法启动、关闭这个服务：</span></p>
<p><span style="color: #008080;">　　引用:</span></p>
<p><span style="color: #008080;">　　/sbin/service crond start //启动服务</span></p>
<p><span style="color: #008080;">　　/sbin/service crond stop //关闭服务</span></p>
<p><span style="color: #008080;">　　/sbin/service crond restart //重启服务</span></p>
<p><span style="color: #008080;">　　/sbin/service crond reload //重新载入配置</span></p>
<p><span style="color: #008080;">　　您也能够将这个服务在系统启动的时候也自动启动：</span></p>
<p><span style="color: #008080;">　　引用:</span></p>
<p><span style="color: #008080;">　　在/etc/rc.d/rc.local这个脚本的末尾加上：</span></p>
<p><span style="color: #008080;">　　/sbin/service crond start</span></p>
<p><span style="color: #008080;">　　现在cron这个服务已在进程里面了，我们就能够用这个服务了，cron服务提供以下几种接口供大家使用：</span></p>
<p><span style="color: #008080;">　　1.直接用crontab命令编辑</span></p>
<p><span style="color: #008080;">　　cron服务提供crontab命令来设定cron服务的，以下是这个命令的一些参数和说明：</span></p>
<p><span style="color: #008080;">　　引用:</span></p>
<p><span style="color: #008080;">　　crontab -u //设定某个用户的cron服务，一般root用户在执行这个命令的时候需要此参数</span></p>
<p><span style="color: #008080;">　　crontab -l //列出某个用户cron服务的周详内容</span></p>
<p><span style="color: #008080;">　　crontab -r //删除没个用户的cron服务</span></p>
<p><span style="color: #008080;">　　crontab -e //编辑某个用户的cron服务</span></p>
<p><span style="color: #008080;">　　比如说root查看自己的cron配置：</span></p>
<p><span style="color: #008080;">　　引用:</span></p>
<p><span style="color: #008080;">　　crontab -u root -l</span></p>
<p><span style="color: #008080;">　　再例如，root想删除fred的cron配置：</span></p>
<p><span style="color: #008080;">　　引用:</span></p>
<p><span style="color: #008080;">　　crontab -u fred -r</span></p>
<p><span style="color: #008080;">　　在编辑cron服务时，编辑的内容有一些格式和约定，输入：</span></p>
<p><span style="color: #008080;">　　引用:</span></p>
<p><span style="color: #008080;">　　crontab -u root -e</span></p>
<p><span style="color: #008080;">　　进入vi编辑模式，编辑的内容一定要符合下面的格式：</span></p>
<p><span style="color: #008080;">　　引用:</span></p>
<p><span style="color: #008080;">　　*/1 * * * * ls &gt;&gt; /tmp/ls.txt</span></p>
<p><span style="color: #008080;">　　这个格式的前一部分是对时间的设定，后面一部分是要执行的命令，假如要执行的命令太多，能够把这些命令写到一个脚本里面，然后在这里直接调用这个脚本就能够了，调用的时候记得写出命令的完整路径。时间的设定我们有一定的约定，前面五个*号代表五个数字，数字的取值范围和含义如下：</span></p>
<p><span style="color: #008080;">　　引用:</span></p>
<p><span style="color: #008080;">　　分钟</span></p>
<p><span style="color: #008080;">　　（0-59）</span></p>
<p><span style="color: #008080;">　　小時</span></p>
<p><span style="color: #008080;">　　（0-23）</span></p>
<p><span style="color: #008080;">　　日期</span></p>
<p><span style="color: #008080;">　　（1-31）</span></p>
<p><span style="color: #008080;">　　月份</span></p>
<p><span style="color: #008080;">　　（1-12）</span></p>
<p><span style="color: #008080;">　　星期</span></p>
<p><span style="color: #008080;">　　（0-6）//0代表星期天</span></p>
<p><span style="color: #008080;">　　除了数字更有几个个特别的符号就是”*”、”/”和”-”、”,”，*代表任何的取值范围内的数字，”/”代表每的意思,”*/5″表示每5个单位，”-”代表从某个数字到某个数字,”,”分开几个离散的数字。以下举几个例子说明问题：</span></p>
<p><span style="color: #008080;">　　引用:</span></p>
<p><span style="color: #008080;">　　每天早上6点</span></p>
<p><span style="color: #008080;">　　0 6 * * * echo “Good morning.” &gt;&gt; /tmp/test.txt //注意单纯echo，从屏幕上看不到任何输出，因为cron把任何输出都email到root的信箱了。</span></p>
<p><span style="color: #008080;">　　每两个小时</span></p>
<p><span style="color: #008080;">　　0 */2 * * * echo “Have a break now.” &gt;&gt; /tmp/test.txt</span></p>
<p><span style="color: #008080;">　　晚上11点到早上8点之间每两个小时，早上八点</span></p>
<p><span style="color: #008080;">　　0 23-7/2，8 * * * echo “Have a good dream：）” &gt;&gt; /tmp/test.txt</span></p>
<p><span style="color: #008080;">　　每个月的4号和每个礼拜的礼拜一到礼拜三的早上11点</span></p>
<p><span style="color: #008080;">　　0 11 4 * 1-3 command line</span></p>
<p><span style="color: #008080;">　　1月1日早上4点</span></p>
<p><span style="color: #008080;">　　0 4 1 1 * command line</span></p>
<p><span style="color: #008080;">　　每次编辑完某个用户的cron配置后，cron自动在/var/spool/cron下生成一个和此用户同名的文档，此用户的cron信息都记录在这个文档中，这个文档是不能够直接编辑的，只能够用crontab -e 来编辑。cron启动后每过一份钟读一次这个文档，检查是否要执行里面的命令。因此此文档修改后无需重新启动cron服务。</span></p>
<p><span style="color: #008080;">　　2.编辑/etc/crontab 文档配置cron</span></p>
<p><span style="color: #008080;">　　cron服务每分钟不但要读一次/var/spool/cron内的任何文档，还需要读一次/etc/crontab,因此我们配置这个文档也能运用 cron服务做一些事情。用crontab配置是针对某个用户的，而编辑/etc/crontab是针对系统的任务。此文档的文档格式是：</span></p>
<p><span style="color: #008080;">　　引用:</span></p>
<p><span style="color: #008080;">　　SHELL=/bin/bash</span></p>
<p><span style="color: #008080;">　　PATH=/sbin:/bin:/usr/sbin:/usr/bin</span></p>
<p><span style="color: #008080;">　　MAILTO=root //假如出现错误，或有数据输出，数据作为邮件发给这个帐号</span></p>
<p><span style="color: #008080;">　　HOME=/</span></p>
<p><span style="color: #008080;">　　# run-parts</span></p>
<p><span style="color: #008080;">　　01 * * * * root run-parts /etc/cron.hourly //每个小时去执行一遍/etc/cron.hourly内的脚本</span></p>
<p><span style="color: #008080;">　　02 4 * * * root run-parts /etc/cron.daily //每天去执行一遍/etc/cron.daily内的脚本</span></p>
<p><span style="color: #008080;">　　22 4 * * 0 root run-parts /etc/cron.weekly //每星期去执行一遍/etc/cron.weekly内的脚本</span></p>
<p><span style="color: #008080;">　　42 4 1 * * root run-parts /etc/cron.monthly //每个月去执行一遍/etc/cron.monthly内的脚本</span></p>
<p><span style="color: #008080;">　　使用者 运行的路径</span></p>
<p><span style="color: #008080;">　　大家注意”run-parts”这个参数了，假如去掉这个参数的话，后面就能够写要运行的某个脚本名，而不是文档夹名了。</span></p>
<p><span style="color: #008080;">　　假如您还不太明白，看下面的内容：</span></p>
<p><span style="color: #008080;">　　cron 是个能够用来根据时间、日期、月份、星期的组合来调度对重复任务的执行的守护进程。</span></p>
<p><span style="color: #008080;">　　cron 假定系统持续运行。假如当某任务被调度时系统不在运行，该任务就不会被执行。</span></p>
<p><span style="color: #008080;">　　要使用 cron 服务，您必须安装了 vixie-cron RPM 软件包，而且必须在运行 crond 服务。要判定该软件包是否已安装，使用 rpm -q vixie-cron 命令。要判定该服务是否在运行，使用 /sbin/service crond status 命令。</span></p>
<p><span style="color: #008080;">　　cron 的主配置文档是 /etc/crontab，他包括下面几行：</span></p>
<p><span style="color: #008080;">　　代码:</span></p>
<p><span style="color: #008080;">　　SHELL=/bin/bash</span></p>
<p><span style="color: #008080;">　　PATH=/sbin:/bin:/usr/sbin:/usr/bin</span></p>
<p><span style="color: #008080;">　　MAILTO=root</span></p>
<p><span style="color: #008080;">　　HOME=/</span></p>
<p><span style="color: #008080;">　　# run-parts</span></p>
<p><span style="color: #008080;">　　01 * * * * root run-parts /etc/cron.hourly</span></p>
<p><span style="color: #008080;">　　02 4 * * * root run-parts /etc/cron.daily</span></p>
<p><span style="color: #008080;">　　22 4 * * 0 root run-parts /etc/cron.weekly</span></p>
<p><span style="color: #008080;">　　42 4 1 * * root run-parts /etc/cron.monthly</span></p>
<p><span style="color: #008080;">　　前四行是用来配置 cron 任务运行环境的变量。 SHELL 变量的值告诉系统要使用哪个 shell 环境（在这个例子里是 bash shell）；PATH 变量定义用来执行命令的路径。cron 任务的输出被邮寄给 MAILTO 变量定义的用户名。假如 MAILTO 变量被定义为空白字符串（MAILTO=””），电子邮件就不会被寄出。HOME 变量能够用来配置在执行命令或脚本时使用的主目录。</span></p>
<p><span style="color: #008080;">　　/etc/crontab 文档中的每一行都代表一项任务，他的格式是：</span></p>
<p><span style="color: #008080;">　　代码:</span></p>
<p><span style="color: #008080;">　　minute hour day month dayofweek command</span></p>
<p><span style="color: #008080;">　　*</span></p>
<p><span style="color: #008080;">　　minute — 分钟，从 0 到 59 之间的任何整数</span></p>
<p><span style="color: #008080;">　　*</span></p>
<p><span style="color: #008080;">　　hour — 小时，从 0 到 23 之间的任何整数</span></p>
<p><span style="color: #008080;">　　*</span></p>
<p><span style="color: #008080;">　　day — 日期，从 1 到 31 之间的任何整数（假如指定了月份，必须是该月份的有效日期）</span></p>
<p><span style="color: #008080;">　　*</span></p>
<p><span style="color: #008080;">　　month — 月份，从 1 到 12 之间的任何整数（或使用月份的英文简写如 jan、feb 等等）</span></p>
<p><span style="color: #008080;">　　*</span></p>
<p><span style="color: #008080;">　　dayofweek — 星期，从 0 到 7 之间的任何整数，这里的 0 或 7 代表星期日（或使用星期的英文简写如 sun、mon 等等）</span></p>
<p><span style="color: #008080;">　　*</span></p>
<p><span style="color: #008080;">　　command — 要执行的命令（命令能够是 ls /proc &gt;&gt; /tmp/proc 之类的命令，也能够是执行您自行编写的脚本的命令。）</span></p>
<p><span style="color: #008080;">　　在以上任何值中，星号（*）能够用来代表任何有效的值。譬如，月份值中的星号意味着在满足其他制约条件后每月都执行该命令。</span></p>
<p><span style="color: #008080;">　　整数间的短线（-）指定一个整数范围。譬如，1-4 意味着整数 1、2、3、4。</span></p>
<p><span style="color: #008080;">　　用逗号（,）隔开的一系列值指定一个列表。譬如，3, 4, 6, 8 标明这四个指定的整数。</span></p>
<p><span style="color: #008080;">　　正斜线（/）能够用来指定间隔频率。在范围后加上 /&lt;integer&gt; 意味着在范围内能够跳过 integer。譬如，0-59/2 能够用来在分钟字段定义每两分钟。间隔频率值还能够和星号一起使用。例如，*/3 的值能够用在月份字段中表示每三个月运行一次任务。</span></p>
<p><span style="color: #008080;">　　开头为井号（#）的行是注释，不会被处理。</span></p>
<p><span style="color: #008080;">　　如您在 /etc/crontab 文档中所见，他使用 run-parts 脚本来执行 /etc/cron.hourly、/etc/cron.daily、/etc/cron.weekly 和 /etc/cron.monthly 目录中的脚本，这些脚本被相应地每小时、每日、每周、或每月执行。这些目录中的文档应该是 shell 脚本。</span></p>
<p><span style="color: #008080;">　　假如某 cron 任务需要根据调度来执行，而不是每小时、每日、每周、或每月地执行，他能够被添加到 /etc/cron.d 目录中。该目录中的任何文档使用和 /etc/crontab 中相同的语法。如下：</span></p>
<p><span style="color: #008080;">　　代码:</span></p>
<p><span style="color: #008080;">　　# record the memory usage of the system every monday</span></p>
<p><span style="color: #008080;">　　# at 3:30AM in the file /tmp/meminfo</span></p>
<p><span style="color: #008080;">　　30 3 * * mon cat /proc/meminfo &gt;&gt; /tmp/meminfo</span></p>
<p><span style="color: #008080;">　　# run custom script the first day of every month at 4:10AM</span></p>
<p><span style="color: #008080;">　　10 4 1 * * /root/scripts/backup.sh</span></p>
<p><span style="color: #008080;">　　根用户以外的用户能够使用 crontab 工具来配置 cron 任务。任何用户定义的 crontab 都被保存在 /var/spool/cron 目录中，并使用创建他们的用户身份来执行。要以某用户身份创建一个 crontab 项目，登录为该用户，然后键入 crontab -e 命令，使用由 VISUAL 或 EDITOR 环境变量指定的编辑器来编辑该用户的 crontab。该文档使用的格式和 /etc/crontab 相同。当对 crontab 所做的改变被保存后，该 crontab 文档就会根据该用户名被保存，并写入文档 /var/spool/cron/username 中。</span></p>
<p><span style="color: #008080;">　　cron 守护进程每分钟都检查 /etc/crontab 文档、etc/cron.d/ 目录、连同 /var/spool/cron 目录中的改变。假如发现了改变，他们就会被载入内存。这样，当某个 crontab 文档改变后就不必重新启动守护进程了。</span></p>
<p><span style="color: #008080;">　　/etc/cron.allow 和 /etc/cron.deny 文档被用来限制对 cron 的使用。这两个使用控制文档的格式都是每行一个用户。两个文档都不允许空格。假如使用控制文档被修改了，cron 守护进程（crond）不必被重启。使用控制文档在每次用户添加或删除一项 cron 任务时都会被读取。</span></p>
<p><span style="color: #008080;">　　无论使用控制文档中的规定如何，根用户都总是能够使用 cron。</span></p>
<p><span style="color: #008080;">　　假如 cron.allow 文档存在，只有其中列出的用户才被允许使用 cron，并且 cron.deny 文档会被忽略。</span></p>
<p><span style="color: #008080;">　　假如 cron.allow 文档不存在，任何在 cron.deny 中列出的用户都被禁止使用 cron。</span></p>
<p><span style="color: #008080;">　　要启动 cron 服务，使用 /sbin/service crond start 命令。要停止该服务，使用 /sbin/service crond stop 命令。推荐您在引导时启动该服务。</span></p>
<p><span style="color: #008080;">　　增加CRON的工作</span></p>
<p><span style="color: #008080;">　　当我们决定要在系统上定期执行某个命令，我们必须将这个要执行的命令定义成一个CRON工作，能够直接将要建立的CRON工作定义在CRONTAB配置文档中，配置该命令执行的时机；或也能够利用CRON会定时执行/ETC/CROM.*目录SCRIPT的特性，将要执行的命令建立成为一个脚本文档，放置在该目录下，并且注意他的权限–必须能够执行</span></p>
<p><span style="color: #008080;">来自:http://<a href="http://www.ptubuntu.com/tag/linx" class="st_tag internal_tag" rel="tag" title="标签 Linux 下的日志">linux</a>-os.cn/20080320/cron/</span></p>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fwww.ptubuntu.com%2F2008%2F11%2F556.html&amp;title=%E8%B0%83%E5%BA%A6cron%E4%BB%BB%E5%8A%A1%20%E7%B2%BE" id="wpa2a_8"><img src="http://www.ptubuntu.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://www.ptubuntu.com/2008/11/556.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>shell case</title>
		<link>http://www.ptubuntu.com/2008/11/547.html</link>
		<comments>http://www.ptubuntu.com/2008/11/547.html#comments</comments>
		<pubDate>Tue, 25 Nov 2008 10:05:08 +0000</pubDate>
		<dc:creator>ptubuntu</dc:creator>
				<category><![CDATA[Linux Server]]></category>
		<category><![CDATA[shell]]></category>
		<category><![CDATA[case]]></category>

		<guid isPermaLink="false">http://ptubuntu.com/?p=547</guid>
		<description><![CDATA[　　Case语句    //循环条件. 　　case的作用就是当字符串与某个值相同是就执行那个值后面的操作。如果同一个操作对于多个值，则使用”&#124;”将各个值分开。在case的每一个操作的最后面都有两个”;;”，分号是必须的。 　　语法：case 字符串 in     //in  是每条语句之要加入的. 　　值1&#124;值2)   //这里可以有两个值, Y&#124;y 　　操作;; 　　值3&#124;值4) 　　操作;; 　　值5&#124;值6) 　　操作;; 　　*}   //任意值. 　　操作;; 　　esac   echo -n “请输入选项(1/2/3/4)：” # 由标准输入读入，在放在 opt 中 read opt case “$opt” in    1) echo “1 太好了!”       ;;    2) echo “2 太妙了!”       ;;    3) echo “3 太爽了!”       ;;    [...]]]></description>
			<content:encoded><![CDATA[<p align="left">　　Case语句    //循环条件.</p>
<p align="left">　　case的作用就是当字符串与某个值相同是就执行那个值后面的操作。如果同一个操作对于多个值，则使用”|”将各个值分开。在case的每一个操作的最后面都有两个<span style="color: #ff0000;">”;;”，分号是必须的。</span></p>
<p align="left">　　语法：<a href="http://www.ptubuntu.com/tag/case" class="st_tag internal_tag" rel="tag" title="标签 case 下的日志">case</a> 字符串 <span style="color: #ff0000;">in     //in  是每条语句之要加入的.</span></p>
<p align="left">　　值1|值2)   <span style="color: #ff0000;">//这里可以有两个值, Y|y</span></p>
<p align="left">　　操作;;</p>
<p align="left">　　值3|值4)</p>
<p align="left">　　操作;;</p>
<p align="left">　　值5|值6)</p>
<p align="left">　　操作;;</p>
<p align="left">　　*}   //任意值.</p>
<p align="left">　　操作;;</p>
<p align="left">　　esac</p>
<p align="left"> </p>
<blockquote><p>echo -n “请输入选项(1/2/3/4)：”<br />
# 由标准输入读入，在放在 opt 中<br />
read opt</p>
<p>case “$opt” in<br />
   1) echo “1 太好了!”<br />
      ;;<br />
   2) echo “2 太妙了!”<br />
      ;;<br />
   3) echo “3 太爽了!”<br />
      ;;<br />
   4) echo “4 太香了!”<br />
      ;;<br />
   *) echo “$opt 超出选项 1~4 的数值”<br />
esac</p></blockquote>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fwww.ptubuntu.com%2F2008%2F11%2F547.html&amp;title=shell%20case" id="wpa2a_10"><img src="http://www.ptubuntu.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://www.ptubuntu.com/2008/11/547.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>shell to test 详细说明</title>
		<link>http://www.ptubuntu.com/2008/11/545.html</link>
		<comments>http://www.ptubuntu.com/2008/11/545.html#comments</comments>
		<pubDate>Tue, 25 Nov 2008 09:08:53 +0000</pubDate>
		<dc:creator>ptubuntu</dc:creator>
				<category><![CDATA[Linux Server]]></category>
		<category><![CDATA[shell]]></category>

		<guid isPermaLink="false">http://ptubuntu.com/?p=545</guid>
		<description><![CDATA[1）判断表达式 if test  (表达式为真) if test !表达式为假 test 表达式1 –a 表达式2                  两个表达式都为真 test 表达式1 –o 表达式2                 两个表达式有一个为真 2）判断字符串 test –n 字符串                                   字符串的长度非零 test –z 字符串                                    字符串的长度为零 test 字符串1＝字符串2                    字符串相等 test 字符串1！＝字符串2               字符串不等 3）判断整数 test 整数1 –eq 整数2                        整数相等 test 整数1 –ge 整数2                        整数1大于等于整数2 test 整数1 –gt 整数2                         整数1大于整数2 test 整数1 –le 整数2                         整数1小于等于整数2 test 整数1 [...]]]></description>
			<content:encoded><![CDATA[<div class="blog_content">1）判断表达式</p>
<p>if test  (表达式为真)</p>
<p>if test !表达式为假</p>
<p>test 表达式1 –a 表达式2                  两个表达式都为真</p>
<p>test 表达式1 –o 表达式2                 两个表达式有一个为真<br />
<span id="more-545"></span></p>
<p>2）判断字符串</p>
<p>test –n 字符串                                   字符串的长度非零</p>
<p>test –z 字符串                                    字符串的长度为零</p>
<p>test 字符串1＝字符串2                    字符串相等</p>
<p>test 字符串1！＝字符串2               字符串不等</p>
<p>3）判断整数</p>
<p>test 整数1 –eq 整数2                        整数相等</p>
<p>test 整数1 –ge 整数2                        整数1大于等于整数2</p>
<p>test 整数1 –gt 整数2                         整数1大于整数2</p>
<p>test 整数1 –le 整数2                         整数1小于等于整数2</p>
<p>test 整数1 –lt 整数2                          整数1小于整数2</p>
<p>test 整数1 –ne 整数2                        整数1不等于整数2</p>
<p>4）判断文件</p>
<p>test  File1 –ef  File2                            两个文件具有同样的设备号和i结点号</p>
<p>test  File1 –nt  File2                            文件1比文件2 新</p>
<p>test  File1 –ot  File2                            文件1比文件2 旧</p>
<p>test –b File                                           文件存在并且是块设备文件</p>
<p>test –c File                                           文件存在并且是字符设备文件</p>
<p>test –d File                                           文件存在并且是目录</p>
<p>test –e File                                           文件存在</p>
<p>test –f File                                            文件存在并且是正规文件</p>
<p>test –g File                                           文件存在并且是设置了组ID</p>
<p>test –G File                                           文件存在并且属于有效组ID</p>
<p>test –h File                                           文件存在并且是一个符号链接（同-L）</p>
<p>test –k File                                           文件存在并且设置了sticky位</p>
<p>test –b File                                           文件存在并且是块设备文件</p>
<p>test –L File                                           文件存在并且是一个符号链接（同-h）</p>
<p>test –o File                                           文件存在并且属于有效用户ID</p>
<p>test –p File                                           文件存在并且是一个命名管道</p>
<p>test –r File                                            文件存在并且可读</p>
<p>test –s File                                           文件存在并且是一个套接字</p>
<p>test –t FD                                             文件描述符是在一个终端打开的</p>
<p>test –u File                                           文件存在并且设置了它的set-user-id位</p>
<p>test –w File                                          文件存在并且可写</p>
<p>test –x File                                           文件存在并且可执行</p></div>
<div class="blog_content">您是否为 Bash <a href="http://www.ptubuntu.com/tag/shell" class="st_tag internal_tag" rel="tag" title="标签 shell 下的日志">shell</a> 中大量的测试和比较选项而困惑呢？这个技巧可以帮助您解密不同类型的文件、算术和字符串测试，这样您就能够知道什么时候使用 test、 [ ]、 [[ ]]、 (( )) 或 if-then-else 了。<br />
Bash shell 在当今的许多 <a href="http://www.ptubuntu.com/tag/linx" class="st_tag internal_tag" rel="tag" title="标签 Linux 下的日志">Linux</a>® 和 UNIX® 系统上都可使用，是 <a href="http://www.ptubuntu.com/tag/linx" class="st_tag internal_tag" rel="tag" title="标签 Linux 下的日志">Linux</a> 上常见的默认 shell。Bash 包含强大的编程功能，其中包括丰富的可测试文件类型和属性的函数，以及在多数编程语言中可以使用的算术和字符串比较函数。理解不同的测试并认识到 shell 还能把一些操作符解释成 shell 元字符，是成为高级 shell 用户的重要一步。这篇文章摘自 developerWorks 教程 LPI 102 考试准备，主题 109: Shell、脚本、编程和编译，介绍了如何理解和使用 Bash shell 的测试和比较操作。</div>
<div class="blog_content">这个技巧解释了 shell 测试和比较函数，演示了如何向 shell 添加编程功能。您可能已经看到过使用 &amp;&amp; 和 || 操作符的简单 shell 逻辑，它允许您根据前一条命令的退出状态（正确退出或伴随错误退出）而执行后一条命令。在这个技巧中，将看到如何把这些基本的技术扩展成更复杂的 shell 编程。</div>
<div class="blog_content">测试</div>
<div class="blog_content">在任何一种编程语言中，学习了如何给变量分配值和传递参数之后，都需要测试这些值和参数。在 shell 中，测试会设置返回的状态，这与其他命令执行的功能相同。实际上，test 是个内置命令！</div>
<div class="blog_content">test 和 [</div>
<div class="blog_content">内置命令 test 根据表达式expr 求值的结果返回 0（真）或 1（假）。也可以使用方括号：test  expr 和 [ expr ] 是等价的。 可以用 $? 检查返回值；可以使用 &amp;&amp; 和 || 操作返回值；也可以用本技巧后面介绍的各种条件结构测试返回值。</div>
<div class="blog_content">
清单 1. 一些简单测试<br />
                [ian@pinguino ~]$ test 3 -gt 4 &amp;&amp; echo True || echo falsefalse[ian@pinguino ~]$ [ "abc" != "def" ];echo $?0[ian@pinguino ~]$ test -d “$HOME” ;echo $?0</div>
<div class="blog_content">
在清单 1 的第一个示例中，-gt 操作符对两个字符值之间执行算术比较。在第二个示例中，用 [ ] 的形式比较两个字符串不相等。在最后一个示例中，测试 HOME 变量的值，用单目操作符 -d 检查它是不是目录。</div>
<div class="blog_content">可以用 -eq、 -ne、-lt、 -le、 -gt 或 -ge 比较算术值，它们分别表示等于、不等于、小于、小于等于、大于、大于等于。</div>
<div class="blog_content">可以分别用操作符 =、 !=、&lt; 和 &gt; 比较字符串是否相等、不相等或者第一个字符串的排序在第二个字符串的前面或后面。单目操作符 -z 测试 null 字符串，如果字符串非空 -n 返回 True（或者根本没有操作符）。</div>
<div class="blog_content">
说明：shell 也用 &lt; 和 &gt; 操作符进行重定向，所以必须用 \&lt; 或 \&gt; 加以转义。清单 2 显示了字符串测试的更多示例。检查它们是否如您预期的一样。</div>
<div class="blog_content">
清单 2. 一些字符串测试<br />
                [ian@pinguino ~]$ test “abc” = “def” ;echo $?1[ian@pinguino ~]$ [ "abc" != "def" ];echo $?0[ian@pinguino ~]$ [ "abc" \&lt; "def" ];echo $?0[ian@pinguino ~]$ [ "abc" \&gt; "def" ];echo $?1[ian@pinguino ~]$ [ "abc" \&lt;"abc" ];echo $?1[ian@pinguino ~]$ [ "abc" \&gt; "abc" ];echo $?1</div>
<div class="blog_content">
表 1 显示了一些更常见的文件测试。如果被测试的文件存在，而且有指定的特征，则结果为 True。</div>
<div class="blog_content">表 1. 一些常见的文件测试  操作符 特征<br />
-d 目录<br />
-e 存在（也可以用 -a）<br />
-f 普通文件<br />
-h 符号连接（也可以用 -L）<br />
-p 命名管道<br />
-r 可读<br />
-s 非空<br />
-S 套接字<br />
-w 可写<br />
-N 从上次读取之后已经做过修改</div>
<div class="blog_content">除了上面的单目测试，还可以使用表 2 所示的双目操作符比较两个文件：</div>
<div class="blog_content">表 2. 测试一对文件  操作符 为 True 的情况 <br />
-nt 测试 file1 是否比 file2 更新。修改日期将用于这次和下次比较。<br />
-ot 测试 file1 是否比 file2 旧。<br />
-ef 测试 file1 是不是 file2 的硬链接。 </div>
<div class="blog_content">其他一些测试可以用来测试文件许可之类的内容。请参阅 bash 手册获得更多细节或使用 help test 查看内置测试的简要信息。也可以用 help 命令了解其他内置命令。</div>
<div class="blog_content">-o 操作符允许测试利用 set -o  选项 设置的各种 shell 选项，如果设置了该选项，则返回 True (0)，否则返回 False (1)，如清单 3 所示。</div>
<div class="blog_content">
清单 3. 测试 shell 选项<br />
                [ian@pinguino ~]$ set +o nounset[ian@pinguino ~]$ [ -o nounset ];echo $?1[ian@pinguino ~]$ set -u[ian@pinguino ~]$ test  -o nounset; echo $?0</div>
<div class="blog_content">
最后，-a 和 -o 选项允许使用逻辑运算符 AND 和 OR 将表达式组合在一起。单目操作符 ! 可以使测试的意义相反。可以用括号把表达式分组，覆盖默认的优先级。请记住 shell 通常要在子 shell 中运行括号中的表达式，所以需要用 \( 和 \) 转义括号，或者把这些操作符括在单引号或双引号内。清单 4 演示了摩根法则在表达式上的应用。</div>
<div class="blog_content">
清单 4. 组合和分组测试<br />
                [ian@pinguino ~]$ test “a” != “$HOME” -a 3 -ge 4 ; echo $?1[ian@pinguino ~]$ [ ! \( "a" = "$HOME" -o 3 -lt 4 \) ]; echo $?1[ian@pinguino ~]$ [ ! \( "a" = "$HOME" -o '(' 3 -lt 4 ')' ")" ]; echo $?1</div>
<div class="blog_content"> </div>
<div class="blog_content">(( 和 [[</div>
<div class="blog_content">test 命令非常强大，但是很难满足其转义需求以及字符串和算术比较之间的区别。幸运的是，bash 提供了其他两种测试方式，这两种方式对熟悉 C、C++ 或 Java® 语法的人来说会更自然些。</div>
<div class="blog_content">(( )) 复合命令 计算算术表达式，如果表达式求值为 0，则设置退出状态为 1；如果求值为非 0 值，则设置为 0。不需要对 (( 和 )) 之间的操作符转义。算术只对整数进行。除 0 会产生错误，但不会产生溢出。可以执行 C 语言中常见的算术、逻辑和位操作。 let 命令也能执行一个或多个算术表达式。它通常用来为算术变量分配值。</div>
<div class="blog_content">
清单 5. 分配和测试算术表达式<br />
                [ian@pinguino ~]$ let x=2 y=2**3 z=y*3;echo $? $x $y $z0 2 8 24[ian@pinguino ~]$ (( w=(y/x) + ( (~ ++x) &amp; 0x0f ) )); echo $? $x $y $w0 3 8 16[ian@pinguino ~]$ (( w=(y/x) + ( (~ ++x) &amp; 0x0f ) )); echo $? $x $y $w0 4 8 13</div>
<div class="blog_content">
同使用 (( )) 一样，利用复合命令 [[ ]] 可以对文件名和字符串使用更自然的语法。可以用括号和逻辑操作符把 test 命令支持的测试组合起来。</div>
<div class="blog_content">
清单 6. 使用 [[ 复合命令<br />
                [ian@pinguino ~]$ [[ ( -d "$HOME" ) &amp;&amp; ( -w "$HOME" ) ]] &amp;&amp;  &gt;  echo “home is a writable directory”home is a writable directory</div>
<div class="blog_content">
在使用 = 或 != 操作符时，复合命令 [[ 还能在字符串上进行模式匹配。匹配的方式就像清单 7 所示的通配符匹配。</div>
<div class="blog_content">
清单 7. 用 [[ 进行通配符测试<br />
                [ian@pinguino ~]$ [[ "abc def .d,x--" == a[abc]*\ ?d* ]]; echo $?0[ian@pinguino ~]$ [[ "abc def c" == a[abc]*\ ?d* ]]; echo $?1[ian@pinguino ~]$ [[ "abc def d,x" == a[abc]*\ ?d* ]]; echo $?1</div>
<div class="blog_content">
甚至还可以在 [[ 复合命令内执行算术测试，但是千万要小心。除非在 (( 复合命令内，否则 &lt; 和 &gt; 操作符会把操作数当成字符串比较并在当前排序序列中测试它们的顺序。清单 8 用一些示例演示了这一点。</div>
<div class="blog_content">
清单 8. 用 [[ 包含算术测试<br />
                [ian@pinguino ~]$ [[ "abc def d,x" == a[abc]*\ ?d* || (( 3 &gt; 2 )) ]]; echo $?0[ian@pinguino ~]$ [[ "abc def d,x" == a[abc]*\ ?d* || 3 -gt 2 ]]; echo $?0[ian@pinguino ~]$ [[ "abc def d,x" == a[abc]*\ ?d* || 3 &gt; 2 ]]; echo $?0[ian@pinguino ~]$ [[ "abc def d,x" == a[abc]*\ ?d* || a &gt; 2 ]]; echo $?0[ian@pinguino ~]$ [[ "abc def d,x" == a[abc]*\ ?d* || a -gt 2 ]]; echo $?-bash: a: unbound variable</div>
<div class="blog_content"></div>
<div class="blog_content">If、then、else 语句</div>
<div class="blog_content">bash 的 if 命令是个复合命令，它测试一个测试或命令（$?）的返回值，并根据返回值为 True（0）或 False（不为 0）进行分支。虽然上面的测试只返回 0 或 1 值，但命令可能返回其他值。请参阅 LPI 102 考试准备，主题 109: Shell、脚本、编程和编译 教程学习这方面的更多内容。</div>
<div class="blog_content">Bash 中的 if 命令有一个 then 子句，子句中包含测试或命令返回 0 时要执行的命令列表，可以有一个或多个可选的 elif 子句，每个子句可执行附加的测试和一个 then 子句，子句中又带有相关的命令列表，最后是可选的 else 子句及命令列表，在前面的测试或 elif 子句中的所有测试都不为真的时候执行，最后使用 fi 标记表示该结构结束。</div>
<div class="blog_content">使用迄今为止学到的东西，现在能够构建简单的计算器来计算算术表达式，如清单 9 所示：</div>
<div class="blog_content">
清单 9. 用 if、then、else 计算表达式<br />
                [ian@pinguino ~]$ function mycalc ()&gt; {&gt;   local x&gt;   if [ $# -lt 1 ]; then&gt;     echo “This function evaluates arithmetic for you if you give it some”&gt;   elif (( $* )); then&gt;     let x=”$*”&gt;     echo “$* = $x”&gt;   else&gt;     echo “$* = 0 or is not an arithmetic expression”&gt;   fi&gt; }[ian@pinguino ~]$ mycalc 3 + 43 + 4 = 7[ian@pinguino ~]$ mycalc 3 + 4**33 + 4**3 = 67[ian@pinguino ~]$ mycalc 3 + (4**3 /2)-bash: syntax error near unexpected token `(&#8216;[ian@pinguino ~]$ mycalc 3 + “(4**3 /2)”3 + (4**3 /2) = 35[ian@pinguino ~]$ mycalc xyzxyz = 0 or is not an arithmetic expression[ian@pinguino ~]$ mycalc xyz + 3 + “(4**3 /2)” + abcxyz + 3 + (4**3 /2) + abc = 35        </div>
<div class="blog_content">
这个计算器利用 local 语句将 x 声明为局部变量，只能在 mycalc 函数的范围内使用。let 函数具有几个可用的选项，可以执行与它密切关联的 declare 函数。请参考 bash 手册或使用 help let 获得更多信息。</div>
<div class="blog_content">如清单 9 所示，需要确保在表达式使用 shell 元字符 —— 例如(、)、*、&gt; 和 &lt; 时 —— 正确地对表达式转义。无论如何，现在有了一个非常方便的小计算器，可以像 shell 那样进行算术计算。</div>
<div class="blog_content">在清单 9 中可能注意到 else 子句和最后的两个示例。可以看到，把 xyz 传递给 mycalc 并没有错误，但计算结果为 0。这个函数还不够灵巧，不能区分最后使用的示例中的字符值，所以不能警告用户。可以使用字符串模式匹配测试（例如<br />
[[ ! ("$*" == *[a-zA-Z]* ]]<br />
，或使用适合自己范围的形式）消除包含字母表字符的表达式，但是这会妨碍在输入中使用 16 进制标记，因为使用 16 进制标记时可能要用 0x0f 表示 15。实际上，shell 允许的基数最高为 64（使用 base#value 标记），所以可以在输入中加入 _ 和 @ 合法地使用任何字母表字符。8 进制和 16 进制使用常用的标记方式，开头为 0 表示八进制，开头为 0x 或 0X 表示 16 进制。清单 10 显示了一些示例。</div>
<div class="blog_content">
清单 10. 用不同的基数进行计算<br />
                [ian@pinguino ~]$ mycalc 015015 = 13[ian@pinguino ~]$ mycalc 0xff0xff = 255[ian@pinguino ~]$ mycalc 29#3729#37 = 94[ian@pinguino ~]$ mycalc 64#1az64#1az = 4771[ian@pinguino ~]$ mycalc 64#1azA64#1azA = 305380[ian@pinguino ~]$ mycalc <a href="mailto:64#1azA_@64#1azA">64#1azA_@64#1azA</a>_@ = 1250840574[ian@pinguino ~]$ mycalc 64#1az*64**3 + <a href="mailto:64#A_@64#1az*64**3">64#A_@64#1az*64**3</a> + 64#A_@ = 1250840574</div>
<div class="blog_content">
对输入进行的额外处理超出了本技巧的范围，所以请小心使用这个计算器。</div>
<div class="blog_content">elif 语句非常方便。它允许简化缩进，从而有助于脚本编写。在清单 11 中可能会对 type 命令在 mycalc 函数中的输出感到惊讶。</div>
<div class="blog_content">
清单 11. Type mycalc<br />
                [ian@pinguino ~]$ type mycalcmycalc is a functionmycalc (){    local x;    if [ $# -lt 1 ]; then        echo “This function evaluates arithmetic for you if you give it some”;    else        if (( $* )); then            let x=”$*”;            echo “$* = $x”;        else            echo “$* = 0 or is not an arithmetic expression”;        fi;    fi} </div>
<div class="blog_content">
当然，也可以只用 $((  表达式  )) 和 echo 命令进行 shell 算术运算，如清单 12 所示。这样就不必学习关于函数或测试的任何内容，但是请注意 shell 不会解释元字符，例如 *，因此元字符不能在 ((  表达式  )) 或 [[  表达式  ]] 中那样正常发挥作用。</div>
<div class="blog_content">
清单 12. 在 shell 中用 echo 和 $(( )) 直接进行计算</div>
<div class="blog_content">                [ian@pinguino ~]$  echo $((3 + (4**3 /2)))35</div>
<div class="blog_content">
本文来自: (<a href="http://www.91linux.com">www.91linux.com</a>) 详细出处参考：<a href="http://www.91linux.com/html/article/shell/20081017/13573_3.html">http://www.91linux.com/html/article/shell/20081017/13573_3.html</a></div>
<div class="blog_content"><!--more--></div>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fwww.ptubuntu.com%2F2008%2F11%2F545.html&amp;title=shell%20to%20test%20%E8%AF%A6%E7%BB%86%E8%AF%B4%E6%98%8E" id="wpa2a_12"><img src="http://www.ptubuntu.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://www.ptubuntu.com/2008/11/545.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>shell to if</title>
		<link>http://www.ptubuntu.com/2008/11/543.html</link>
		<comments>http://www.ptubuntu.com/2008/11/543.html#comments</comments>
		<pubDate>Tue, 25 Nov 2008 08:48:21 +0000</pubDate>
		<dc:creator>ptubuntu</dc:creator>
				<category><![CDATA[Linux Server]]></category>
		<category><![CDATA[shell]]></category>
		<category><![CDATA[技术类]]></category>

		<guid isPermaLink="false">http://ptubuntu.com/?p=543</guid>
		<description><![CDATA[虽然是很简单但是如果你没有认真点.你写出来的会发现有很错误的语法.格式很简要.特别的前后的空格.有些是必需要的.如果没有留空格一定会出错.因为你在查的时候你会发现写的都没有错.这个并不是很容易发现的.所以在写的时候还是需要注意. 错误的:if [-z $NAME] &#124;&#124; ["$NAME" = ""];then 这个是错误的. 正确的:if [空格-z $NAME空格 ] &#124;&#124; [空格 "$NAME" = ""空格 ];then      在[ 这中间要添加空格] #!/bin/bash #ifelif echo -n “Enter you name:”    //请输入你的名字. read NAME   //读取NAME if [ -z $NAME ] &#124;&#124; [ "$NAME" = "" ];then    //NAME的长度为0或等于空.         echo “You did not enter a name.”    //输入你没有输入名字. elif [ [...]]]></description>
			<content:encoded><![CDATA[<p>虽然是很简单但是如果你没有认真点.你写出来的会发现有很错误的语法.格式很简要.特别的前后的空格.有些是必需要的.如果没有留空格一定会出错.因为你在查的时候你会发现写的都没有错.这个并不是很容易发现的.所以在写的时候还是需要注意.<br />
错误的:<span style="color: #ff0000;">if [-z $NAME] || ["$NAME" = ""];then 这个是错误的.<br />
<span style="color: #000000;">正确的:</span><span style="color: #33cccc;">if [<span style="color: #ff0000;">空格</span>-z $NAME<span style="color: #ff0000;">空格</span> ] || [<span style="color: #ff0000;">空格</span> "$NAME" = ""<span style="color: #ff0000;">空格</span> ];then      </span></span><span style="color: #00ff00;">在<span style="color: #ff0000;">[ </span>这中间要添加空格<span style="color: #ff0000;">]</span><br />
</span><span id="more-543"></span></p>
<blockquote><p>#!/bin/bash<br />
#ifelif<br />
echo -n “Enter you name:”    //请输入你的名字.<br />
read NAME   //读取NAME<br />
if [ -z $NAME ] || [ "$NAME" = "" ];then    //NAME的长度为0或等于空.<br />
        echo “You did not enter a name.”    //输入你没有输入名字.<br />
elif [ "$NAME" = "root" ];then                  //输入root.<br />
        echo “Hello root”<br />
elif [ "$NAME" = "ruijin" ];then<br />
        echo “ruijin”<br />
else<br />
        echo “You are not root or ruijin,But hi is $NAME”  //如果不是ruijin或是root .但是你输入的是&#8230;<br />
fi</p>
<p><!--more--></p></blockquote>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fwww.ptubuntu.com%2F2008%2F11%2F543.html&amp;title=shell%20to%20if" id="wpa2a_14"><img src="http://www.ptubuntu.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://www.ptubuntu.com/2008/11/543.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>shell简单语句</title>
		<link>http://www.ptubuntu.com/2008/11/531.html</link>
		<comments>http://www.ptubuntu.com/2008/11/531.html#comments</comments>
		<pubDate>Mon, 24 Nov 2008 09:59:22 +0000</pubDate>
		<dc:creator>ptubuntu</dc:creator>
				<category><![CDATA[Linux Server]]></category>
		<category><![CDATA[shell]]></category>
		<category><![CDATA[学习]]></category>
		<category><![CDATA[生活类]]></category>

		<guid isPermaLink="false">http://ptubuntu.com/?p=531</guid>
		<description><![CDATA[最近都在看shell语言.在学这个有些头大.因为一听到这个就有点怕了.所以在学习上会有一些恐惧感吧.但是现在把它当然工作的一部分.也是要硬着头皮去学习.不能落后呀..要不然明天下线的就是我了.所以呀.现在还是要多学一点就不怕明天没有饭吃了.现在要下班了呀&#8230;.. #!/bin/bash #iftest echo -n “Enter your name:” read NAME if [ "$NAME" == "" ]; then echo “You did not enter any information” else         echo “Youe Name is ${NAME}” fi]]></description>
			<content:encoded><![CDATA[<p>最近都在看shell语言.在学这个有些头大.因为一听到这个就有点怕了.所以在学习上会有一些恐惧感吧.但是现在把它当然工作的一部分.也是要硬着头皮去学习.不能落后呀..要不然明天下线的就是我了.所以呀.现在还是要多学一点就不怕明天没有饭吃了.现在要下班了呀&#8230;..</p>
<blockquote><p>#!/bin/bash<br />
#iftest<br />
echo -n “Enter your name:”<br />
read NAME<br />
if [ "$NAME" == "" ];<br />
then<br />
echo “You did not enter any information”<br />
else<br />
        echo “Youe Name is ${NAME}”<br />
fi</p></blockquote>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fwww.ptubuntu.com%2F2008%2F11%2F531.html&amp;title=shell%E7%AE%80%E5%8D%95%E8%AF%AD%E5%8F%A5" id="wpa2a_16"><img src="http://www.ptubuntu.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://www.ptubuntu.com/2008/11/531.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>邮件系统备份脚本</title>
		<link>http://www.ptubuntu.com/2008/11/352.html</link>
		<comments>http://www.ptubuntu.com/2008/11/352.html#comments</comments>
		<pubDate>Fri, 07 Nov 2008 02:22:27 +0000</pubDate>
		<dc:creator>ruijin</dc:creator>
				<category><![CDATA[Linux Server]]></category>
		<category><![CDATA[Mail]]></category>
		<category><![CDATA[shell]]></category>

		<guid isPermaLink="false">http://blog.ptubuntu.com/?p=352</guid>
		<description><![CDATA[1、对mysql 进行备份。 2、对一些重要配置文件进行备份。 3、对邮件存储的结构进行备份。 4、每天备分，只保留7 天的内容。 5、备份完成后自动上传到ftp （其它服务器） 6、系统恢复需要手工恢复，是防止灾难性发生。 7、crontab 内容（当前是root用户） #每天23:59 分执行 59 23 * * * /usr/local/backup/backup.sh &#62; /dev/null 以下脚本，稍作修改就能用于自己的电脑.本脚本在freebsd　执行通过， linux　可能需要跟据实际命令使用方法作修改 下载原脚本 #!/bin/sh backupdir="/home/data/backup/" #备份保存的目录 #如果目录不存在就创建 if [ ! -d $backupdir ];then mkdir $backupdir fi # mkdir today backup today=`date +%Y-%m-%d_%H_%M_%S` #取得当天的日期 fpath=$backupdir$today # 取得备份目录的完整路径 echo $fpath #如果目录不存在就创建 if [ ! -d $fpath [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p>1、对mysql 进行备份。<br />
2、对一些重要配置文件进行备份。<br />
3、对邮件存储的结构进行备份。<br />
4、每天备分，只保留7 天的内容。<br />
5、备份完成后自动上传到ftp （其它服务器）<br />
6、系统恢复需要手工恢复，是防止灾难性发生。<br />
7、crontab 内容（当前是root用户）</p>
<pre>#每天23:59 分执行
59 23 * * * /usr/local/backup/backup.sh &gt; /dev/null</pre>
<p>以下脚本，稍作修改就能用于自己的电脑.本脚本在freebsd　执行通过，<br />
<a href="http://www.ptubuntu.com/tag/linx" class="st_tag internal_tag" rel="tag" title="标签 Linux 下的日志">linux</a>　可能需要跟据实际命令使用方法作修改<br />
<a href="http://www.yiyou.org/upload/shell/backup.sh">下载原脚本</a></p>
<p><span id="more-352"></span></p>
</blockquote>
<pre>#!/bin/sh

backupdir="/home/data/backup/" #备份保存的目录

#如果目录不存在就创建
if [ ! -d $backupdir ];then
	mkdir $backupdir
fi

# mkdir today backup

today=`date +%Y-%m-%d_%H_%M_%S` #取得当天的日期
fpath=$backupdir$today   # 取得备份目录的完整路径
echo $fpath
#如果目录不存在就创建
if [ ! -d $fpath ];then
	mkdir $fpath
fi

# delete old file
#删除旧的文件，+7 表示7 天之前，+30 表示一个月之前
#完整意思 查找备份目录里 7 天之前的文件，并且删除它
find $backupdir -type f -mtime +7 -print -exec rm {} ;

#文件file_list与脚本在同一个目录里，安装在/usr/local/backup ，如果你有什么重要文件备份就写在这里，一行一个。
FL=`cat /usr/local/backup/file_list`
for i in $FL ;do
	cp -Rp $i $fpath #复制保留权限，如果目录同样也可以复制
done

#backup <a href="http://www.ptubuntu.com/tag/mail" class="st_tag internal_tag" rel="tag" title="标签 Mail 下的日志">mail</a> dir
#备份邮件目录的结构，因为我的硬盘小，所以只备份结构。
#如果你要备份邮件，可以将邮件保存的目录写在上面的file_list 里。
find /home/data/domains -type d &gt;$fpath/maildirlist

# backup mysql all
#备份mysql 所有数据库 把yourpasswd 改为你mysql　root　密码
/usr/local/bin/mysqldump --all-databases -uroot -pyourpasswd&gt;$fpath/mysql_all.sql

# backup my self
#备份这个脚本
cp -Rp $0 $fpath
cp -Rp file_list $fpath

# 将备份的东西进行打包
cd $backupdir
tar czf $today.tar.gz $today
rm -rf $today
cd -

# ftp ...
#上传到ftp
ftp -n&lt;&lt;!
open 192.168.1.3 21
user backup backup
binary
lcd $backupdir　#本地目录
prompt off
mdelete * #删除远程所有文件
mput * #上传本地目录所有文件
bye
!

没有添加注解：
#!/bin/sh

backupdir="/home/data/backup/"

if [ ! -d $backupdir ];then
	mkdir $backupdir
fi

# mkdir today backup

today=`date +%Y-%m-%d_%H_%M_%S`
fpath=$backupdir$today
echo $fpath
if [ ! -d $fpath ];then
	mkdir $fpath
fi

# delete old file 

find $backupdir -type f -mtime +7 -print -exec /bin/rm -f {} \;

FL=`cat /usr/local/backup/file_list`

for i in $FL ;do
	cp -Rp $i $fpath
done

#backup <a href="http://www.ptubuntu.com/tag/mail" class="st_tag internal_tag" rel="tag" title="标签 Mail 下的日志">mail</a> dir

find /home/data/domains -type d &gt;$fpath/maildirlist

# backup mysql all
/usr/local/bin/mysqldump --all-databases -uroot -pyourpasswd &gt;$fpath/mysql_all.sql

# backup my self
cp -Rp $0 $fpath
cp -Rp /usr/local/backup/file_list $fpath

cd $backupdir
tar czf $today.tar.gz $today
rm -rf $today
cd -

# ftp ...

ftp -n&lt;&lt;!
open 192.168.1.3 21
user backup backup
binary
lcd $backupdir
prompt off
mdelete *
mput *
bye
!

来自：开源有易<a href="http://www.yiyou.org/" target="_blank">YiYou.Org</a><!--more--></pre>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fwww.ptubuntu.com%2F2008%2F11%2F352.html&amp;title=%E9%82%AE%E4%BB%B6%E7%B3%BB%E7%BB%9F%E5%A4%87%E4%BB%BD%E8%84%9A%E6%9C%AC" id="wpa2a_18"><img src="http://www.ptubuntu.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://www.ptubuntu.com/2008/11/352.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SSH登陆，用XShell</title>
		<link>http://www.ptubuntu.com/2008/11/299.html</link>
		<comments>http://www.ptubuntu.com/2008/11/299.html#comments</comments>
		<pubDate>Tue, 04 Nov 2008 16:23:12 +0000</pubDate>
		<dc:creator>ruijin</dc:creator>
				<category><![CDATA[Linux Server]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[shell]]></category>

		<guid isPermaLink="false">http://blog.ptubuntu.com/?p=299</guid>
		<description><![CDATA[Xshell 是一个 Windows 平台下的终端机模拟器，支援 SSH1, SSH2, SFTP, TELNET, RLOGIN, SERIAL。不用 Putty 的理由是因为 Xshell 可以同时开啟多 session，在管理数台伺服器上方便很多。Xshell 是付费软件，但如果个人使用则免费。 Xshell 官方网站 来自:http://www.real-blog.com/software/497]]></description>
			<content:encoded><![CDATA[<p><strong>Xshell 是一个 Windows 平台下的终端机模拟器，支援 SSH1, SSH2, SFTP, TELNET, RLOGIN, SERIAL。不用 Putty 的理由是因为 Xshell 可以同时开啟多 session，在管理数台伺服器上方便很多。Xshell 是付费软件，但如果个人使用则免费。</strong></p>
<p><strong><a title="Xshell 官方网站" href="http://www.netsarang.com/products/xsh_detail.html" target="_blank">Xshell 官方网站<br />
</a>来自:http://www.real-blog.com/software/497</strong></p>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fwww.ptubuntu.com%2F2008%2F11%2F299.html&amp;title=SSH%E7%99%BB%E9%99%86%EF%BC%8C%E7%94%A8XShell" id="wpa2a_20"><img src="http://www.ptubuntu.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://www.ptubuntu.com/2008/11/299.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

