netstat 查看网络状况



netstat命令用来打印网络连接状况系统所开放端口路由表等信息笔者最常用的关于netstat的命令就是这个netstat -lnp
(打印当前系统启动哪些端口)以及netstat -an (打印网络连接状况)这两个命令非常有用,请一定要记住



如果你所管理的服务器是一台提供web服务(80端口)的服务器,那么你就可以使用netstat -an |grep 80开查看当前连接web服务的有哪些IP



linux的系统服务管理

如果你对windows非常熟悉的话,相信你肯定配置过开机启动的服务,有些服务我们日常用不到则要把它停掉,一来可以节省资源,二来可以减少安全隐患linux上同样也有相关的工具来管理系统的服务
1. ntsysv
用来配置哪些服务开启或者关闭,有点想图形界面,不过是使用键盘来控制的如果没有这个命令请使用 yum install -y ntsysv 安装它



敲完这个命令后则显示出如上图中的画面在屏幕的最上面有’Red Hat’等字样,这是在告诉我们这个工具是由Red Hat公司开发的按键盘的上下方向键可以调节红色光标,按空格可以选择开启或者不开启,如果前面的中括号内显示有’*’ 则表示开启否则不开启通过这个工具也可以看到目前系统中所有的服务建议除’crond, iptables, network, sshd, syslog, irqbalance, sendmail, microcode_ctl’ 外其他服务全部停掉选择好后,按’tab’键选择ok然后回车需要重启机器才能生效
2. chkconfig
Linux系统所有的预设服务可以查看/etc/init.d/目录得到



其实这就是系统所有的预设服务了为什么这样讲,因为系统预设服务都是可以通过这样的命令实现 ‘service 服务名 start|stop|restart’ ,这里的服务名就是/etc/init.d/目录下的这些文件了除了可以使用’service crond start ‘启动crond外,还可以使用/etc/init.d/crond start 来启动



如上图,这两个命令出来的结果是一样的



再看看这个chkconfig命令,它不仅可以列出来所有的服务,还可以详细到每个级别这里的级别(0,1,2,3,4,5,6)就是inittab里面介绍的那几个启动级别了



这样还可以查看某一个服务的启动情况



--level 指定级别,后面是服务名,然后是off或者on--level后还可以跟多个级别



另外还可以省略级别,默认是针对2,3,4,5级别操作



另外这个chkconfig 还有一个功能就是可以把某个服务加入到系统服务,即可以使用service 服务名 start 这样的形式,并且可以在chkconfig --list 中查找到当然也能删除掉



这个功能常用在把自定义的启动脚本加入到系统服务当中关于系统服务就讲这些内容,其实还有很多内容笔者没有介绍,道理很简单,一来讲多了你不能消化二来讲多了你也用不上

抓包工具tcpdump

有时候,也许你会有这样的需求,想看一下某个网卡上都有哪些数据包,尤其是当你初步判定你的服务器上有流量攻击这时,使用抓包工具来抓一下数据包,就可以知道有哪些IP在攻击你了



如果你没有tcpdump 这个命令,需要用’yum install -y tcpdump ’命令去安装一下上图中第三列和第四列显示的信息为哪一个IP+port在连接哪一个IP+port,后面的信息是该数据包的相关信息,如果不懂也没有关系,毕竟你不是专门搞网络的,而这里需要你关注的只是第三列以及第四列。-i 选项后面跟设备名称,如果你想抓eth1网卡的包,后面则要跟eth1.至于-nn选项的作用是让第三列和第四列显示成IP+端口号的形式,如果不加-nn则显示的是主机名+服务名称

shell脚本中的循环

Shell脚本中也算是一门简易的编程语言了,当然循环是不能缺少的常用到的循环有for循环和while循环下面就分别介绍一下两种循环的结构



脚本中的seq 1 5 表示从15的一个序列你可以直接运行这个命令试下脚本执行结果为:



通过这个脚本就可以看到for循环的基本结构

for 变量名 in 循环的条件; do
command
done



循环的条件那一部分也可以写成这样的形式,中间用空格隔开即可你也可以试试,for i in `ls`; do echo $i; done for i in `cat test.txt` do echo $i; done



再来看看这个while循环,基本格式为:
while 条件; do
command
done
脚本的执行结果为:



另外你可以把循环条件忽略掉,笔者常常这样写监控脚本
while :; do
command
done


linux中的数据备份

数据备份,不用说太多吧,毫无疑问很重要笔者就曾经有过一次非常痛苦的经历,备份策略没有做好,结果磁盘坏掉数据丢失,简直是撕心裂肺的痛呀还好数据重要性不是特别高,即使是不高也是丢失了数据,这是作为系统管理员最不应该出现的事故所以,在你以后的系统维护工作中,一定要把数据备份当回事,认真对待linux上作为数据备份的工具很多,但笔者就只用一种那就是rsync 从字面上的意思你可以理解为remote sync (远程同步)这样可以让你理解的更深刻一些。Rsync不仅可以远程同步数据(类似于scp),当然还可以本地同步数据(类似于cp),但不同于cpscp的一点是,rsync不像cp/scp一样会覆盖以前的数据(如果数据已经存在),它会先判断已经存在的数据和新数据有什么不同,只有不同时才会把不同的部分覆盖掉如果你的linux上下面看例子吧(如果没有rsync命令请使用yum install -y rsync安装)



上面例子表示把当前目录下的123同步到/tmp/目录下,并且同样也命名为123。如果是远程拷贝的话就是这样的形式了 IP:path (如:10.0.2.34:/root/



当建立连接后,是需要输入密码的如果手动去执行这些操作还好,但是如果是写在脚本中怎么办?这就涉及到添加信任关系了,该部分内容稍后会详细介绍


ifconfig 查看网卡IP

ifconfig类似与windowsipconfig,不加任何选项和参数只打印当前网卡的IP相关信息(子网掩码网关等)



当然ifconfig后面可以跟设备名,只打印指定设备的IP信息



windows下设置IP非常简单,然而在命令窗口下如何设置?这就需要去修改配置文件/etc/sysconfig/network-scripts/ifcfg-eth0了,如果是eth1那么配置文件是/etc/sysconfig/network-scripts/ifcfg-eth1.



如果想修改IP的话,则只需要修改IPADDR , NETMASK以及GATEWAY即可如果你的linux是通过dhcp服务器自动获得的IP,那么配置文件肯定和上图中的不一样,BOOTPROTO那里会是’dhcp’,如果你要配置成静态IP的话,这里就需要写成’none’。关于如何设置IP以及子网掩码的这些知识属于网络相关的基础知识了,如果你对这方面比较陌生的话,建议你去看看网络相关的资料当修改完IP后需要重启网络服务新IP才能生效,重启命令为’ service network restart’



另外如果你有多个网卡的情况时,只想重启某一个网卡的话,还可以使用这个命令



ifdown 即停掉网卡,ifup即启动网卡有一点要提醒你的是,如果你远程登录你的服务器,当你使用ifdown eth0这个命令的时候,很有可能后面的命令ifup eth0不会被运行,这样导致你断网而无法连接服务器,所以请尽量使用service network restart 这个命令来重启网卡

shell脚本中的函数

如果你学过开发,肯定知道函数的作用如果你是刚刚接触到这个概念的话,也没有关系,其实很好理解的函数就是把一段代码整理到了一个小单元中,并给这个小单元起一个名字,当用到这段代码时直接调用这个小单元的名字即可有时候脚本中的某段代总是重复使用,如果写成函数,每次用到时直接用函数名代替即可,这样就节省了时间还节省了空间



fun.sh 中的sum() 为自定义的函数,在shell脚本中要用

function 函数名() {
command
}
这样的格式去定义函数
上个脚本执行过程如下:



有一点笔者要提醒你一下,在shell脚本中,函数一定要写在最前面,不能出现在中间或者最后,因为函数是要被调用的,如果还没有出现就被调用,肯定是会出错的

rsync的命令格式

rsync [OPTION]... SRC DEST
rsync [OPTION]... SRC [USER@]HOST:DEST
rsync [OPTION]... [USER@]HOST:SRC DEST
rsync [OPTION]... [USER@]HOST::SRC DEST
rsync [OPTION]... SRC [USER@]HOST::DEST
笔者在一开始举的两个例子,第一个例子即为第一种格式,第二个例子即为第二种格式,但不同的是,笔者并没有加user@host 如果不加默认指的是root 。第三种格式是从远程目录同步数据到本地第四种以及第五种格式使用了两个冒号,这种方式和前面的方式的不同在于验证方式不同,稍后详细介绍

给一个网卡设定多个IP

linux系统中,网卡是可以设定多重IP的,笔者曾经管理的一台服务器的eth1就设定了5IP,实在是够变态的



ifcfg-eth0复制成ifcfg-eth0:1 然后编辑ifcfg-eth0:1修改DEVICE以及IPADDR保存后重启网卡



再次查看eth0上就有两个IP这里你要注意一下,文件名(ifcft-eth0:1)写成什么都无所谓,但是文件内的DEVICE=eth0:1一定要按照这样的格式写,否则你启动不起来网卡

shell脚本练习题

1. 编写shell脚本,计算1-100的和;

2. 编写shell脚本,要求输入一个数字,然后计算出从1到输入数字的和,要求,如果输入的数字小于1,则重新输入,直到输入正确的数字为止;

3. 编写shell脚本,把/root/目录下的所有目录(只需要一级)拷贝到/tmp/目录下;

4. 编写shell脚本,批量建立用户user_00, user_01, … ,user_100并且所有用户同属于users组;

5. 编写shell脚本,截取文件test.log中包含关键词’abc’的行中的第一列(假设分隔符为”:”),然后把截取的数字排序(假设第一列为数字),然后打印出重复次数超过10次的列;

6. 编写shell脚本,判断输入的IP是否正确(IP的规则是,n1.n2.n3.n4,其中1<n1<255, 0<n2<255, 0<n3<255, 0<n4<255)。

以下为练习题答案:

1.#! /bin/bash

sum=0

for i in `seq 1 100`; do

sum=$[$i+$sum]

done

echo $sum
2.#! /bin/bash

n=0

while [ $n -lt "1" ]; do

read -p "lease input a number, it must greater than "1":" n

done



sum=0

for i in `seq 1 $n`; do

sum=$[$i+$sum]

done

echo $sum
3.#! /bin/bash

for f in `ls /root/`; do

if [ -d $f ] ; then

cp -r $f /tmp/

fi

done
4.#! /bin/bash

groupadd users

for i in `seq 0 9`; do

useradd -g users user_0$i

done



for j in `seq 10 100`; do

useradd -g users user_$j

done
5.#! /bin/bash

awk -F':' '$0~/abc/ {print $1}' test.log >/tmp/n.txt

sort -n n.txt |uniq -c |sort -n >/tmp/n2.txt

awk '$1>10 {print $2}' /tmp/n2.txt
6.#! /bin/bash

checkip() {

if echo $1 |egrep -q '^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$' ; then

a=`echo $1 | awk -F. '{print $1}'`

b=`echo $1 | awk -F. '{print $2}'`

c=`echo $1 | awk -F. '{print $3}'`

d=`echo $1 | awk -F. '{print $4}'`



for n in $a $b $c $d; do

if [ $n -ge 255 ] || [ $n -le 0 ]; then

echo "the number of the IP should less than 255 and greate than 0"

return 2

fi

done

else

echo "The IP you input is something wrong, the format is like 192.168.100.1"

return 1

fi

}



rs=1

while [ $rs -gt 0 ]; do

read -p "lease input the ip:" ip

checkip $ip

rs=`echo $?`

done

echo "The IP is right!"

rsync常用选项

-a
:归档模式,表示以递归方式传输文件,并保持所有属性,等同于-rlptgoD -a选项后面可以跟一个 --no-OPTION 这个表示关闭-rlptgoD中的某一个例如 -a --no-l 等同于-rptgoD
-r :对子目录以递归模式处理,主要是针对目录来说的,如果单独传一个文件不需要加-r,但是传输的是目录必须加-r选项
-v :打印一些信息出来,比如速率,文件数量等
-l :保留软链结
-L :向对待常规文件一样处理软链结,如果是SRC中有软连接文件,则加上该选项后将会把软连接指向的目标文件拷贝到DST
-p :保持文件权限
-o :保持文件属主信息
-g :保持文件属组信息
-D :保持设备文件信息
-t :保持文件时间信息
--delete :删除那些DSTSRC没有的文件
--exclude=PATTERN
:指定排除不需要传输的文件,等号后面跟文件名,可以是万用字符模式(如*.txt
-u :加上这个选项后将会把DST中比SRC还新的文件排除掉,不会覆盖
下面笔者将会针对这些选项做一些列小实验:
1
建立目录以及文件



笔者建立这些文件的目的就是为做试验做一些准备工作
2)使用-a选项



这里有一个问题,就是本来想把test1目录直接拷贝成test2目录,可结果rsync却新建了test2目录然后把test1放到test2当中为了避免这样的情况发生,可以这样做:



加一个斜杠就好了,所以笔者建议你在使用rsync备份目录时要养成加斜杠的习惯在上面讲了-a选项等同于- rlptgoD,而且-a还可以和--no-OPTION一并使用



笔者加上-v选项来获得更多的信息,上例中因为没有使用-r选项导致只能拷贝目录但不能拷贝目录下面的内容(英文翻译过来就是忽略了目录test1/.”,其中test1/.指的就是test1目录内部的所有文件),所以虽然创建了test2目录,但是test2目录为空下面再看看那个-l选项的作用



使用-v选项看来就是方便呀,上例告诉我们跳过了非普通文件1.sh,其实1.sh是一个软连接文件,如果不使用-l选项则不会理会软连接文件的



果真test2目录当中没有那个1.sh的影子当然加上-l选项则会把软连接文件给拷贝过去,但是软连接的目标文件却没有拷贝过去,有时候咱们指向拷贝软连接文件所指向的目标文件,那这时候该怎么办呢?
3)使用-L选项



一个-L就可以把SRC中软连接的目标文件给拷贝到DST
4
使用-u选项
首先查看一下test1/1 test2/1的访问时间(肯定是一样的),然后使用touch修改一下test2/1的访问时间(此时test2/1要比test1/1的访问时间晚了一些),如果不加-u选项的话,会把test2/1的访问时间变成和test1/1的访问时间一样这样讲也许你会迷糊,不妨看一看



看到了吧,本来test2/1的访问时间已经不同于test1/1的访问时间了,但是同步后访问时间又一致了



现在你明白-u选项的妙用了吧
5)使用--delete选项



如果不使用--delete选项当SRC有文件删除时,DST是不会删除的,只有加上--delete选项后才能删除掉还有一种情况就是如果在DST增加文件了,而SRC当中没有这些文件,同步时加上--delete选项后同样会删除新增的文件



6)使用--exclude 选项



另外还可以使用万用字符*匹配



最后简单总结一下,平时你使用rsync同步数据的时候,使用-a选项基本上就可以达到我们想要的效果了,只是有时候会有个别的需求,会用到-a --no-OPTION, -u, -L, --delete, --exclude这些选项,但是笔者要求你把上面这些全部掌握,毕竟这才几个而已,大部分选项笔者都没有介绍如果在以后的工作中遇到特殊需求了,就去查一下rsyncman文档吧


查看网卡连接状态



mii-tool这个命令用来查看网卡是否连接,如图显示link ok等字样说明连接正常,否则会显示no link字样,下图是笔者所管理的一台服务器,eth1网卡没有连接



如果你的机器是虚拟机,那么你使用该命令时应该显示成如下:



这是因为使用的是虚拟网卡,不支持这个工具查看不用多关注此,你记住这个mii-tool命令即可,它可是会经常用到的

w 查看当前系统的负载



相信所有的linux管理员最常用的命令就是这个’w’ 了,该命令显示的信息还是蛮丰富的第一行从左面开始显示的信息依次为:时间,系统运行时间,登录用户数,平均负载第二行开始以及下面所有的行,告诉我们的信息是,当前登录的都有哪些用户,以及他们是从哪里登录的等等其实,在这些信息当中,笔者认为我们最应该关注的应该是第一行中的’load average:’后面的三个数值

第一个数值表示1分钟内系统的平均负载值;第二个数值表示5分钟内系统的平均负载值;第三个数值表示15分钟系统的平均负载值这个值的意义是,单位时间段内CPU活动进程当然这个值越大就说明你的服务器压力越大一般情况下这个值只要不超过你服务器的cpu数量就没有关系,如果你的服务器cpu数量为8,那么这个值若小于8,就说明你的服务器没有压力,否则就要关注一下了到这里你肯定会问,如何查看服务器有几个cpu



就是用这个命令了。’/proc/cpuinfo’这个文件记录了cpu的详细信息目前市面上的服务器通常都是24cpu,在linux看来,它就是8cpu。查看这个文件时则会显示8段类似的信息,而最后一段信息中processor : 后面跟的是’7’。所以查看当前系统有几个cpu,你可以使用这个命令:’ grep -c 'processor' /proc/cpuinfo’ 。


rsync 应用实例

1)通过ssh的方式
最上面介绍的5种方式当中,第二第三(1个冒号)就属于通过ssh的方式,这种方式其实就是让用户去登录到远程机器,然后执行rsync的任务



这种方式就是前面介绍的第二种方式了,是通过ssh拷贝的数据,是要输入10.0.2.69那台机器root的密码的



这个则为第三种方式这两种方式如果写到脚本里,备份起来就有麻烦了,因为要输入密码,脚本本来就是自动的,不可能做到的但是不代表没有解决办法那就是通过密钥验证,密钥不设立密码就ok还记得在前面笔者曾经介绍过通过密钥登录远程主机吗,下面要讲的内容就是那些东西了
先提前说一下基本的主机信息: 10.0.2.68 (主机名Aming-1)和10.0.2.69(主机名Aming)需要从Aming-1上拷贝数据到Aming
A. 首先确认一下Aming-1上是否有这个文件 /root/.ssh/id_rsa.pub



如果没有安装以下的方法生成:



在这个过程中会有一些交互的过程,因为笔者的/root/.ssh/id_rsa已经存在,所以会问是否覆盖,笔者选择覆盖,然后会提示要输入这个密钥的密码,出于安全考虑应该定义个密码,但是我们的目的就是为了自动化同步数据,所以这里不输入任何密码,直接按回车,即密码为空最后则生成了私钥(/root/.ssh/id_rsa)和公钥文件(/root/.ssh/id_rsa.pub)
B. 把公钥文件的内容拷贝到目标机器上



复制主机Aming-1/root/.ssh/id_rsa.pub文件内容,并粘贴到主机Aming/root/.ssh/authorized_keys



在这一步也许你会遇到/root/.ssh目录不存在的问题,可以手动创建,并修改目录权限为700也可以执行ssh-keygen命令生成这个目录保存/root/.ssh/authorized_keys文件后,再到主机Aming-1上执行



你会发现,现在不用输入密码也可以登录主机Aming下面再从主机Aming-1上执行一下rsync命令试试吧



2)通过后台服务的方式

这种方式可以理解成这样,在远程主机上建立一个rsync的服务器,在服务器上配置好rsync的各种应用,然后本机作为rsync的一个客户端去连接远程的rsync服务器下面笔者就介绍一下,如何去配置一台rsync服务器
A. 建立并配置rsync的配置文件 /etc/rsyncd.conf



其中配置文件分为两部分全部配置部分和模块配置部分,全局部分就是几个参数而已,就像笔者的rsyncd.confport, log file, pid file, address这些都属于全局配置,而[test] 以下部分就是模块配置部分了一个配置文件中可以有多个模块,模块名自定义,格式就像笔者的rsyncd.conf中的这样其实模块中的一些参数例如use chroot, max connections, udi, gid, auth users, secrets file以及hosts allow都可以配置成全局的参数当然笔者给出的参数并不是所有的,你可以通过man rsyncd.conf 获得更多信息
下面就简单解释一下这些参数的意义:
port :指定在哪个端口启动rsyncd服务,默认是873
log file
:指定日志文件
pid file
:指定pid文件,这个文件的作用涉及到服务的启动以及停止等进程管理操作
address
:指定启动rsyncd服务的IP,假如你的机器有多个IP,就可以指定其中一个启动rsyncd服务,默认是在全部IP上启动
[test] :指定模块名,自定义
path :指定数据存放的路径
use chroot
true|false 默认是true,意思是在传输文件以前首先chrootpath参数所指定的目录下这样做的原因是实现额外的安全防护,但是缺点是需要以roots权限,并且不能备份指向外部的符号连接所指向的目录文件默认情况下chroot值为true,如果你的数据当中有软连接文件的话建议设置成false。
max connections
:指定最大的连接数,默认是0即没有限制
read only
ture|false 如果为true则不能上传到该模块指定的路径下
list :指定当用户查询该服务器上的可用模块时,该模块是否被列出,设定为true则列出,false则隐藏
uid/gid :指定传输文件时,以哪个用户/组的身份传输
auth users
:指定传输时要使用的用户名
secrets file
:指定密码文件,该参数连同上面的参数如果不指定则不使用密码验证
hosts allow :指定被允许连接该模块的主机,可以是IP或者网段,如果是多个,之间用空格隔开
B. 编辑secrets file,保存后要赋予600权限



C. 启动rsyncd服务



启动后查看日志,看看是否有错误信息,然后再看下端口是否启动



如果想开机启动,请把”rsync –daemon –confg=/etc/rsyncd.conf” 写入到/etc/rc.d/rc.local文件
D. 到另一台机器上测试



记得那个use chroot参数吗,如果设置为true,则/root/test4/1.sh不会被拷贝过来



修改rsyncd.conf文件,把use chroot改成true,不用重启服务即可生效



从上例中的详细信息中也可以看到,不能拷贝软连接的所以请记住,如果涉及到软连接,请设置use chroot=false 。另外这种方式也是可以不用手动输入密码的,两种实现方式
第一种:指定密码文件



先编辑一个密码文件,并修改600权限



在同步时,指定密码文件即可(--password-file=/etc/rsyncd.passwd)
第二种:在rsync服务器端不指定用户



把相关的参数都用’#’注释掉然后再到客户端上测试



注意,这里不用再加test@这个用户了,默认是以root的身份拷贝的,现在已经不需要输入密码了

更改主机名

当装完系统后,默认主机名为localhost,使用hostname就可以知道你的linux的主机名是什么



同样使用hostname可以更改你的主机名



下次登录时就会把命令提示符中的’localhost’更改成’Aming’。不过这样修改只是保存在内存中,下次重启还会变成未改之前的主机名,所以需要你还要去更改相关的配置文件’/etc/sysconfig/network’。



HOSTNAME=localhost.localdomain 修改成你想要的主机名,这样再重启就会读取这个配置文件中的HOSTNAME.