1.echo
语法:echo [-ne][字符串]补充说明:
1、echo会将输入的字符串送往标准输出。
2、输出的字符串间以空白字符隔开,并在最后加上换行号。OPTIONS:
-n 不要在最后自动换行
-e 若字符串中出现以下字符,则特别加以处理,而不会将它当成一般文字输出:转义字符
\a 发出警告声;
\b 删除前一个字符;
\t 插入tab;
\n 换行且光标移至行首;\c 最后不加上换行符号;
\f 换行但光标仍旧停留在原来的位置;
\r 光标移至行首,但不换行;
\v 与\f相同;
\ 插入\字符;
\0nnn 打印nnn(八进制)所代表的ASCII字符; 备注:数字0 不要理解成字母o
\xNN 打印NN(十六进制)所代表的ASCII字符;-–help 显示帮助
-–version显示版本信息
2.shell 定义变量+使用变量
#1.定义变量
myname="tang"
var=123#2.使用变量 前+$ 后面加不加{} 都可以
echo $myname
echo ${var}#3.删除变量
unset myname#4.变量类型 局部+环境+shell#5.拼接字符 单引号+双引号
myname="tang"
greeting_1="start,"$nyname",end!"
greeting_2="start,$myname,end!"greeting_3='start,'$nyname',end!'
greeting_4='start,$myname,end!'echo greeting_1 greeting_2 greeting_3 greeting_4#6.获取字符长度
string="abcd"
echo ${#string} ${#string[0]}#7.提取子字符串string=“abcded”
echo ${string:1:4}#8.查找子字符串 c 反引号
string="abcded"
echo `expr index "$string" ic`
3.date
#date [参数] [+格式] 1.命令参数:
必要参数:
%H 小时(以00-23来表示)。
%I 小时(以00-12来表示)。
%K 小时(以0-23来表示)。
%l 小时(以0-12来表示)。
%M 分钟(以00-59来表示)。
%P am或pm。
%s 总秒数(起算时间为1970-01-01 00:00:00 UTC)。UTC(coordinated Universal Time协调时间,又称世界统一时间)
%S 秒(以本地惯用法来表示)
%T 时间(含时分秒,小时以24小时制来表示)。
%X 时间(以本地的惯用法来表示)
%Z 市区(CST China Standard Time,中国标准时间)
%a 星期英文名的缩写。
%A 星期英文名的完整名称。
%b 月份英文名的缩写。
%B 月份英文名的完整名称。
%c 日期与时间。只输入date指令也会显示同样的结果。
%r 时间(含时分秒,小时以12小时AM/PM来表示)。
%d 日期(以0-31来表示)。
%D 日期(含年月日)。
%x 日期(以本地的惯用法来表示)
%j 该年中的第几天。
%m 月份(以0-12来表示)。
%U 该年中的周数。
%w 该周的天数,0代表周日,1代表周一,依次类推。
%y 年份(以00-99来表示)。
%Y 年份(以四位数来表示)。
%n 在显示时,插入新的一行。
%t 在显示时,插入tab。
MM 月份(必要)
DD 日期(必要)
hh 小时(必要)
mm 分钟(必要)
ss 秒(选择性)2.选择参数:-d<字符串> 显示字符串所指的日期与时间。字符串前后必须加上双引号。-s<字符串> 根据字符串来设置日期与时间。字符串前后必须加上双引号。-u 显示GMT(Greenwich Mean Time,格林威治时间)。–help 在线帮助。–version 显示版本信息。3.设定date -s //设置当前时间,只有root权限才能设置,其他只能查看。date -s 20111213 //设置成20111213,这样会把具体时间设置成空00:00:00。date -s 01:01:01 //设置具体时间,不会对日期做更改。date -s “01:01:01 2011-12-13” //这样可以设置全部时间。date -s “2011-12-13 01:01:01” //这样可以设置全部时间。date -s “20111213 01:01:01” //这样可以设置全部时间date -s “01:01:01 20111213” //这样可以设置全部时间4.加减date +%Y%m%d //显示前天年月日date +%Y%m%d --date="-1 day" //显示前一天的日期date +%Y%m%d --date="+1 day" //显示后一天的日期date +%Y%m%d --date="+/-1 month" //显示下/上一个月的日期date +%Y%m%d --date="+/-1 year" //显示下/上一年的日期
#1.打印 今天日期[keysystem@localhost ~]$ date -d 'now' #输出:Fri Feb 2 09:29:28 CST 2018[keysystem@localhost ~]$ date +%Y%m%d #输出: 20180202[keysystem@localhost ~]$ date +%Y%m%d%H%M%S#输出:20180202101334[keysystem@localhost ~]$ ORIGINAL="Jul 1 21:29 "[keysystem@localhost ~]$ date -d "$ORIGINAL" "+%G-%m-%d %H:%M:%S" #2020-07-01 21:29:00[keysystem@localhost ~]$ date +%b/%d/%G -d "2020-01-01"Jan/01/2020#2. 获取年月日变量date -d today +%Y%m%d%H%M # 获取今天的年月日时分 date -d next-day +%Y%m%d # 获取明天的日期date -d last-day +%Y%m%d # 获取昨天的日期date -d last-month +%Y%m # 获取上个月的年和月date -d next-month +%Y%m # 获取下个月的年和月date -d next-year +%Y # 获取明年的年份date +%F # “2006-03-08” date +%T # “10:06:16”date +%Y # 得到年 2006#3. 获取时间戳#4. 算间隔天数#4.1 两日期相减expr '(' $(date -d "2020-01-31" +%s) - $(date -d "2020-01-01" +%s ) ')' / 86400 #30
#4.2 增加36小时a=`date +%Y-%m-%d`b=`date +%Y-%m-%d -d "$a +36 hours"`echo $a#2020-10-23echo $b#2020-10-24#5.获取间隔天数后的值[keysystem@localhost ~]$ date -d 'now' #显示当前时间Fri Feb 2 09:29:28 CST 2018[keysystem@localhost ~]$ [keysystem@localhost ~]$ date -d '2 days ago' #显示2天前的时间Wed Jan 31 09:29:40 CST 2018[keysystem@localhost ~]$ date -d '3 month 1 day' #显示3月零1天以后的时间 Thu May 3 09:30:16 CST 2018[keysystem@localhost ~]$ date -d '25 Dec' +%j #显示12月25日在当年的哪一天359[keysystem@localhost ~]$ date -d '30 second ago' #显示30秒前的时间Fri Feb 2 09:41:03 CST 2018[keysystem@localhost ~]$ date -d "+3 day"Mon Feb 5 09:45:52 CST 2018[keysystem@localhost ~]$ date -d "-3 day" Tue Jan 30 09:46:04 CST 2018[keysystem@localhost ~]$ date -d "-3 month"Thu Nov 2 09:46:16 CST 2017[keysystem@localhost ~]$ date -d "+3 month" Wed May 2 09:46:24 CST 2018[keysystem@localhost ~]$ date -d "+3 year" Tue Feb 2 09:46:35 CST 2021[keysystem@localhost ~]$ date -d "-3 year" Mon Feb 2 09:46:40 CST 2015[keysystem@localhost ~]$ date -d "-3 hour" Fri Feb 2 06:46:59 CST 2018[keysystem@localhost ~]$ date -d "+3 hour" Fri Feb 2 12:47:02 CST 2018[keysystem@localhost ~]$ date -d "+3 minute"Fri Feb 2 09:50:09 CST 2018[keysystem@localhost ~]$ date -d "-3 minute" Fri Feb 2 09:44:12 CST 2018[keysystem@localhost ~]$ date -d "-3 second"Fri Feb 2 09:47:21 CST 2018[keysystem@localhost ~]$ date -d "+3 second" Fri Feb 2 09:47:31 CST 2018#6.#显示本月的第一天[keysystem@localhost ~]$ date -d `date +%y%m01`Thu Feb 1 00:00:00 CST 2018[keysystem@localhost ~]$ date +%y%m01180201[keysystem@localhost ~]$ date +%Y%m0120180201#上个月最后一天[keysystem@localhost ~]$ date -d `date +%y%m01`"-1 day"Wed Jan 31 00:00:00 CST 2018#4个月前的最后一天[keysystem@localhost ~]$ date -d `date -d "-3 month" +%y%m01`"-1 day"Tue Oct 31 00:00:00 CST 2017#11个月后的第一天[keysystem@localhost ~]$ date -d `date -d "+12 month" +%y%m01`"-1 day"Thu Jan 31 00:00:00 CST 2019#11个月后的最后一天[keysystem@localhost ~]$ date -d `date -d "+12 month" +%y%m01`"-1 day" +%Y%m%d20190131
4.awk
awk 比较倾向于将一行分成多个字段然后再进行处理。
4.1 语法
awk '条件1 {动作 1} 条件 2 {动作 2} …' 文件名
# awk 检测到完整的''才结束
#1.输出第2列和第6列的内容awk '{printf $2 "\t" $6 "\n"}' student.txt#2.begin
#这里定义了两个动作
#第一个动作使用BEGIN条件,所以会在读入文件数据前打印"这是一张成绩单"(只会执行一次)
#第二个动作会打印文件的第二个字段和第六个字段awk 'BEGIN{printf "This is a transcript\n"}{printf $2 "\t" $6 "\n"}' student.txt#3.end
#END 后的动作只在程序结束时执行一次
awk 'END{printf "The End \n"}{printf $2 "\t" $6 "\n"}' student.txt#4.关系运算#使用cat输出文件内容,用grep取反包含"Name"的行#判断第6个字段(平均成绩)大于等于87分的行,如果判断式成立,则打印第2列(学员名)
cat student.txt | grep -v Name |awk'$6 >= 87 {printf $2'\n"}'
4.2 awk 的分隔符
awk的默认分隔符是空格和制表符,上面的例子中,若希望把逗号去掉,则可以使用 -F 参数来指定分隔符,命令如下:
awk -F ':|,' '{print $2, $4, $6}' log
这里指定冒号(:)和逗号(,)同时作为分隔符。
6.iptables
6.1防火墙
位于Linux内核中的包括过滤功能体系。
主要是网络层,针对IP数据包,体现在对包内的IP地址、端口等信息的处理上。
默认包括4个规则表
- raw表:确定是否对该数据包进行状态跟踪
- mangle表:为数据包设置标记
- nat表:修改数据包中的源、目标lP地址或端口
- filter表:确定是否放行该数据包(过滤)
规则链
规则的作用:对数据包进行过滤或处理
链的作用:容纳各种防火墙规则
链的分类依据:处理数据包的不同时机
默认包括5种规则链
- INPUT:处理入站数据包
- OUTPUT:处理出站数据包
- FORWARD:处理转发数据包
- POSTROUTING链:在进行路由选择后处理数据包
- PREROUTING链:在进行路由选择前处理数据包
规则表之间的顺序
raw→mangle→nat→filter
规则链之间的顺序
入站:PREROUTING→INPUT
出站:OUTPUT→POSTROUTING
转发:PREROUTING→FORWARD→POSTROUTING
规则链内的匹配顺序
按顺序依次检查,匹配即停止(LOG策略例外)
若找不到相匹配的规则,则按该链的默认策略处理
6.2编写防火墙规则
6.2.1 安装
CentOS7默认使用firewalld防火墙,若想使用iptables防火墙,必须先关闭firewalld防火墙
关闭firewalld防火墙
1 | [root@localhost ~]# systemctl stop firewalld.service |
安装iptables防火墙
1 | [root@localhost ~]# yum -y install iptables iptables-services #安装工具 安装服务 |
设置iptables开机启动
1 | [root@localhost ~]# systemctl start iptables.service |
6.2.2基本语法
语法构成
iptables [ -t 表名 ] 选项 [ 链名 ] [ 条件 ] [ -j 控制类型 ]
例:设置其他主机无法ping通本机,阻止ping测试
iptables -t filter -I INPUT -p icmp -j REJECT
选项:
-A:在指定链的末尾添加(–append)一条新的规则。
-D:删除(–delete)指定链中的某一条规则,可指定规则序号或具体内容。
-l :在指定链中插入(–insert)一条新的规则,未指定序号时默认作为第一条规则。
-R:修改、替换(–replace)指定链中的某一条规则,可指定规则序号或具体内容。
-L:列出(–list)指定链中所有的规则,若未指定链名,则列出表中的所有链.
-F:清空(–flush)指定链中的所有规则,若未指定链名,则清空表中的所有链。
-P:设置指定链的默认策略(–policy) .
-n:使用数字形式(–numeric)显示输出结果,如显示IP地址而不是主机名。
-v:查看规则列表时显示详细(–verbose)的信息。
-h:查看命令帮助信息(–help) .
–line-numbers:查看规则列表时,同时显示规则在链中的顺序号。
数据包的常见控制类型
ACCEPT:允许通过
DROP:直接丢弃,不给出任何回应
REJECT:拒绝通过,必要时会给出提示
LOG:记录日志信息,然后传给下一条规则继续匹配
添加、替换、查看、删除规则,设置默认策略
1、添加新的规则
-A:在链的末尾追加一条规则
-I:在链的开头(或指定序号)插入一条规则
1 | [root@localhost ~]# iptables -t filter -A INPUT -j REJECT #在默认表插入拒绝通过规则,Xshell断开 |
2、替换规则
-R:修改、替换(–replace)指定链中的某一条规则,可指定规则序号或具体内容。
1 | [root@localhost ~]# iptables --line-numbers -L INPUT #查看默认表以数字序列号显示所有规则 |
3、查看规则列表
-L :列出所有的规则条目
-n:以数字形式显示地址、端口等信息
-v:以更详细的方式显示规则信息
–line-number:查看规则时,显示规则的序号
4、删除、清空规则
-D:删除链内指定序号(或内容)的一条规则
-F:清空所有的规则
5、设置默认策略
-P:为指定的链设置默认规则
规则的匹配条件
1.常见的通用匹配条件
协议匹配:-p 协议名
地址匹配:-s源地址、-d目的地址
接口匹配:-i入站匹配、-o出站网卡
2.常见的隐含匹配条件
端口匹配:
–sport源端口、–dport目的端口
连续的端口号用":“分隔
不连续的端口用”:"分隔
-m multiport --sports 源端口列表 # “,” 分隔开
-m multiport --dports 目的端口列表
1 | [root@localhost ~]# iptables -A FORWARD -s 192.168.4.0/24 -p udp --dport 53 -j ACCEPT #接收数据 |
ICMP类型匹配:–icmp-type ICMP类型
ICMP类型的代码表示:echo-request 代码为8;echo-reply 代码为0;destination-unreacha 代码为3
1 | [root@localhost ~]# iptables -A INPUT -p icmp --icmp-type 8 -j DROP |
3.常用的显示匹配条件
IP范围匹配
编写规则时使用 -m iprange --src-range IP范围 #源地址
-m iprange --dst-range IP范围 #目标地址
的形式,用来检查数据包的源地址,目标地址。
IP地址范围的表示方式:起始地址-结束地址
示例:
1 | [root@localhost ~#iptables -A FORWARD -p tcp -m iprange --src-range 192.168.4.100-192.168.4.2200 -j ACCEPT |
MAC地址匹配
编写规则时使用 -m mac --mac-source MAC地址的形式。用来检查数据包的MAC地址
示例:
1 | [root@localhost ~]# iptables -A INPUT -m mac --mac-source 00:0c:29:c0:55:3f -j DROP |
状态匹配
编写规则时使用 -m state --state 连接状态的形式,基于Iptables的状态跟踪机制来检查数据包的连接状态。
常见连接状态:NEW 与任何连接无关的
ESTABLISHED 响应请求或者已建立连接的
RELATED 与已有连接有相关性的,如FTP数据连接
示例:
1 | [root@localhost ~]# iptables -A FORWARD -m state --state NEW -p tcp ! --syn -j DROP |
7.shell 数组的定义和使用
7.1定义
#1.方法1
array_name=(值1 值2 值3 ... 值n)#2.
array_name[0]=值1
array_name[1]=值2
array_name[2]=值3
...
array_name[n-1]=值n
7.2 读取
#指定
${array_name[index]}
#所有
${array_name[*]}
${array_name[@]}
7.3 长度
${#array_name[*]}
${#array_name[@]}
#!/bin/bash# 定义数组
array_test=(A "B" C)# 输出数组的所有元素
echo "【方式1】数组的元素为:${array_test[*]}"
echo "【方式2】数组的元素为:${array_test[@]}"echo -e "【方式3】输出数组的所有元素:\n元素1:${array_test[0]}, 元素2:${array_test[1]}, 元素3:${array_test[2]}"echo "【方式4】列出数组的所有元素:"
# 循环输出数组所有元素
for((i=0;i<=${#array_test[*]-1};i=i+1))doecho "${array_test[i]}"done