Archive for 2011年8月25日


1、单网卡绑定多IP在Redhat系列中的实现方法

假设需要绑定多IP的网卡是eth0,请在/etc/sysconfig/network-scripts/目录里面创建一个名为ifcfg-eth0:0的文件
内容样例为:

DEVICE=”eth0:0″
IPADDR=”192.168.0.2″
BROADCAST=”192.168.0.255″
NETMASK=”255.255.255.0″
ONBOOT=”yes”

其中的DEVICE为设备的名称,

IPADDR为此设备的IP地址,

BROADCAST是广播地址,

NETMASK为子网掩码,

ONBOOT 表示在系统启动时自动启动。

如果需要再绑定多一个IP地址,

只需要把文件名和文件内的DEVICE中的eth0:x加一即可。

LINUX最多可以支持255个IP别名。

2、普遍适用的单网卡绑定多IP实现方法

ifconfig eth0:1 192.168.0.3 broadcast 192.168.0.255 netmask 255.255.255.0
可以把上述命令加在启动自运行文件里面,在Gentoo下是/etc/conf.d/local.start,而某些版本的Linux是/etc/rc.d/rc.local。

3、多网卡共用单IP的实现方法

使用多块网卡虚拟成为一块网卡,具有相同的IP地址。这项技术其实在sun和cisco中已经存在,分别称为Trunking和 etherchannel技术,在linux中,这种技术称为bonding。因为bonding在2.4.x以上版本的内核中已经包含了,只需要在编译的时候把网络设备选项中的 Bonding driver support选中就可以了。

然后,重新编译核心,重新起动计算机,执行如下命令:

ismod bonding
ifconfig eth0 down
ifconfig eth1 down
ifconfig bond0 ipaddress
ifenslave bond0 eth0
ifenslave bond0 eth1

现在两块网卡已经象一块一样工作了,这样可以提高集群节点间的数据传输。

你最好把这几句写成一个脚本,再由/etc/rc.d/rc.local或者/etc/conf.d/local.start调用,以便一开机就生效。

bonding对于服务器来是个比较好的选择,在没有千兆网卡时,用两三块100兆网卡作 bonding,可大大提高服务器到交换机之间的带宽。但是需要在交换机上设置连接bonding 网卡的两个口子映射为同一个虚拟接口。

我们可以使用任意一种文字编辑器,比如gedit、kedit、emacs、vi等来编写shell脚本,它必须以如下行开始(必须放在文件的第一行):

# !/bin/sh

注意:最好使用“!/bin/bash”而不是“!/bin/sh”,如果使用tc shell改为tcsh,其他类似。

符号#!用来告诉系统执行该脚本的程序,本例使用/bin/sh。编辑结束并保存后,如果要执行该脚本,必须先使其可执行:

chmod +x filename

此后在该脚本所在目录下,输入 ./filename 即可执行该脚本。

目录
1 变量赋值和引用
2 Shell里的流程控制
2.1 if 语 句
2.2 && 和 || 操作符
2.3 case 语句
2.4 select 语句
2.5 while/for 循环
3 Shell里的一些特殊符号
3.1 引号
4 Here Document
5 Shell里的函数
6 Shell脚本示例
6.1 二进制到十进制的转换
6.2 文件循环拷贝
7 脚本调试
变量赋值和引用

Shell编程中,使用变量无需事先声明,同时变量名的命名须遵循如下规则:

首个字符必须为字母(a-z,A-Z)
中间不能有空格,可以使用下划线(_)
不能使用标点符号
不能使用bash里的关键字(可用help命令查看保留关键字)
需要给变量赋值时,可以这么写:

变量名=值

要取用一个变量的值,只需在变量名前面加一个$ ( 注意: 给变量赋值的时候,不能在”=”两边留空格 )

#!/bin/sh
# 对变量赋值:
a=”hello world” #等号两边均不能有空格存在
# 打印变量a的值:
echo “A is:” $a

挑个自己喜欢的编辑器,输入上述内容,并保存为文件first,然后执行 chmod +x first 使其可执行,最后输入 ./first 执行该脚本。其输出结果如下:

A is: hello world

有时候变量名可能会和其它文字混淆,比如:

num=2
echo “this is the $numnd”

上述脚本并不会输出”this is the 2nd”而是”this is the “;这是由于shell会去搜索变量numnd的值,而实际上这个变量此时并没有值。这时,我们可以用花括号来告诉shell要打印的是num变量:

num=2
echo “this is the ${num}nd”

其输出结果为:this is the 2nd
注意花括号的位置:

num=2
echo “this is the {$num}nd”

其输出结果为:this is the {2}nd
需要注意shell的默认赋值是字符串赋值。比如:

var=1
var=$var+1
echo $var

打印出来的不是2而是1+1。为了达到我们想要的效果有以下几种表达方式:

let “var+=1″
var=$[$var+1]
var=`expr $var + 1`#注意加号两边的空格,否则还是按照字符串的方式赋值。

注意:前两种方式在bash下有效,在sh下会出错。

let表示数学运算,expr用于整数值运算,每一项用空格隔开,$[]将中括号内的表达式作为数学运算先计算结果再输出。

Shell脚本中有许多变量是系统自动设定的,我们将在用到这些变量时再作说明。除了只在脚本内有效的普通shell变量外,还有环境变量,即那些由export关键字处理过的变量。本文不讨论环境变量,因为它们一般只在登录脚本中用到。

Shell里的流程控制

if 语 句
“if”表达式如果条件为真,则执行then后的部分:

if ….; then
….
elif ….; then
….
else
….
fi

大多数情况下,可以使用测试命令来对条件进行测试,比如可以比较字符串、判断文件是否存在及是否可读等等……通常用” [ ] “来表示条件测试,注意这里的空格很重要,要确保方括号前后的空格。

[ -f “somefile” ] :判断是否是一个文件
[ -x “/bin/ls” ] :判断/bin/ls是否存在并有可执行权限
[ -n “$var” ] :判断$var变量是否有值
[ “$a” = “$b” ] :判断$a和$b是否相等
执行man test可以查看所有测试表达式可以比较和判断的类型。下面是一个简单的if语句:

#!/bin/sh

if [ ${SHELL} = “/bin/bash” ]; then
echo “your login shell is the bash (bourne again shell)”
else
echo “your login shell is not bash but ${SHELL}”
fi

变量$SHELL包含有登录shell的名称,我们拿它和/bin/bash进行比较以判断当前使用的shell是否为bash。

&& 和 || 操作符
熟悉C语言的朋友可能会喜欢下面的表达式:

[ -f “/etc/shadow” ] && echo “This computer uses shadow passwords”

这里的 && 就是一个快捷操作符,如果左边的表达式为真则执行右边的语句,你也可以把它看作逻辑运算里的与操作。上述脚本表示如果/etc/shadow文件存在,则 打印”This computer uses shadow passwords”。同样shell编程中还可以用或操作(||),例如:

#!/bin/sh

mailfolder=/var/spool/mail/james
[ -r “$mailfolder” ] || { echo “Can not read $mailfolder” ; exit 1; }
echo “$mailfolder has mail from:”
grep “^From ” $mailfolder

该脚本首先判断mailfolder是否可读,如果可读则打印该文件中的”From” 一行。如果不可读则或操作生效,打印错误信息后脚本退出。需要注意的是,这里我们必须使用如下两个命令:

-打印错误信息
-退出程序
我们使用花括号以匿名函数的形式将两个命令放到一起作为一个命令使用;普通函数稍后再作说明。即使不用与和或操作符,我们也可以用if表达式完成任何事情,但是使用与或操作符会更便利很多 。

case 语句
case表达式可以用来匹配一个给定的字符串,而不是数字(可别和C语言里的switch…case混淆)。

case … in
…) do something here
esac

file命令可以辨别出一个给定文件的文件类型,如:file lf.gz,其输出结果为:

lf.gz: gzip compressed data, deflated, original filename,
last modified: Mon Aug 27 23:09:18 2001, os: Unix

我们利用这点写了一个名为smartzip的脚本,该脚本可以自动解压bzip2, gzip和zip 类型的压缩文件:

#!/bin/sh

ftype=`file “$1″` # Note ‘ and ` is different
case “$ftype” in
“$1: Zip archive”*)
unzip “$1″ ;;
“$1: gzip compressed”*)
gunzip “$1″ ;;
“$1: bzip2 compressed”*)
bunzip2 “$1″ ;;
*) echo “File $1 can not be uncompressed with smartzip”;;
esac

你可能注意到上面使用了一个特殊变量$1,该变量包含有传递给该脚本的第一个参数值。也就是说,当我们运行:

smartzip articles.zip

$1 就是字符串 articles.zip。

select 语句 ========================================
select表达式是bash的一种扩展应用,擅长于交互式场合。用户可以从一组不同的值中进行选择:

select var in … ; do
break;
done
…. now $var can be used ….

下面是一个简单的示例:

#!/bin/sh

echo “What is your favourite OS?”
select var in “Linux” “Gnu Hurd” “Free BSD” “Other”; do
break;
done
echo “You have selected $var”

如果 以上脚本运行出现 select :NOT FOUND 将 #!/bin/sh 改为 #!/bin/bash 该脚本的运行结果如下:

What is your favourite OS?
1) Linux
2) Gnu Hurd
3) Free BSD
4) Other
#? 1
You have selected Linux

while/for 循环
在shell中,可以使用如下循环:

while …; do
….
done

只要测试表达式条件为真,则while循环将一直运行。关键字”break”用来跳出循环,而关键字”continue”则可以跳过一个循环的余下部分,直接跳到下一次循环中。

for循环会查看一个字符串列表(字符串用空格分隔),并将其赋给一个变量:

for var in ….; do
….
done

下面的示例会把A B C分别打印到屏幕上:

#!/bin/sh

for var in A B C ; do
echo “var is $var”
done

下面是一个实用的脚本showrpm,其功能是打印一些RPM包的统计信息:

#!/bin/sh

# list a content summary of a number of RPM packages
# USAGE: showrpm rpmfile1 rpmfile2 …
# EXAMPLE: showrpm /cdrom/RedHat/RPMS/*.rpm
for rpmpackage in $*; do
if [ -r “$rpmpackage” ];then
echo “=============== $rpmpackage ==============”
rpm -qi -p $rpmpackage
else
echo “ERROR: cannot read file $rpmpackage”
fi
done

这里出现了第二个特殊变量$*,该变量包含有输入的所有命令行参数值。如果你运行showrpm openssh.rpm w3m.rpm webgrep.rpm,那么 $* 就包含有 3 个字符串,即openssh.rpm, w3m.rpm和 webgrep.rpm。

Shell里的一些特殊符号

引号
在向程序传递任何参数之前,程序会扩展通配符和变量。这里所谓的扩展是指程序会把通配符(比如*)替换成适当的文件名,把变量替换成变量值。我们可以使用引号来防止这种扩展,先来看一个例子,假设在当前目录下有两个jpg文件:mail.jpg和tux.jpg。

#!/bin/sh

echo *.jpg

运行结果为:

mail.jpg tux.jpg

引号(单引号和双引号)可以防止通配符*的扩展:

#!/bin/sh

echo “*.jpg”
echo ‘*.jpg’

其运行结果为:

*.jpg
*.jpg

其中单引号更严格一些,它可以防止任何变量扩展;而双引号可以防止通配符扩展但允许变量扩展:

#!/bin/sh

echo $SHELL
echo “$SHELL”
echo ‘$SHELL’

运行结果为:

/bin/bash
/bin/bash
$SHELL

此外还有一种防止这种扩展的方法,即使用转义字符——反斜杆::

echo *.jpg
echo $SHELL

输出结果为:

*.jpg
$SHELL

Here Document
当要将几行文字传递给一个命令时,用here documents是一种不错的方法。对每个脚本写一段帮助性的文字是很有用的,此时如果使用here documents就不必用echo函数一行行输出。Here document以 << 开头,后面接上一个字符串,这个字符串还必须出现在here document的末尾。下面是一个例子,在该例子中,我们对多个文件进行重命名,并且使用here documents打印帮助:

#!/bin/sh

# we have less than 3 arguments. Print the help text:
if [ $# -lt 3 ] ; then
cat << HELP

ren — renames a number of files using sed regular expressions USAGE: ren ‘regexp’ ‘replacement’ files…

EXAMPLE: rename all *.HTM files in *.html:
ren ‘HTM$’ ‘html’ *.HTM

HELP
exit 0
fi
OLD=”$1″
NEW=”$2″
# The shift command removes one argument from the list of
# command line arguments.
shift
shift
# $* contains now all the files:
for file in $*; do
if [ -f "$file" ] ; then
newfile=`echo “$file” | sed “s/${OLD}/${NEW}/g”`
if [ -f "$newfile" ]; then
echo “ERROR: $newfile exists already”
else
echo “renaming $file to $newfile …”
mv “$file” “$newfile”
fi
fi
done

这个示例有点复杂,我们需要多花点时间来说明一番。第一个if表达式判断输入命令行参数是否小于3个 (特殊变量$# 表示包含参数的个数) 。如果输入参数小于3个,则将帮助文字传递给cat命令,然后由cat命令将其打印在屏幕上。打印帮助文字后程序退出。如果输入参数等于或大于3个,我们 就将第一个参数赋值给变量OLD,第二个参数赋值给变量NEW。下一步,我们使用shift命令将第一个和第二个参数从参数列表中删除,这样原来的第三个 参数就成为参数列表$*的第一个参数。然后我们开始循环,命令行参数列表被一个接一个地被赋值给变量$file。接着我们判断该文件是否存在,如果存在则 通过sed命令搜索和替换来产生新的文件名。然后将反短斜线内命令结果赋值给newfile。这样我们就达到了目的:得到了旧文件名和新文件名。然后使用 mv命令进行重命名

Shell里的函数
如果你写过比较复杂的脚本,就会发现可能在几个地方使用了相同的代码,这时如果用上函数,会方便很多。函数的大致样子如下:

functionname()
{
# inside the body $1 is the first argument given to the function
# $2 the second …
body
}

你需要在每个脚本的开始对函数进行声明。

下面是一个名为xtitlebar的脚本,它可以改变终端窗口的名称。这里使用了一个名为help的函数,该函数在脚本中使用了两次:

#!/bin/sh
# vim: set sw=4 ts=4 et:
help()
{
cat << HELP
xtitlebar — change the name of an xterm, gnome-terminal or kde konsole
USAGE: xtitlebar [-h] “string_for_titelbar”
OPTIONS: -h help text
EXAMPLE: xtitlebar “cvs”
HELP
exit 0
}
# in case of error or if -h is given we call the function help:
[ -z "$1" ] && help
[ "$1" = "-h" ] && help
# send the escape sequence to change the xterm titelbar:
echo -e “33]0;$107″
#

在脚本中提供帮助是一种很好的编程习惯,可以方便其他用户(和自己)使用和理解脚本。

== 命令行参数 == XXXXXXXXXXXXXXXXXXXXXXXXXX

我们已经见过$* 和 $1, $2 … $9 等特殊变量,这些特殊变量包含了用户从命令行输入的参数。迄今为止,我们仅仅了解了一些简单的命令行语法(比如一些强制性的参数和查看帮助的-h选项)。 但是在编写更复杂的程序时,您可能会发现您需要更多的自定义的选项。通常的惯例是在所有可选的参数之前加一个减号,后面再加上参数值 (比如文件名)。

有好多方法可以实现对输入参数的分析,但是下面的使用case表达式的例子无疑是一个不错的方法。

#!/bin/sh

help()
{
cat < shift by 2
–) shift;break;; # end of options
-*) echo “error: no such option $1. -h for help”;exit 1;;
*) break;;
esac
done

echo “opt_f is $opt_f”
echo “opt_l is $opt_l”
echo “first arg is $1″
echo “2nd arg is $2″

你可以这样运行该脚本:

cmdparser -l hello -f — -somefile1 somefile2

返回结果如下:

opt_f is 1
opt_l is hello
first arg is -somefile1
2nd arg is somefile2

这个脚本是如何工作的呢?脚本首先在所有输入命令行参数中进行循环,将输入参数与case表达式进行比较,如果匹配则设置一个变量并且移除该参数。根据unix系统的惯例,首先输入的应该是包含减号的参数。

Shell脚本示例
=== 一般编程步骤=== xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

现在我们来讨论编写一个脚本的一般步骤。任何优秀的脚本都应该具有帮助和输入参数。写一个框架脚本(framework.sh),该脚本包含了大多数脚本需要的框架结构,是一个非常不错的主意。这样一来,当我们开始编写新脚本时,可以先执行如下命令:

cp framework.sh myscript

然后再插入自己的函数。

让我们来看看如下两个示例。

二进制到十进制的转换
脚本 b2d 将二进制数 (比如 1101) 转换为相应的十进制数。这也是一个用expr命令进行数学运算的例子:

#!/bin/sh
# vim: set sw=4 ts=4 et:
help()
{
cat << HELP

b2d — convert binary to decimal

USAGE: b2d [-h] binarynum

OPTIONS: -h help text

EXAMPLE: b2d 111010
will return 58
HELP
exit 0
}

error()
{
# print an error and exit
echo “$1″
exit 1
}

lastchar()
{
# return the last character of a string in $rval
if [ -z "$1" ]; then
# empty string
rval=”"
return
fi
# wc puts some space behind the output this is why we need sed:
numofchar=`echo -n “$1″ | wc -c | sed ’s/ //g’ `
# now cut out the last char
rval=`echo -n “$1″ | cut -b $numofchar`
}

chop()
{
# remove the last character in string and return it in $rval
if [ -z "$1" ]; then
# empty string
rval=”"
return
fi
# wc puts some space behind the output this is why we need sed:
numofchar=`echo -n “$1″ | wc -c | sed ’s/ //g’ `
if [ "$numofchar" = "1" ]; then
# only one char in string
rval=”"
return
fi
numofcharminus1=`expr $numofchar “-” 1`
# now cut all but the last char:
rval=`echo -n “$1″ | cut -b -$numofcharminus1`
#原来的 rval=`echo -n “$1″ | cut -b 0-${numofcharminus1}`运行时出错.
#原因是cut从1开始计数,应该是cut -b 1-${numofcharminus1}
}

while [ -n "$1" ]; do
case $1 in
-h) help;shift 1;; # function help is called
–) shift;break;; # end of options
-*) error “error: no such option $1. -h for help”;;
*) break;;
esac
done

# The main program
sum=0
weight=1
# one arg must be given:
[ -z "$1" ] && help
binnum=”$1″
binnumorig=”$1″

while [ -n "$binnum" ]; do
lastchar “$binnum”
if [ "$rval" = "1" ]; then
sum=`expr “$weight” “+” “$sum”`
fi
# remove the last position in $binnum
chop “$binnum”
binnum=”$rval”
weight=`expr “$weight” “*” 2`
done

echo “binary $binnumorig is decimal $sum”
#

该脚本使用的算法是利用十进制和二进制数权值 (1,2,4,8,16,..),比如二进制”10″可以这样转换成十进制:

0 * 1 + 1 * 2 = 2

为了得到单个的二进制数我们是用了lastchar 函数。该函数使用wc –c计算字符个数,然后使用cut命令取出末尾一个字符。Chop函数的功能则是移除最后一个字符。

文件循环拷贝
你可能有这样的需求并一直都这么做:将所有发出邮件保存到一个文件中。但是过了几个月之后,这个文件可能会变得很大以至于该文件的访问速度变慢;下 面的脚本 rotatefile 可以解决这个问题。这个脚本可以重命名邮件保存文件(假设为outmail)为outmail.1,而原来的outmail.1就变成了 outmail.2 等等…

#!/bin/sh
# vim: set sw=4 ts=4 et:

ver=”0.1″
help()
{
cat << HELP
rotatefile — rotate the file name
USAGE: rotatefile [-h] filename
OPTIONS: -h help text
EXAMPLE: rotatefile out

This will e.g rename out.2 to out.3, out.1 to out.2, out to out.1[BR]
and create an empty out-file

The max number is 10

version $ver
HELP

exit 0
}

error()
{
echo “$1″
exit 1
}

while [ -n "$1" ]; do
case $1 in
-h) help;shift 1;;
–) break;;
-*) echo “error: no such option $1. -h for help”;exit 1;;
*) break;;
esac
done

# input check:
if [ -z "$1" ] ; then
error “ERROR: you must specify a file, use -h for help”
fi

filen=”$1″
# rename any .1 , .2 etc file:
for n in 9 8 7 6 5 4 3 2 1; do
if [ -f "$filen.$n" ]; then
p=`expr $n + 1`
echo “mv $filen.$n $filen.$p”
mv $filen.$n $filen.$p
fi
done

# rename the original file:
if [ -f "$filen" ]; then
echo “mv $filen $filen.1″
mv $filen $filen.1
fi

echo touch $filen
touch $filen

这个脚本是如何工作的呢?在检测到用户提供了一个文件名之后,首先进行一个9到1的循环;文件名.9重命名为文件名.10,文件名.8重命名为文件 名. 9……等等。循环结束之后,把原始文件命名为文件名.1,同时创建一个和原始文件同名的空文件(touch $filen)

脚本调试
最简单的调试方法当然是使用echo命令。你可以在任何怀疑出错的地方用echo打印变量值,这也是大部分shell程序员花费80%的时间用于调试的原因。Shell脚本的好处在于无需重新编译,而插入一个echo命令也不需要多少时间。

shell也有一个真正的调试模式,如果脚本”strangescript”出错,可以使用如下命令进行调试:

sh -x strangescript

7 上述命令会执行该脚本,同时显示所有变量的值。

shell还有一个不执行脚本只检查语法的模式,命令如下:

sh -n your_script

这个命令会返回所有语法错误。

Ctrl + a 切换到命令行开始

这个操作跟Home实现的结果一样的,但Home在某些Unix环境下无法使用,便可以使用这个组合;在Linux下的vim,这个也是有效的;另外,在Windows的许多文件编辑器里,这个也是有效的。

Ctrl + e 切换到命令行末尾

这个操作跟END实现的结果一样的,但End键在某些Unix环境下无法使用,便可以使用这个组合;在Linux下的vim,这个也是有效的;另外,在Windows的许多文件编辑器里,这个也是有效的。

Ctrl + l 清除屏幕内容,效果等同于clear

Ctrl + u 清除剪切光标之前的内容

这个命令很有用,在nslookup里也是有效的。我有时看见同事一个字一个字的删除shell命令,十分崩溃!其实完全可以用一个Ctrl + u搞定。

Ctrl + k 剪切清除光标之后的内容

Ctrl + y 粘贴刚才所删除的字符

此命令比较强悍,删除的字符有可能是几个字符串,但极有可能是一行命令。

Ctrl + r 在历史命令中查找 (这个非常好用,输入关键字就调出以前的命令了)

这个命令我强烈推荐,有时history比较多时,想找一个比较复杂的,直接在这里,shell会自动查找并调用,方便极了

Ctrl + c 终止命令

Ctrl + d 退出shell,logout

Ctrl + z 转入后台运行

不过,由Ctrl + z转入后台运行的进程在当前用户退出后就会终止,所以用这个不如用nohup命令&,因为nohup命令的作用就是用户退出之后进程仍然继续运行,而现在许多脚本和命令都要求在root退出时仍然有效。

下面再被充下大家不是太熟悉,我用得比较多的操作方式:

!! 重复执行最后一条命令

history 显示你所有执行过的编号+历史命令。这个可以配合!编辑来执行某某命令

↑(Ctrl+p) 显示上一条命令

↓(Ctrl+n) 显示下一条命令

!$ 显示系统最近的一条参数

最后这个比较有用,比如我先用cat /etc/sysconfig/network-scripts/ifconfig-eth0,然后我想用vim编辑。一般的做法是先用↑ 显示最后一条命令,然后用Home移动到命令最前,删除cat,然后再输入vim命令。其实完全可以用vim !$来代替。

Alt + F1 类似Windows下的Win键,在GNOME中打开”应用程序”菜单(Applications)

Alt + F2 类似Windows下的Win + R组合键,在GNOME中运行应用程序

Ctrl + Alt + D 类似Windows下的Win + D组合键,显示桌面

Ctrl + Alt + L 锁定桌面并启动屏幕保护程序

Alt + Tab 同Windows下的Alt + Tab组合键,在不同程序窗口间切换

PrintScreen 全屏抓图

Alt + PrintScreen 当前窗口抓图

Ctrl + Alt + → / ← 在不同工作台间切换

Ctrl + Alt + Shift + → / ← 移动当前窗口到不同工作台

Ctrl+Alt+Shift+Fn 终端N或模拟终端N(n和N为数字1-6)

Ctrl+Alt+Shift+F7 返回桌面

Ctrl+Alt+Shift+F8 未知(终端或模拟终端)

窗口操作快捷键

Alt + F4 关闭窗口

Alt + F5 取消最大化窗口 (恢复窗口原来的大小)

Alt + F7 移动窗口 (注: 在窗口最大化的状态下无效)

Alt + F8 改变窗口大小 (注: 在窗口最大化的状态下无效)

Alt + F9 最小化窗口

Alt + F10 最大化窗口

Alt + Space 打开窗口的控制菜单 (点击窗口左上角图标出现的菜单)

应用程序中的常用快捷键

下面这些并不适用于所有程序。可以和Windows下的快捷键类比下:

Ctrl+N 新建窗口

Ctrl+X 剪切

Ctrl+C 复制

Ctrl+V 粘贴

Ctrl+Z 撤销上一步操作

Ctrl+Shift+Z 重做刚撤销的一步操作

Ctrl+S 保存

文件浏览器

Ctrl+H 显示隐藏文件(切换键)

Ctrl+T 新建标签

Ctrl+Page Up 上一个标签

Ctrl+Page Down 下一个标签

Alt+N 切换到第N个标签(N为数字)

ssh -qTfnN -D 8080 XXX:[email protected]

如果有SSH端口号,则port添加上去。XXX是账号,yyy是密码,A.B.C.D是IP
ssh -qTfnN -D 8080 XXX:[email protected] -p port

浏览器代理工具选ssh -D

编辑/etc/rc.local,加入iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth1 -j MASQUERADE,外网口eth1为dhcp获得IP。

进入本机的数据包为INPUT,从本机发送出去的数据包为OUTPUT,只是路由的包为FORWARD;防火墙就是基于这3个过滤点来操作的。

对于包的操作有:目标(Target)、丢弃(DROP)、接受(ACCEPT)、弹回(REJECT)、日志(LOG)……等等,比如iptables -A INPUT -p icmp -j DROP(-A代表添加到的过滤点 -p针对的协议类型;此条命令的作用是禁ping),通常是拒绝所有,再一个一个的打开。

iptables -F 清空所有规则

iptables -A INPUT -p tcp -d 10.0.0.1 –dport 21 -j DROP (本机地址为10.0.0.1,此条规则为拒绝所有发送到本机TCP 21端口的数据包,即关闭FTP服务)

iptables -A INPUT -p tcp -s 10.0.0.1 –dport 21 -j DROP (此条规则为拒绝所有发送至10.0.0.1的TCP 21端口的数据包)

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

(本机,即服务器的地址为10.0.0.1)

iptables -A INPUT -p tcp -d 10.0.0.1 –dport 22 -j ACCEPT #允许别人访问22端口

iptables -A OUTPUT -p tcp –sport 22 -m state –state ESTABLISHED -j ACCEPT #和自己建立过22端口连接的包才给与回应,防止病毒利用22端口,不允许本地22端口主动产生包发出去

iptables -A INPUT -p tcp –sport 22 -m state –state ESTABLISHED -j ACCPET #只接收ssh服务回应自己SSH请求的回应包

iptables -P INPUT DROP #丢弃所有的input包

iptables -P OUTPUT DROP #丢弃所有的OUTPUT包

iptables -P FORWARD DROP #丢弃所有的FORWARD包

iptables -L -n #查看所有链路信息,如果再加“–line-numbers”则显示编号

iptables -A INPUT -p tcp -d 10.0.0.1 –dport 80 -j ACCEPT #允许别人访问80端口

iptables -A OUTPUT -p tcp –sport 80 -m state –state ESTABLISHED -j ACCEPT #和自己建立过80端口连接的包才给与回应,防止病毒利用80端口,不允许本地80端口主动产生包发出去

iptables -A OUTPUT -p udp -s 10.0.0.1 –dport 53 -j ACCEPT #允许向DNS服务器发送同步数据包

iptables -A OUTPUT -p udp –sport 53 -j ACCEPT #对于自己53端口发送的请求包通过(自己是DNS服务器时)

iptables -A INPUT-p udp –dport 53 -j ACCEPT #允许别人访问自己的53端口(自己是DNS服务器时)

iptables -A INPUT -p udp –sport 53 -j ACCEPT #允许接收DNS服务器的返回包

iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT #允许自己通过环回口访问自己的所有服务

iptables -A OUTPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT #允许自己通过环回口访问自己的所有服务

iptables -I INPUT 1 -p tcp –dport 22 -j LOG –log-level 5 –log-prefix “iptables:” #为22端口的INPUT包增加日志功能,插在input的第1个规则前面,一定要保证在提交到日志之前,没有相同接收或者丢弃包

vi /etc/syslog.conf #编辑日志配置文件,添加kern.=notice /var/log/firewall.log(log-level 5为notice,详情man syslog)

service syslog restart #重启日志服务

tail /var/log/firewall.log -f #查看日志

iptables -A FORWARD -s 10.0.0.0/24 -j ACCEPT #从局域网发给互联网的包全部转发

iptables -A FORWARD -d 10.0.0.0/24 -j ACCEPT #从互联网发送给局域网的包全部转发

还需要打开/proc/sys/net/ipv4/ip_forward 让里面的值变为1(默认值是0),打开转发,此方法是临时生效

vi /ect/sysctl.conf #打开系统配置文件,编辑net.ipv4.ip_forward = 1,此方法是永久生效

iptables -t nat -L -n #查看iptables的nat表

service iptables save #永久性的保存规则,等同于iptables-save > /etc/sysconfig/iptables

iptables -F #清除所有规则
iptables -X #清除所有自定义规则
iptables -Z #各项计数归零
iptables -P INPUT DROP #将input链默认规则设置为丢弃
iptables -P OUTPUT DROP #将output链默认规则设置为丢弃
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT #对运行在本机回环地址上的所有服务放行
iptables -A INPUT -m state –state ESTABLISHED,RELATED -j ACCEPT #把这条语句插在input链的最前面(第一条),并且对状态为ESTABLISHED,RELATED的连接放行。
iptables -A OUTPUT -p tcp –dport 80 -j ACCEPT #允许本机访问其他80服务
iptables -A OUTPUT -p udp –dport 53 -j ACCEPT #允许本机发送域名请求
iptables -A OUTPUT -p icmp -j ACCEPT #对本机出去的所有icmp协议放行,其实如果仅仅只是允许本机ping别的机器,更为严谨的做法是将此语句修改为:
iptables -A OUTPUT -p icmp –icmp-type echo-request -j ACCEPT

对状态为ESTABLISHED和RELATED的包放行,简单的说,就是说对允许出去的包被对方主机收到后,对方主机回应进来的封包放行。这条语句很重 要,可以省去写很多iptables语句,尤其是在有ftp服务器的场合。你理解了这个意思,就应该知道,有了这条语句,第6条语句其实是可以省略的。

封网站:
iptables -F
iptables -X
iptables -Z
iptables -P OUTPUT DROP
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
iptables -A OUTPUT -p udp –dport 53 -j ACCEPT
iptables -A OUTPUT -p tcp -s 192.168.1.10 -d http://www.qq.com -j DROP(禁止网站)
iptables -A FORWARD -p tcp -s 192.168.1.11/24 -d http://www.qq.com -o eth0 -j DROP(禁止网段)
iptables -A FORWARD -p tcp -s 192.168.1.12 -d 192.168.1.13 -o eth0 -j DROP(禁止IP)
iptables -A OUTPUT -p tcp –dport 80 -j ACCEPT (这条写在禁止网站的下面)

#安全规则类似windows防火墙
iptables -A INPUT -p tcp –dport 1:1024 -j DROP
iptables -A INPUT -p udp –dport 1:1024 -j DROP 这两条可以防止nmap探测
iptables -A INPUT -p tcp –dport ** -j ACCEPT (要开放的端口)
#允许的端口,相对协议改一下就可以了, (端口过虑)
============================================

iptables架设安全的vsftp服务器

在实际工作中,可用以下脚本架设一台很的内部FTP;当然也可以配合Wireshark理解 vsftpd的被动与主动的区别,以本机192.168.0.10为例,脚本如下:

#!/bin/bash
-F
iptables -X
iptables -Z
iptables -t nat -F
iptables -t nat -X
iptables -t nat -Z
#开启ip转发功能
echo “1″ > /proc/sys/net/ipv4/ip_forward
#加载ftp需要的一些模块功能
modprobe ip_conntrack_ftp
modprobe ip_conntrack-tftp
modprobe ip_nat_ftp
modprobe ip_nat_tftp
#为了更安全,将OUTPUT默认策略定义为DROP
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD ACCEPT
#开放本机的lo环回口,建议开放,不开放的会出现些莫名其妙的问题
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
#下面的脚本是架设安全的vsftpd关健,后二句脚本是放行服务器向客户端作回应的和已建立连接的数据包,因被动FTP比较复杂,六次握手,所以这里采用状态来做
iptables -A INPUT -s 192.168.0.0/24 -p tcp –dport 21 -j ACCEPT
iptables -A OUTPUT -d 192.168.0.0/24 -p tcp –sport 21 -j ACCEPT
iptables -A INPUT -m state –state RELATED,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -m state –state RELATED,ESTABLISHED -j ACCEPT

=====================================
内网web服务器 适用于中小型公司有内网服务器发布的IPT
=====================================

防止攻击扫描
防止同步包洪水(Sync Flood)
# iptables -A FORWARD -p tcp –syn -m limit –limit 1/s -j ACCEPT
也有人写作
#iptables -A INPUT -p tcp –syn -m limit –limit 1/s -j ACCEPT
–limit 1/s 限制syn并发数每秒1次,可以根据自己的需要修改
防止各种端口扫描
# iptables -A FORWARD -p tcp –tcp-flags SYN,ACK,FIN,RST RST -m limit –limit 1/s -j ACCEPT
Ping洪水攻击(Ping of Death)
# iptables -A FORWARD -p icmp –icmp-type echo-request -m limit –limit 1/s -j ACCEPT
# Null Scan(possibly)XiKc.om
iptables -A INPUT -i eth0 -p tcp –tcp-flags ALL NONE -j DROP

#ubuntu保存与开机加载
iptables-save > iptables.up.rules
cp iptables.up.rules /etc/
vi /etc/network/interfaces

iptables-save > iptables.up.rules cp iptables.up.rules /etc/ vi /etc/network/interfaces

#在interfaces末尾加入
pre-up iptables-restore < /etc/iptables.up.rules
pre-up iptables-restore < /etc/iptables.up.rules

#也可以设置网卡断开的rules。
post-down iptables-restore < /etc/iptables.down.rules
post-down iptables-restore < /etc/iptables.down.rules

#保存
service iptables save
强制所有的客户机访问192.168.1.100这个网站
iptables -t nat -I PREROUTING -i eth0 -p tcp –dport 80 -j DNAT –to-destination 192.168.1.100 (PREROUTING和DNAT一起使用,POSTROUTING和SNAT一起使用)
发布内网的web服务器192.168.1.10
iptables -t nat -I PREROUTING -p tcp –dport 80 -j DNAT –to-destination 192.168.1.10
端口映射到内网的3389
iptables -t nat -I PREROUTING -p tcp –dport 3389 -j DNAT –to-destination 192.168.1.10:3389

可以通过/sbin/iptables -F清除所有规则来暂时停止防火墙: (警告:这只适合在没有配置防火墙的环境中,如果已经配置过默认规则为deny的环境,此步骤将使系统的所有网络访问中断)

如果想清空的话,先执行
/sbin/iptables -P INPUT ACCEPT
然后执行
/sbin/iptables -F
通过iptables -L 看到如下信息
Chain INPUT (policy DROP 0 packets, 0 bytes) (注意 是DROP)
执行/sbin/iptables -F就肯定立马断开连接
当执行了
/sbin/iptables -P INPUT ACCEPT
再次通过iptables -L看信息的话就是
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
所以现在是可以安全使用
/sbin/iptables -F了

——————————————————————

常用的IPTABLES规则如下:
只能收发邮件,别的都关闭
iptables -I Filter -m mac –mac-source 00:0F:EA:25:51:37 -j DROP
iptables -I Filter -m mac –mac-source 00:0F:EA:25:51:37 -p udp –dport 53 -j ACCEPT
iptables -I Filter -m mac –mac-source 00:0F:EA:25:51:37 -p tcp –dport 25 -j ACCEPT
iptables -I Filter -m mac –mac-source 00:0F:EA:25:51:37 -p tcp –dport 110 -j ACCEPT

IPSEC NAT 策略
iptables -I PFWanPriv -d 192.168.100.2 -j ACCEPT
iptables -t nat -A PREROUTING -p tcp –dport 80 -d $INTERNET_ADDR -j DNAT –to-destination 192.168.100.2:80
iptables -t nat -A PREROUTING -p tcp –dport 1723 -d $INTERNET_ADDR -j DNAT –to-destination 192.168.100.2:1723
iptables -t nat -A PREROUTING -p udp –dport 1723 -d $INTERNET_ADDR -j DNAT –to-destination 192.168.100.2:1723
iptables -t nat -A PREROUTING -p udp –dport 500 -d $INTERNET_ADDR -j DNAT –to-destination 192.168.100.2:500
iptables -t nat -A PREROUTING -p udp –dport 4500 -d $INTERNET_ADDR -j DNAT –to-destination 192.168.100.2:4500

FTP服务器的NAT
iptables -I PFWanPriv -p tcp –dport 21 -d 192.168.100.200 -j ACCEPT
iptables -t nat -A PREROUTING -p tcp –dport 21 -d $INTERNET_ADDR -j DNAT –to-destination 192.168.100.200:21

只允许访问指定网址
iptables -A Filter -p udp –dport 53 -j ACCEPT
iptables -A Filter -p tcp –dport 53 -j ACCEPT
iptables -A Filter -d http://www.3322.org -j ACCEPT
iptables -A Filter -d img.cn99.com -j ACCEPT
iptables -A Filter -j DROP

开放一个IP的一些端口,其它都封闭
iptables -A Filter -p tcp –dport 80 -s 192.168.100.200 -d http://www.pconline.com.cn -j ACCEPT
iptables -A Filter -p tcp –dport 25 -s 192.168.100.200 -j ACCEPT
iptables -A Filter -p tcp –dport 109 -s 192.168.100.200 -j ACCEPT
iptables -A Filter -p tcp –dport 110 -s 192.168.100.200 -j ACCEPT
iptables -A Filter -p tcp –dport 53 -j ACCEPT
iptables -A Filter -p udp –dport 53 -j ACCEPT
iptables -A Filter -j DROP

多个端口
iptables -A Filter -p tcp -m multiport –destination-port 22,53,80,110 -s 192.168.20.3 -j REJECT

连续端口
iptables -A Filter -p tcp -m multiport –source-port 22,53,80,110 -s 192.168.20.3 -j REJECT iptables -A Filter -p tcp –source-port 2:80 -s 192.168.20.3 -j REJECT

指定时间上网
iptables -A Filter -s 10.10.10.253 -m time –timestart 6:00 –timestop 11:00 –days Mon,Tue,Wed,Thu,Fri,Sat,Sun -j DROP
iptables -A Filter -m time –timestart 12:00 –timestop 13:00 –days Mon,Tue,Wed,Thu,Fri,Sat,Sun -j ACCEPT
iptables -A Filter -m time –timestart 17:30 –timestop 8:30 –days Mon,Tue,Wed,Thu,Fri,Sat,Sun -j ACCEPT
禁止多个端口服务
iptables -A Filter -m multiport -p tcp –dport 21,23,80 -j ACCEPT

将WAN 口NAT到PC
iptables -t nat -A PREROUTING -i $INTERNET_IF -d $INTERNET_ADDR -j DNAT –to-destination 192.168.0.1

将WAN口8000端口NAT到192。168。100。200的80端口
iptables -t nat -A PREROUTING -p tcp –dport 8000 -d $INTERNET_ADDR -j DNAT –to-destination 192.168.100.200:80

MAIL服务器要转的端口
iptables -t nat -A PREROUTING -p tcp –dport 110 -d $INTERNET_ADDR -j DNAT –to-destination 192.168.100.200:110
iptables -t nat -A PREROUTING -p tcp –dport 25 -d $INTERNET_ADDR -j DNAT –to-destination 192.168.100.200:25

只允许PING 202。96。134。133,别的服务都禁止
iptables -A Filter -p icmp -s 192.168.100.200 -d 202.96.134.133 -j ACCEPT
iptables -A Filter -j DROP
禁用BT配置
iptables –A Filter –p tcp –dport 6000:20000 –j DROP
禁用QQ防火墙配置
iptables -A Filter -p udp –dport ! 53 -j DROP
iptables -A Filter -d 218.17.209.0/24 -j DROP
iptables -A Filter -d 218.18.95.0/24 -j DROP
iptables -A Filter -d 219.133.40.177 -j DROP
基于MAC,只能收发邮件,其它都拒绝
iptables -I Filter -m mac –mac-source 00:0A:EB:97:79:A1 -j DROP
iptables -I Filter -m mac –mac-source 00:0A:EB:97:79:A1 -p tcp –dport 25 -j ACCEPT
iptables -I Filter -m mac –mac-source 00:0A:EB:97:79:A1 -p tcp –dport 110 -j ACCEPT
禁用MSN配置
iptables -A Filter -p udp –dport 9 -j DROP
iptables -A Filter -p tcp –dport 1863 -j DROP
iptables -A Filter -p tcp –dport 80 -d 207.68.178.238 -j DROP
iptables -A Filter -p tcp –dport 80 -d 207.46.110.0/24 -j DROP
只允许PING 202。96。134。133 其它公网IP都不许PING
iptables -A Filter -p icmp -s 192.168.100.200 -d 202.96.134.133 -j ACCEPT
iptables -A Filter -p icmp -j DROP
禁止某个MAC地址访问internet:
iptables -I Filter -m mac –mac-source 00:20:18:8F:72:F8 -j DROP
禁止某个IP地址的PING:
iptables –A Filter –p icmp –s 192.168.0.1 –j DROP
禁止某个IP地址服务:
iptables –A Filter -p tcp -s 192.168.0.1 –dport 80 -j DROP
iptables –A Filter -p udp -s 192.168.0.1 –dport 53 -j DROP
只允许某些服务,其他都拒绝(2条规则)
iptables -A Filter -p tcp -s 192.168.0.1 –dport 1000 -j ACCEPT
iptables -A Filter -j DROP
禁止某个IP地址的某个端口服务
iptables -A Filter -p tcp -s 10.10.10.253 –dport 80 -j ACCEPT
iptables -A Filter -p tcp -s 10.10.10.253 –dport 80 -j DROP
禁止某个MAC地址的某个端口服务
iptables -I Filter -p tcp -m mac –mac-source 00:20:18:8F:72:F8 –dport 80 -j DROP
禁止某个MAC地址访问internet:
iptables -I Filter -m mac –mac-source 00:11:22:33:44:55 -j DROP
禁止某个IP地址的PING:
iptables –A Filter –p icmp –s 192.168.0.1 –j DROP
————————————————————————————————

IPFW 或 Netfilter 的封包流向,local process 不会经过 FORWARD Chain,
因此 lo 只在 INPUT 及 OUTPUT 二个 chain 作用。
样例1:

#!/bin/sh
#
# 静态安全防火墙脚本
#
# created by yejr,2007-03-20
#
#
#定义信任IP列表
#内部ip子网
MY_IP_LIST_1=192.168.8.0/24
#外部ip子网
MY_IP_LIST_2=1.2.3.0/24
#所有
ALL_IP=0/0
#北京ADSL动态IP列表
BJADSL_IP_LIST=221.218.0.0/16
#定义端口列表
#涉及ftp端口
FTP_PORT_1=20
FTP_PORT_RANGE=”1023:65535″
FTP_PORT_2=21
#dns端口
DNS_PORT=53
#httpd端口
HTTP_PORT=80
#ssh 端口
SSH_PORT=4321
IPT=”/sbin/iptables”
# 内网
LC_IFACE=”eth1″
LC_ADDR=”192.168.8.2″
# 公网
INET_IFACE=”eth0″
INET_ADDR=”1.2.3.4″
# 本机
LO_IFACE=”lo”
LO_ADDR=127.0.0.1
# 定义接受请求速率限制
MAX_NUM_PACKS=1024
# 核心模块
/sbin/modprobe ip_tables
# ftp模块
/sbin/modprobe ip_nat_ftp
# 限速模块
/sbin/modprobe ip_conntrack
# 重新设置防火墙到默认状态
$IPT -P INPUT ACCEPT
$IPT -P FORWARD ACCEPT
#$IPT -P OUTPUT ACCEPT
$IPT -F
$IPT -X
# 先拒绝所有请求
$IPT -P INPUT DROP
#$IPT -P OUTPUT DROP
$IPT -P FORWARD DROP
##########################################
# 设定一些内核参数
##########################################
#启动 SYN 泛洪保护
echo ”1″ > /proc/sys/net/ipv4/tcp_syncookies
#启用反向路径源认证,防止欺骗
echo ”1″ > /proc/sys/net/ipv4/conf/all/rp_filter
#关闭 icom echo 广播包请求
echo ”1″ > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
#拒绝源路由包
echo ”0″ > /proc/sys/net/ipv4/conf/all/accept_source_route
#仅仅接收发给默认网关列表中网关的ICMP重定向消息
echo ”1″ > /proc/sys/net/ipv4/conf/all/secure_redirects
#记录来自非法ip的请求
echo ”1″ > /proc/sys/net/ipv4/conf/all/log_martians
##########################################
# 建立规则
##########################################
# 无效请求包规则
$IPT -N bad_packets
# 另一个恶意 TCP 包规则
$IPT -N bad_tcp_packets
# ICMP规则(进/出)
$IPT -N icmp_packets
# 来自公网的UDP请求规则
$IPT -N inet_udp_inbound
# 从本机发往公网的UDP请求规则,默认全部允许
$IPT -N udp_outbound
# 来自公网的 TCP 请求规则
$IPT -N inet_tcp_inbound
# 从本机发往公网的 TCP 请求规则,默认全部允许
$IPT -N tcp_outbound
##########################################
# 恶意请求规则
##########################################
# 立刻断掉非法的包并且记录
$IPT -A bad_packets -p ALL -m state –state INVALID
-j LOG –log-prefix ”IPTABLES_INVALID_PACKET:”
$IPT -A bad_packets -p ALL -m state –state INVALID
-j DROP
# 再次检查 TCP 包是否还有问题
$IPT -A bad_packets -p tcp -j bad_tcp_packets
# 都正确了,返回
$IPT -A bad_packets -p ALL -j RETURN
##########################################
# 恶意 TCP 请求
##########################################
#
# 所有的 TCP 请求都必须经过以下规则过滤. 任何新请求都
# 必须以一个 sync 包开始.
# 如果不是这样的话,很可能表示这是一个扫描动作,这些有
# NEW 状态的包会被丢弃
#
$IPT -A bad_tcp_packets -p tcp ! –syn -m state –state
NEW -j LOG –log-prefix ”IPTABLES_NEW_NOT_SYN:”
$IPT -A bad_tcp_packets -p tcp ! –syn -m state –state
NEW -j DROP
$IPT -A bad_tcp_packets -p tcp –tcp-flags ALL NONE -j
LOG –log-prefix ”IPTABLES_STEALTH_SCAN:”
$IPT -A bad_tcp_packets -p tcp –tcp-flags ALL NONE -j DROP
$IPT -A bad_tcp_packets -p tcp –tcp-flags ALL ALL -j
LOG –log-prefix ”IPTABLES_STEALTH_SCAN:”
$IPT -A bad_tcp_packets -p tcp –tcp-flags ALL ALL -j DROP
$IPT -A bad_tcp_packets -p tcp –tcp-flags ALL FIN,URG,PSH
-j LOG –log-prefix ”IPTABLES_STEALTH_SCAN:”
$IPT -A bad_tcp_packets -p tcp –tcp-flags ALL FIN,URG,PSH
-j DROP
$IPT -A bad_tcp_packets -p tcp –tcp-flags ALL SYN,RST,ACK,FIN,URG
-j LOG –log-prefix ”IPTABLES_STEALTH SCAN:”
$IPT -A bad_tcp_packets -p tcp –tcp-flags ALL
SYN,RST,ACK,FIN,URG -j DROP
$IPT -A bad_tcp_packets -p tcp –tcp-flags
SYN,RST SYN,RST -j LOG –log-prefix
“IPTABLES_STEALTH SCAN:”
$IPT -A bad_tcp_packets -p tcp –tcp-flags
SYN,RST SYN,RST -j DROP
$IPT -A bad_tcp_packets -p tcp –tcp-flags
SYN,FIN SYN,FIN -j LOG –log-prefix
“IPTABLES_STEALTH SCAN:”
$IPT -A bad_tcp_packets -p tcp –tcp-flags SYN,FIN SYN,FIN -j DROP
# 都没问题了,返回
$IPT -A bad_tcp_packets -p tcp -j RETURN
##########################################
# ICMP 包规则
##########################################
#
# ICMP 包必须封装在一个2层的帧中,因此它们不会有碎片.
# 带有碎片的 ICMP 包通常被
# 标记为恶意攻击
#
$IPT -A icmp_packets –fragment -p ICMP -j LOG
–log-prefix ”IPTABLES_ICMP Fragment:”
$IPT -A icmp_packets –fragment -p ICMP -j DROP
#
# 默认地,所有丢弃的 ICMP 包都不记录日志. ”冲击波”
# 以及 ”蠕虫” 会导致系统发起大量
# ping 请求. 如果想要记录 icmp log 就不要把本行注释掉
#
# 允许自有服务器ip及北京地区adsl ip进行 PING
$IPT -A icmp_packets -p ICMP -s $MY_IP_LIST_2 -j ACCEPT
$IPT -A icmp_packets -p ICMP -s $BJADSL_IP_LIST -j ACCEPT
# 拒掉其他 PING
$IPT -A icmp_packets -p ICMP -s 0/0 –icmp-type 8 -j DROP
# 接受超时 icmp 包
$IPT -A icmp_packets -p ICMP -s 0/0 –icmp-type 11 -j ACCEPT
##########################################
# TCP & UDP 包规则
##########################################
##########################################
# 来自公网的 UDP 请求
##########################################
#$IPT -A inet_udp_inbound -p UDP
-s $MY_IP_LIST_2 –dport $DNS_PORT -j ACCEPT
# 都没问题了,返回
$IPT -A inet_udp_inbound -p UDP -j RETURN
##########################################
# 发往公网的 UDP 请求
##########################################
# 都没问题了,返回
$IPT -A udp_outbound -p UDP -s 0/0 -j ACCEPT
##########################################
# 来自公网的 TCP 请求
##########################################
# sshd 只对 北京ADSL IP段开放
$IPT -A inet_tcp_inbound -p TCP
-s $BJADSL_IP_LIST –dport $SSH_PORT -j ACCEPT
# 允许自有服务器 IP 的 FTP 端口请求
# FTP Data fix
$IPT -A inet_tcp_inbound -p TCP -s $MY_IP_LIST_2
–sport $FTP_PORT_1 –dport $FTP_PORT_RANGE ! –syn
-m state –state RELATED -j ACCEPT
$IPT -A inet_tcp_inbound -p TCP -s $MY_IP_LIST_2
-m state –state ESTABLISHED -j ACCEPT
$IPT -A inet_tcp_inbound -p UDP -s $MY_IP_LIST_2
–dport $FTP_PORT_RANGE -j ACCEPT
$IPT -A inet_tcp_inbound -p TCP -s $MY_IP_LIST_2
–dport $FTP_PORT_1 ! –syn -j ACCEPT
$IPT -A inet_tcp_inbound -p TCP -s $MY_IP_LIST_2
–dport $FTP_PORT_2 -j ACCEPT
#允许所有ip访问 http 服务
$IPT -A inet_tcp_inbound -p TCP -s $ALL_IP
–dport $HTTP_PORT -j ACCEPT
# 都没问题了,返回
$IPT -A inet_tcp_inbound -p TCP -j RETURN
##########################################
# 发往公网的 TCP 请求
##########################################
# 都没问题了,返回
$IPT -A tcp_outbound -p TCP -s 0/0 -j ACCEPT
##########################################
# 其他收到的请求
##########################################
# 允许本机及本子网间的任何通信
$IPT -A INPUT -p ALL -i $LO_IFACE -j ACCEPT
$IPT -A INPUT -p ALL -d $LC_ADDR -j ACCEPT
# 来自信任ip的任何请求都接受
$IPT -A INPUT -p ALL -s $MY_IP_LIST_1 -j ACCEPT
$IPT -A INPUT -p ALL -s $MY_IP_LIST_2 -j ACCEPT
# 丢弃任何错误包
$IPT -A INPUT -p ALL -j bad_packets
# 拒掉 DOCSIS 请求
$IPT -A INPUT -p ALL -d 224.0.0.1 -j REJECT
# 接受 Established 连接
$IPT -A INPUT -p ALL -i $INET_IFACE -m state
–state ESTABLISHED,RELATED -j ACCEPT
# 定义上面的几条路由规则
$IPT -A INPUT -p TCP -d $INET_ADDR -j inet_tcp_inbound
$IPT -A INPUT -p UDP -d $INET_ADDR -j inet_udp_inbound
$IPT -A INPUT -p ICMP -d $INET_ADDR -j icmp_packets
# 丢弃且不记录广播包
$IPT -A INPUT -m pkttype –pkt-type broadcast -j REJECT
# 记录其他未匹配到的包
$IPT -A INPUT -m limit –limit $MAX_NUM_PACKS/minute
–limit-burst $MAX_NUM_PACKS -j LOG –log-prefix
“IPTABLES_MISS_MATCH_INPUT:”
##########################################
# 其他发出的请求
##########################################
# 无论如何都丢弃错误的 ICMP 包,防止溢出
$IPT -A OUTPUT -m state -p icmp –state INVALID
-j REJECT
# 允许对外的任何请求
$IPT -A OUTPUT -p ALL -s $ALL_IP -j ACCEPT
# 记录其他未匹配到的包
$IPT -A OUTPUT -m limit –limit $MAX_NUM_PACKS/minute
–limit-burst $MAX_NUM_PACKS -j LOG –log-prefix
“IPTABLES_MISS_MATCH_OUTPUT: ”
——————————————
我的样例:
——————————————

#!/bin/sh
#
# rc.firewall – Initial SIMPLE IP Firewall script for Linux 2.6.x and iptables
#
# Copyright (C) 2006 Oskar Andreasson
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; version 2 of the License.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program or from the site that you downloaded it
# from; if not, write to the Free Software Foundation, Inc., 59 Temple
# Place, Suite 330, Boston, MA 02111-1307 USA
#
###########################################################################
#
# 1. Configuration options.
#
#
# 1.1 Internet Configuration.
#
INET_IP=”1.2.3.4″
INET_IP_1=”1.2.3.5″
INET_IFACE=”eth0″
INET_BROADCAST=”1.2.3.127″
#
# 1.1.1 DHCP
#
#
# 1.1.2 PPPoE
# 1.2 Local Area Network configuration.
#
# your LAN’s IP range and localhost IP. /24 means to only use the first 24
# bits of the 32 bit IP address. the same as netmask 255.255.255.0
#
LAN_IP=”192.168.0.33″
LAN_IP_RANGE=”192.168.0.0/24″
LAN_IFACE=”eth1″
#
# 1.3 DMZ Configuration.
#
#
# 1.4 Localhost Configuration.
#
LO_IFACE=”lo”
LO_IP=”127.0.0.1″
#
# 1.5 IPTables Configuration.
#
IPTABLES=”/sbin/iptables”
#
# 1.6 Other Configuration.
#
###########################################################################
#
# 2. Module loading.
#
#
# Needed to initially load modules
/sbin/depmod -a
#
# 2.1 Required modules
#
/sbin/modprobe ip_tables
/sbin/modprobe ip_conntrack
/sbin/modprobe iptable_filter
#/sbin/modprobe iptable_mangle
#/sbin/modprobe iptable_nat
/sbin/modprobe ipt_LOG
/sbin/modprobe ipt_limit
/sbin/modprobe ipt_state
#
# 2.2 Non-Required modules
#
#/sbin/modprobe ipt_owner
#/sbin/modprobe ipt_REJECT
#/sbin/modprobe ipt_MASQUERADE
#/sbin/modprobe ip_conntrack_ftp
#/sbin/modprobe ip_conntrack_irc
#/sbin/modprobe ip_nat_ftp
#/sbin/modprobe ip_nat_irc
###########################################################################
#
# 3. /proc set up.
#
#
# 3.1 Required proc configuration
#
#echo ”1″ > /proc/sys/net/ipv4/ip_forward
echo ”1″ > /proc/sys/net/ipv4/tcp_syncookies
echo ”1″ > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses
# 3.2 Non-Required proc configuration
#
#echo ”1″ > /proc/sys/net/ipv4/conf/all/rp_filter
#echo ”1″ > /proc/sys/net/ipv4/conf/all/proxy_arp
#echo ”1″ > /proc/sys/net/ipv4/ip_dynaddr
#echo ”1″ > /proc/sys/net/ipv4/tcp_syncookies
#启用反向路径源认证,防止欺骗
#echo ”1″ > /proc/sys/net/ipv4/conf/all/rp_filter
#关闭 icom echo 广播包请求
#echo ”1″ > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
#拒绝源路由包
#echo ”0″ > /proc/sys/net/ipv4/conf/all/accept_source_route
#仅仅接收发给默认网关列表中网关的ICMP重定向消息
#echo ”1″ > /proc/sys/net/ipv4/conf/all/secure_redirects
#记录来自非法ip的请求
#echo ”1″ > /proc/sys/net/ipv4/conf/all/log_martians
###########################################################################
#
# 4. rules set up.
#
######
# 4.1 Filter table
#
#
# 4.1.1 Set policies
#
$IPTABLES -F
$IPTABLES -X
$IPTABLES -F -t mangle
$IPTABLES -t mangle -X
$IPTABLES -F -t nat
$IPTABLES -t nat -X
$IPTABLES -P INPUT DROP
$IPTABLES -P OUTPUT DROP
$IPTABLES -P FORWARD DROP
#
# 4.1.2 Create userspecified chains
#
#
# Create chain for bad tcp packets
#
$IPTABLES -N bad_tcp_packets
#
# Create separate chains for ICMP, TCP and UDP to traverse
#
$IPTABLES -N allowed
$IPTABLES -N tcp_packets
$IPTABLES -N udp_packets
$IPTABLES -N icmp_packets
#
# 4.1.3 Create content in userspecified chains
#
#
# bad_tcp_packets chain
#
$IPTABLES -A bad_tcp_packets -p tcp –tcp-flags SYN,ACK SYN,ACK -m state –state NEW -j REJECT –reject-with tcp-reset
$IPTABLES -A bad_tcp_packets -p tcp ! –syn -m state –state NEW -j LOG –log-prefix ”New not syn:”
#$IPTABLES -A bad_tcp_packets -p tcp ! –syn -m state –state NEW -j DROP
#$IPT -A bad_packets -p ALL -m state –state INVALID -j LOG –log-prefix ”IPTABLES_INVALID_PACKET:”
#$IPT -A bad_packets -p ALL -m state –state INVALID -j DROP
#
# allowed chain
#
$IPTABLES -A allowed -p TCP –syn -j ACCEPT
$IPTABLES -A allowed -p TCP -m state –state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A allowed -p TCP -j DROP
#
# TCP rules
#
#$IPTABLES -A tcp_packets -p TCP -s 0/0 –dport 21 -j allowed
$IPTABLES -A tcp_packets -p TCP -s 0/0 –dport 30000 -j allowed
#$IPTABLES -A tcp_packets -p TCP -s 0/0 –dport 22 -j allowed
$IPTABLES -A tcp_packets -p TCP -s 0/0 –dport 80 -j allowed
$IPTABLES -A tcp_packets -p TCP -s 0/0 –dport 10050 -j allowed
$IPTABLES -A tcp_packets -p TCP -s 0/0 –dport 10051 -j allowed
$IPTABLES -A tcp_packets -p TCP -s 0/0 -d $INET_IP_1 –dport 25 -j allowed
$IPTABLES -A tcp_packets -p TCP -s 0/0 -d $INET_IP_1 –dport 110 -j allowed
#$IPTABLES -A tcp_packets -p TCP -s 0/0 –dport 2009 -j allowed
#
# UDP ports
#
#$IPTABLES -A udp_packets -p UDP -s 0/0 –destination-port 53 -j ACCEPT
#$IPTABLES -A udp_packets -p UDP -s 0/0 –destination-port 123 -j ACCEPT
#$IPTABLES -A udp_packets -p UDP -s 0/0 –destination-port 2074 -j ACCEPT
#$IPTABLES -A udp_packets -p UDP -s 0/0 –destination-port 4000 -j ACCEPT
#
# In Microsoft Networks you will be swamped by broadcasts. These lines
# will prevent them from showing up in the logs.
#
$IPTABLES -A udp_packets -p UDP -i $INET_IFACE -d $INET_BROADCAST –destination-port 135:139 -j DROP
#
# If we get DHCP requests from the Outside of our network, our logs will
# be swamped as well. This rule will block them from getting logged.
#
$IPTABLES -A udp_packets -p UDP -i $INET_IFACE -d 255.255.255.255 –destination-port 67:68 -j DROP
#
# ICMP rules
#
$IPTABLES -A icmp_packets -p ICMP -s 0/0 –icmp-type 8 -j ACCEPT
$IPTABLES -A icmp_packets -p ICMP -s 0/0 –icmp-type 11 -j ACCEPT
#
# 4.1.4 INPUT chain
#
#
# Bad TCP packets we don’t want.
#
$IPTABLES -A INPUT -p tcp -j bad_tcp_packets
#
# Special rule for DHCP requests from LAN, which are not caught properly
# otherwise.
#
#$IPTABLES -A INPUT -p UDP -i $LAN_IFACE –dport 67 –sport 68 -j ACCEPT
#
# Rules for incoming packets from the internet.
#
$IPTABLES -A INPUT -p ALL -d $INET_IP -m state –state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A INPUT -p ALL -d $INET_IP_1 -m state –state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A INPUT -p TCP -i $INET_IFACE -j tcp_packets
$IPTABLES -A INPUT -p UDP -i $INET_IFACE -j udp_packets
$IPTABLES -A INPUT -p ICMP -i $INET_IFACE -j icmp_packets
# Rules for special networks not part of the Internet
#
$IPTABLES -A INPUT -p ALL -i $LAN_IFACE -s $LAN_IP_RANGE -j ACCEPT
$IPTABLES -A INPUT -p ALL -i $LO_IFACE -s $LO_IP -j ACCEPT
$IPTABLES -A INPUT -p ALL -i $LO_IFACE -s $LAN_IP -j ACCEPT
$IPTABLES -A INPUT -p ALL -i $LO_IFACE -s $INET_IP -j ACCEPT
$IPTABLES -A INPUT -p ALL -i $LO_IFACE -s $INET_IP_1 -j ACCEPT
#
# If you have a Microsoft Network on the outside of your firewall, you may
# also get flooded by Multicasts. We drop them so we do not get flooded by
# logs
#
$IPTABLES -A INPUT -i $INET_IFACE -d 224.0.0.0/8 -j DROP
#
# Log weird packets that don’t match the above.
#
$IPTABLES -A INPUT -m limit –limit 3/minute –limit-burst 3 -j LOG –log-level DEBUG –log-prefix ”IPT INPUT packet died: ”
#
# 4.1.5 FORWARD chain
#
#
# Bad TCP packets we don’t want
#
#$IPTABLES -A FORWARD -p tcp -j bad_tcp_packets
#
# Accept the packets we actually want to forward
#
#$IPTABLES -A FORWARD -i $LAN_IFACE -j ACCEPT
#$IPTABLES -A FORWARD -m state –state ESTABLISHED,RELATED -j ACCEPT
#
# Log weird packets that don’t match the above.
#$IPTABLES -A FORWARD -m limit –limit 3/minute –limit-burst 3 -j LOG –log-level DEBUG –log-prefix ”IPT FORWARD packet died: ”
#
# 4.1.6 OUTPUT chain
#
#
# Bad TCP packets we don’t want.
#
$IPTABLES -A OUTPUT -p tcp -j bad_tcp_packets
#
# Special OUTPUT rules to decide which IP’s to allow.
#
$IPTABLES -A OUTPUT -p ALL -s $LO_IP -j ACCEPT
$IPTABLES -A OUTPUT -p ALL -s $LAN_IP -j ACCEPT
$IPTABLES -A OUTPUT -p ALL -s $INET_IP -j ACCEPT
$IPTABLES -A OUTPUT -p ALL -s $INET_IP_1 -j ACCEPT
#
# Log weird packets that don’t match the above.
#
#$IPTABLES -A OUTPUT -m limit –limit 3/minute –limit-burst 3 -j LOG –log-level DEBUG –log-prefix ”IPT OUTPUT packet died: ”
######
# 4.2 nat table
#
#
# 4.2.1 Set policies
#
#
# 4.2.2 Create user specified chains
#
#
# 4.2.3 Create content in user specified chains
#
#
# 4.2.4 PREROUTING chain
#
#
# 4.2.5 POSTROUTING chain
#
#
# Enable simple IP Forwarding and Network Address Translation
#
#$IPTABLES -t nat -A POSTROUTING -o $INET_IFACE -j SNAT –to-source $INET_IP
#
# 4.2.6 OUTPUT chain
#
######
# 4.3 mangle table
#
#
# 4.3.1 Set policies
#
#
# 4.3.2 Create user specified chains
#
#
# 4.3.3 Create content in user specified chains
#
#
# 4.3.4 PREROUTING chain
#
#
# 4.3.5 INPUT chain
#
#
# 4.3.6 FORWARD chain
#
#
# 4.3.7 OUTPUT chain
#
#
# 4.3.8 POSTROUTING chain
#
————————————

1.shell脚本死活不执行
问题:某天研发某同事找我说帮他看看他写的shell脚本,死活不执行,报错。我看了下,脚本很简单,也没有常规性的错误,报“: bad interpreter: No such file or directory”错。一
看这错,我就问他是不是在windows下编写的脚本,然后在上传到linux服务器的……果然。
原因:在DOS/Windows里,文本文件的换行符为rn,而在*nix系统里则为n,所以DOS/Windows里编辑过的文本文件到了*nix里,每一行都多了个^M。
解决:1)重新在linux下编写脚本;2)vi :% s/r//g :% s/^M//g (^M输入用Ctrl+v, Ctrl+m)
——————————————————————————————————————————
2.crontab输出
问题:/var/spool/clientmqueue目录占用空间超过100G
原因:cron中执行的程序有输出内容,输出内容会以邮件形式发给cron的用户,而sendmail没有启动所以就产生了/var/spool/clientmqueue目录下的那些文件,日积月累可能撑破磁盘。
解决:1)直接手动删除:ls |xargs rm -f ; 2)彻底解决:在cron的自动执行语句后加上 >/dev/null 2>&1
——————————————————————————————————————————

3.telnet很慢
问题:某天研发某同事说10.50访问10.52memcached服务异常,让我们检查下看网络/服务/系统是否有异常。检查发现系统正常,服务正常,10.50ping10.52也正常,但10.50telnet10.52很慢。同时发现该机器的namesever是不起作用的。
原因:because your PC doesn’t do a reverse DNS lookup on your IP then… when you telnet/ftp into your linux box, it’ll do a dns lookup on you。
解决:1)修改/etc/hosts使hostname和ip对应; 2)在/etc/resolv.conf注释掉nameserver或者找一个“活的”nameserver。
——————————————————————————————————————————
4.Read-only file system
问题:同事在mysql里建表建不成功,提示如下:
mysql>create table wosontest (colddname1 char(1));
ERROR 1005 (HY000): Can’t create table ‘wosontest’ (errno: 30)
经检查mysql用户权限以及相关目录权限没问题;用perror 30提示信息为:OS error code 30: Read-only file system
可能原因:1)文件系统损坏;2)磁盘又坏道;3)fstab文件配置错误,如分区格式错误错误(将ntfs写成了fat)、配置指令拼写错误等。
解决:1)由于是测试机,重启机器后恢复;2)网上说用mount可解决。
——————————————————————————————————————————
5.文件删了磁盘空间没释放
问题:某天发现某台机器df -h已用磁盘空间为90G,而du -sh /*显示所有使用空间加起来才30G,囧。
原因:可能某人直接用rm删除某个正在写的文件,导致文件删了但磁盘空间没释放的问题
解决:
1)最简单重启系统或者重启相关服务。
2)干掉进程
/usr/sbin/lsof|grep deleted
ora 25575 data 33u REG 65,65 4294983680 /oradata/DATAPRE/UNDOTBS009.dbf (deleted)
从lsof的输出中,我们可以发现pid为25575的进程持有着以文件描述号(fd)为 33打开的文件/oradata/DATAPRE/UNDOTBS009.dbf。在我们找到了这个文件之后可以通过结束进程的方式来释放被占用的空间:echo > /proc/25575/fd/33
3)删除正在写的文件一般用 cat /dev/null > file
——————————————————————————————————————————
6.find文件
问题:在tmp目录下有大量包含picture_*的临时文件,每天晚上2:30对一天前的文件进行清理。之前在crontab下跑如下脚本,但是发现脚本效率很低,每次执行时负载猛涨,影响到其他服务。
#!/bin/sh
find /tmp -name “picture_*” -mtime +1 -exec rm -f {} ;
原因:目录下有大量文件,用find很耗资源。
解决:
#!/bin/sh
cd /tmp
time=`date -d “2 day ago” “+%b %d”`
ls -l|grep “picture” |grep “$time”|awk ‘{print $NF}’|xargs rm -rf
——————————————————————————————————————————
7.获取不了网关mac地址
问题:从2.14到3.65(映射地址2.141)网络不通,但是从3端的其他机器到3.65网络OK。
原因:
# arp
Address HWtype HWaddress Flags Mask Iface
192.168.3.254 ether incomplet CM bond0
表面现象是机器自动获取不了网关MAC地址,网络工程师说是网络设备的问题,具体不清。
解决:arp绑定,arp -i bond0 -s 192.168.3.254 00:00:5e:00:01:64
——————————————————————————————————————————
8.问题:某天研发某同事说网站前端+1环境http无法启动,我上去看了下。报如下错:
/etc/init.d/httpd start
Starting httpd: [Sat Jan 29 17:49:00 2011] [warn] module antibot_module is already loaded, skipping
Use proxy forward as remote ip : true.
Antibot exclude pattern : .*.[(js|css|jpg|gif|png)]
Antibot seed check pattern : login
(98)Address already in use: make_sock: could not bind to address [::]:7080
(98)Address already in use: make_sock: could not bind to address 0.0.0.0:7080
no listening sockets available, shutting down
Unable to open log [FAILED]
原因:
1)端口被占用:表面看是7080端口被占用,于是netstat -npl|grep 7080看了下发现7080没有占用;
2)在配置文件中重复写了端口,如果在以下两个文件同时写了Listen 7080
/etc/httpd/conf/http.conf
/etc/httpd/conf.d/t.10086.cn.conf
解决:注释掉/etc/httpd/conf.d/t.10086.cn.conf的Listen 7080,重启,OK。
——————————————————————————————————————————
9.too many open file终极解决方案
echo “” >> /etc/security/limits.conf
echo “* soft nproc 65535″ >> /etc/security/limits.conf
echo “* hard nproc 65535″ >> /etc/security/limits.conf
echo “* soft nofile 65535″ >> /etc/security/limits.conf
echo “* hard nofile 65535″ >> /etc/security/limits.conf
echo “” >> /root/.bash_profile
echo “ulimit -n 65535″ >> /root/.bash_profile
echo “ulimit -u 65535″ >> /root/.bash_profile
最后重启机器 或者执行 ulimit -u 655345 && ulimit -n 65535
——————————————————————————————————————————
10.ibdata1和mysql-bin
问题:2.51磁盘空间报警,经查发现ibdata1和mysql-bin日志占用空间太多(其中ibdata1超过120G,mysql-bin超过80G)
原因:ibdata1是存储格式,在INNODB类型数据状态下,ibdata1用来存储文件的数据和索引,而库名的文件夹里的那些表文件只是结构而已。
innodb存储引擎有两种表空间的管理方式,分别是:
1)共享表空间(可拆分为多个小的表空间文件),这个是我们目前多数数据库使用的方法;
2)独立表空间,每一个表有一个独立的表空间(磁盘文件)
对于两种管理方式,各有优劣,具体如下:
①共享表空间:
优点:可以将表空间分成多个文件存放到不同的磁盘上(表空间文件大小不受表大小的限制,一个表可以分布在不同步的文件上)。
缺点:所有数据和索引存放在一个文件中,则随着数据的增加,将会有一个很大的文件,虽然可以把一个大文件分成多个小文件,但是多个表及索引在表空间中混合存储,这样如果对于一个表做了大量删除操作后表空间中将有大量空隙。对于共享表空间管理的方式下,一旦表空间被分配,就不能再回缩了。当出现临时建索引或是创建一个临时表的操作表空间扩大后,就是删除相关的表也没办法回缩那部分空间了。
②独立表空间:在配置文件(my.cnf)中设置: innodb_file_per_table
特点:每个表都有自已独立的表空间;每个表的数据和索引都会存在自已的表空间中。
优点:表空间对应的磁盘空间可以被收回(Drop table操作自动回收表空间,如果对于删除大量数据后的表可以通过:alter table tbl_name engine=innodb;回缩不用的空间。
缺点:如果单表增加过大,如超过100G,性能也会受到影响。在这种情况下,如果使用共享表空间可以把文件分开,但有同样有一个问题,如果访问的范围过大同样会访问多个文件,一样会比较慢。如果使用独立表空间,可以考虑使用分区表的方法,在一定程度上缓解问题。此外,当启用独立表空间模式时,需要合理调整innodb_open_files参数的设置。
解决:
1)ibdata1数据太大:只能通过dump,导出建库的sql语句,再重建的方法。
2)mysql-bin Log太大:
①手动删除:
删除某个日志:mysql>PURGE MASTER LOGS TO ‘mysql-bin.010′;
删除某天前的日志:mysql>PURGE MASTER LOGS BEFORE ’2010-12-22 13:00:00′;
②在/etc/my.cnf里设置只保存N天的bin-log日志
expire_logs_days = 30 //Binary Log自动删除的天数

#!/bin/bash
echo “********** These files will be sync **********”
rsync -avn -e ‘ssh -p6602’ /htdocs/www/ 192.168.1.166:/htdocs/www/ –exclude-from=/apps/exclude.file
echo “********** Sure you want to sync?(y/n)”
while :
do
read input
case $input in
Y|y)
echo “Start sync”
rsync -avz -e ‘ssh -p6611’ htdocs/www/ 192.168.1.166:/htdocs/www/ –exclude-from=/apps/exclude.file
exit
;;
N|n)
echo “Quit”
exit
;;
*)
echo “Please input y/n”
;;
esac
done