系统服务及shell编程

防火墙(ufw)

1.说明:简单版本的防火墙,底层依赖于iptables。

2.安装:sudo apt-get install ufw

3.查看状态:sudo ufw status

4.开启/关闭:sudo ufw enable|disable

5.默认允许/禁止:sudo ufw default allow|deny

6.允许/禁止:sudo ufw allow|deny|服务|port,如:sudo ufw deny ssh

7.移除规则:sudo ufw delete deny ssh

管道及xargs

  1. |:管道:将前面命令的输出作为后面命令的输入参数,如:ls /bin |grep ‘^m’
  2. xargs:有些命令无法接收管道参数,可以通过xargs解决,如:find -name 1.sh | xargs rm -rf

重定向ba

1.三个数据流:标准输入(stdin)、标准输出(stdout)、标准错误(stderr)

2.在linux,启动任意的进程,系统会自动创建上面三个数据流,其实就是三个文件

3.三个文件的描述符分别是:0、1、2,都指向了终端

4.重定向就是改变原来的表现位置。

5.示例演示:

输出重定向:
	ls > 1.txt  		#将ls的输出结果保存到1.txt文件中,会新建文件		1.txt,若文件存在会清空.
	ls >> 1.txt			#将ls的输出结果保存到1.txt文件中,文件不存在也		会创建
错误重定向:
	ls /xxx 2> 2.txt 	#将错误信息保存到2.txt
同时重定向输出和错误:
	ls /xxx /home &>3.txt   #同时将输出和错误保存到3.txt文件中

shell简介

1.什么是shell编程?

将终端下编写的命令等保存到文件中,就称为shell编程.

2.shell类型?

(1)ash、bash、csh、ksh

(2)查看系统shell解析器,echo $SHELL

(3)当前系统可以shell解析器:/etc/shells文件

3.shell脚本的执行

指定shell解析器执行指定脚本:bash hello.sh,不需要添加可执行权限

将shell脚本作为可执行文件执行,必须添加可执行权限

	添加可执行权限:sudo chmod +x world.sh

	在脚本开头指定shell解析器:#! /bin/bash,其他位置的#表示注释

	执行脚本:

		在当前目录: ./world

		不在当前目录:/home/zzh/shell/world.sh

shell变量

1.变量定义:name=‘dahua’,’’=’\'两边不能有空格

2.打印变量:echo $name 或 echo ${name}

3.销毁变量:unset name,之后不能再使用

4.声明常量:readonly name=‘dahua’

5.使用说明:’=\'两边不能有空格,只读变量不能修改

变量分类

1.本地变量:只适用于当前shell的变量

2.环境变量:适用于整个系统,通常都是纯大写的

查看系统环境 变量:env

查看指定环境变量:echo $PATH

若想在任意位置都可执行指定程序,可以将程序的路径添加到环境变量PATH.

修改:

	单次:export PATH=$PATH:/home/zzh/shell

	永久:

		系统:/etc/profile

		用户:~/.profile 、~/.bashrc、~/.bash_profile

		把导出的语句添加到文件末尾即可

		使文件生效:重启终端或 source ~/.bashrc

3.位置变量

$0:执行脚本的名字

$1-$9:传递给脚本的参数

4.特殊变量

$#:传递给脚本的参数个数

$*:传递给脚本的所有参数

$?:上次命令的执行情况,0表示正确,其他表示错误.

字符串类型

单引号:其中的字符都会原样输出,不会被解析

双引号:可以放除了$、`、\\、\"以外任意字符,其中的变量等会被解析

反引号:将其中的内容作为命令执行,如:

echo `date`

\'\\\':转义特定的字符,如:$、*、\\、?、|、`、^、&

字符串长度:${#name}

字符串提取:$(name:2:3),从变量name中下标为2的地方提取三个字符

数组类型

1.定义数组:a=(1 2 3)

2.成员访问:echo ${a[2]}

3.个数统计:echo ${#a[@]}

4.所有元素:echo ${a[*]}

seq

1.说明:生成指定范围的连续整数

2.示例:seq 10,生成1~10的连续整数,seq 2 10,生成2~10的连续整数

expr

1.说明:运算一个表达式

2.示例:

expr 2 + 3 					结果为s
echo `expr 3 + 5 `  			结果会打印8
expr 3 \\* 5					结果为15,*需要转义

各种运算

1.test命令:成功为真,失败为假.

#! /bin/bash

if test 1 -lt 2; then
	echo \'ok\'
fi

if [ 1 -lt 2 ]; then
	echo \'okok\'
fi

2.数值比较运算

-lt:小于

-le:小于等于

-gt:大于

-ge:大于等于

-eq:等于

-ne:不等于

3.字符串测试

=:相等

!=:不相等

-z:字符串的长度是否为0

-n:字符串的长度是否不为0

4.文件判断

-f:普通文件

-d:目录文件

-c:字符设备文件

-b:块设备文件

-w:是否可写

-x:是否可执行

-s:文件存在,并且至少有一个字符

5.逻辑运算

-a:逻辑与(and),也可以使用&&来代替

-o:逻辑或(or),也可以使用||来代替

!:逻辑非

示例:

#! /bin/bash

if [ 1 -lt 3 -a 2 -lt 3 ]; then
	echo \'ok\'
fi

if [ 1 -lt 3 ] && [ 2 -lt 3 ]; then
	echo \'ok\'
fi

if [ ! 1 -gt 3 ]; then
	echo \'xxx\'
fi

分支结构

1.if-elif-else

#! /bin/bash

if [ 8 -lt 3 ]; then
	echo \'8 < 3\'
elif [ 8 -lt 9 ]; then
	echo \'8 < 9\'
else
	echo \'xxx\'
fi

2.case:

#! /bin/bash

read -p \'please input any charactor:\' ch

case $ch in

	[a-z])
		echo \'alpha\'
	;;
	[0-9])
		echo \'numberic\'
	;;
	*)
		echo \'others\'
	;;
esac

循环结构

1.for-in 及 for

#! /bin/bash

a=(1 2 3 4 5)
# for x in a b c
# for x in /etc/*
#for x in `seq 1 10`
for x in ${a[*]}
do
	echo $x
done

for ((i=0;i<${#a[@]};i++))
do

	echo ${a[$i]}
done

2.while

#! /bin/bash

i=1
sum=0

while [ $i -le 100 ]
do
	#((sum+=$i))
	#((i++))
	#let sum+=$i
	#let i++
	sum=$[$sum+$i]
	i=$[$i+1]	

done

echo $sum

3.until: 条件成立,循环停止

#! /bin/bash

i=1
until [ $i -gt 10 ]

do

	echo $i
	((i++))
done

4.break 、continue自行学习

函数使用

demo(){
	echo \'for func\'
}

demo

$?表示函数的返回值

echo $?

args(){

	echo $1
	echo $2
	echo $*
	echo $#
	return 250
}
args abc def	
	echo $?
收藏 打印