案例: jumpserver跳板机
ssh连接框架:
[root@test day5]# cat jumpserver.sh
#!/bin/bash
WEB01=172.16.1.7
WEB02=172.16.1.8
NFS=172.16.1.31
BACKUP=172.16.1.41
DB01=172.16.1.51
LB01=172.16.1.5
LB06=172.16.1.6
echo -e "\t\t\t\t\t\t 1.WEB01"
echo -e "\t\t\t\t\t\t 2.WEB02"
echo -e "\t\t\t\t\t\t 3.NFS"
echo -e "\t\t\t\t\t\t 4.BACKUP"
echo -e "\t\t\t\t\t\t 5.DB01"
read -p "请输入要登录主机的编号: " num
case $num in
1|web01)
ssh $WEB01
;;
2)
ssh $WEB02
;;
3)
ssh $NFS
;;
*)
echo "Usage: $0 [1|2|3|4]"
esac
---------------------------------------------------
运维代码:
[root@test day5]# cat jumpserver.sh
#!/bin/bash
WEB01=172.16.1.7
WEB02=172.16.1.8
NFS=172.16.1.31
BACKUP=172.16.1.41
DB01=172.16.1.51
LB01=172.16.1.5
LB06=172.16.1.6
kf(){
echo -e "\t\t\t\t\t\t 1.WEB01=172.16.1.7"
}
yw(){
echo -e "\t\t\t\t\t\t 1.WEB01=172.16.1.7"
echo -e "\t\t\t\t\t\t 2.WEB02=172.16.1.8"
echo -e "\t\t\t\t\t\t 3.NFS=172.16.1.31"
echo -e "\t\t\t\t\t\t 4.BACKUP=172.16.1.41"
echo -e "\t\t\t\t\t\t 5.DB01=172.16.1.51"
echo -e "\t\t\t\t\t\t h.显示菜单"
}
echo -e "\t\t\t\t\t\t 1.运维"
echo -e "\t\t\t\t\t\t 2.开发"
read -p "请选择你的身份: " num
if [ $num -eq 1 ];then
yw
while true
do
read -p "请输入要登录主机的编号[h显示菜单]: " num
case $num in
1|web01)
ssh $WEB01
;;
2)
ssh $WEB02
;;
3)
ssh $NFS
;;
h)
clear
yw
;;
*)
echo "Usage: $0 [1|2|3|4]"
esac
done
fi
--------------------------------------------------------------
加入开发的代码:
[root@test day5]# cat jumpserver.sh
#!/bin/bash
WEB01=172.16.1.7
WEB02=172.16.1.8
NFS=172.16.1.31
BACKUP=172.16.1.41
DB01=172.16.1.51
LB01=172.16.1.5
LB06=172.16.1.6
kf(){
echo -e "\t\t\t\t\t\t 1.WEB01=172.16.1.7"
}
yw(){
echo -e "\t\t\t\t\t\t 1.WEB01=172.16.1.7"
echo -e "\t\t\t\t\t\t 2.WEB02=172.16.1.8"
echo -e "\t\t\t\t\t\t 3.NFS=172.16.1.31"
echo -e "\t\t\t\t\t\t 4.BACKUP=172.16.1.41"
echo -e "\t\t\t\t\t\t 5.DB01=172.16.1.51"
echo -e "\t\t\t\t\t\t h.显示菜单"
}
echo -e "\t\t\t\t\t\t 1.运维"
echo -e "\t\t\t\t\t\t 2.开发"
read -p "请选择你的身份: " num
if [ $num -eq 1 ];then
yw
while true
do
read -p "请输入要登录主机的编号[h显示菜单]: " num
case $num in
1|web01)
ssh $WEB01
;;
2)
ssh $WEB02
;;
3)
ssh $NFS
;;
h)
clear
yw
;;
*)
echo "Usage: $0 [1|2|3|4]"
esac
done
elif [ $num -eq 2 ];then
kf
while true
do
read -p "请输入要登录主机的编号[h显示菜单]: " num
case $num in
1|web01)
ssh $WEB01
;;
2)
ssh $WEB02
;;
3)
ssh $NFS
;;
h)
clear
kf
;;
*)
echo "Usage: $0 [1|2|3|4]"
esac
done
fi
----------------------------------------------------
完善脚本:
[root@test day5]# cat jumpserver.sh
#!/bin/bash
WEB01=172.16.1.7
WEB02=172.16.1.8
NFS=172.16.1.31
BACKUP=172.16.1.41
DB01=172.16.1.51
LB01=172.16.1.5
LB06=172.16.1.6
kf(){
echo -e "\t\t\t\t\t\t 1.WEB01=172.16.1.7"
}
yw(){
echo -e "\t\t\t\t\t\t 1.WEB01=172.16.1.7"
echo -e "\t\t\t\t\t\t 2.WEB02=172.16.1.8"
echo -e "\t\t\t\t\t\t 3.NFS=172.16.1.31"
echo -e "\t\t\t\t\t\t 4.BACKUP=172.16.1.41"
echo -e "\t\t\t\t\t\t 5.DB01=172.16.1.51"
echo -e "\t\t\t\t\t\t h.显示菜单"
echo -e "\t\t\t\t\t\t 6|q.返回主菜单"
}
menu(){
echo -e "\t\t\t\t\t\t 1.运维"
echo -e "\t\t\t\t\t\t 2.开发"
echo -e "\t\t\t\t\t\t 3|g.娱乐一下"
}
trap "echo 别乱按小心爆炸" INT HUP TSTP
while true
do
menu
read -p "请选择你的身份: " num
if [ $num -eq 1 ];then
while true
do
read -s -p "输入运维的密码: " pass
if [ $pass = oldboy123 ];then
echo "欢迎运维回家"
yw
while true
do
read -p "请输入要登录主机的编号[h显示菜单]: " num
case $num in
1|web01)
ssh $WEB01
;;
2)
ssh $WEB02
;;
3)
ssh $NFS
;;
h)
clear
yw
;;
6|q)
break 2
;;
woshiyunwei)
exit
;;
*)
continue
esac
done
else
let i++
if [ $i -eq 3 ];then
echo "想想在输入"
sleep 2
continue
fi
echo "密码输入错误重新输入"
continue
fi
done
elif [ $num -eq 2 ];then
kf
while true
do
read -p "请输入要登录主机的编号[h显示菜单]: " num
case $num in
1|web01)
ssh $WEB01
;;
2)
ssh $WEB02
;;
3)
ssh $NFS
;;
h)
clear
kf
;;
woshiyunwei)
exit
;;
*)
echo "Usage: $0 [1|2|3|4]"
esac
done
elif [ $num -eq 3 ];then
sh game.sh
fi
done
------------------------------------------------------------------------------------------
expect免交互发送秘钥
[root@test day5]# cat test.ex
#!/usr/bin/expect
set timeout 10
set user root
set ip 172.16.1.31
set password 1
spawn ssh-copy-id $user@$ip
expect {
"yes/no" { send "yes\n";exp_continue }
"password" { send "$password\n" }
}
interact
二.数组
普通数组 只能以数字作为索引
关联数组 可以使用字符串作为索引
数组类似变量 不同的是变量只能有一个值 数组中可以放多个值
变量:
框子1=苹果
框子2=香蕉
框子3=茄子
name=oldboy
ip=172.16.1.31
数组:
框子1[小盒子1]=苹果
框子1[小盒子2]=香蕉
框子1[小盒子3]=茄子
数组语法:
数组名称[索引的名称|下标]=值
框子[盒子1]=苹果
普通数组:
第一种定义方式: 通过索引方式定义
[root@test day5]# array[0]=shell
[root@test day5]# array[1]=mysql
[root@test day5]# array[2]=docker
[root@test day5]# echo $array
shell
查看数组 按照索引的方式查看
[root@test day5]# echo ${array[1]}
mysql
[root@test day5]# echo ${array[2]}
docker
[root@test day5]# echo ${array[0]}
shell
查看数组中所有的值
[root@test day5]# echo ${array[*]}
shell mysql docke
[root@test day5]# echo ${array[@]}
shell mysql docker
临时取消数组
[root@test day5]# unset array
第二种定义数组方式: 直接定义默认索引从0开始
[root@test day5]# array=(xiaohong xiaozi xiaolv xiaolan)
[root@test day5]# echo ${array[*]}
xiaohong xiaozi xiaolv xiaolan
[root@test day5]# echo ${!array[*]}
0 1 2 3
大保健: 红浪漫
红浪漫[1]=xiaohong
红浪漫[2]=xiaolv
红浪漫[3]=xiaozi
查看房间内容
echo 红浪漫[1]
xiaohong
查看所有的
echo 红浪漫[*]
第三种定义方式: 直接定义和通过索引定义
[root@test day5]# array=(xiaozi [666]=xiaolan [888]=xiaohong xiaolv )
[root@test day5]# echo ${array[*]}
xiaozi xiaolan xiaohong xiaolv
[root@test day5]# echo ${!array[*]}
0 666 888 889
第四种定义方式: 命令定义
[root@test day5]# ls
expect.ex game.sh jumpserver.sh test.ex
[root@test day5]# array=(`ls`)
[root@test day5]# echo ${array[*]}
expect.ex game.sh jumpserver.sh test.ex
[root@test day5]# echo ${!array[*]}
0 1 2 3
定义IP地址数组: 进行数组遍历
[root@test day5]# ip=(172.16.1.7 172.16.1.2 172.16.1.31 172.16.1.51)
[root@test day5]# echo ${ip[*]}
172.16.1.7 172.16.1.2 172.16.1.31 172.16.1.51
[root@test day5]#
[root@test day5]# for i in ${ip[*]};do echo $i;done
172.16.1.7
172.16.1.2
172.16.1.31
172.16.1.51
写入脚本
[root@test day5]#
[root@test day5]# cat array.sh
#!/bin/bash
ip=(172.16.1.7 172.16.1.2 172.16.1.31 172.16.1.51)
for i in ${ip[*]}
do
echo $i
done
[root@test day5]# sh array.sh
172.16.1.7
172.16.1.2
172.16.1.31
172.16.1.51
通过索引来遍历数组
[root@test day5]# cat array.sh
#!/bin/bash
ip=(172.16.1.7 172.16.1.2 172.16.1.31 172.16.1.51)
for i in ${!ip[*]}
do
echo ${ip[$i]}
done
[root@test day5]# sh array.sh
172.16.1.7
172.16.1.2
172.16.1.31
172.16.1.51
案例: 取数组中的值
[root@test day5]# cat array.sh
#!/bin/bash
ip=(172.16.1.7 172.16.1.2 172.16.1.31 172.16.1.51)
for i in ${ip[*]}
do
ping -c1 -W1 $i &>/dev/null
if [ $? -eq 0 ];then
echo "ping $i is ok...."
else
echo "ping $i is error..."
fi
done
查看普通数组:
declare -a array='([0]="docker")'
关联数组: 定义关联数组需要声明
[root@test day5]# declare -A array
[root@test day5]# array[index1]=shell
[root@test day5]# array[index2]=mysql
[root@test day5]# array[index3]=docker
[root@test day5]# echo ${array[*]}
shell mysql docker
[root@test day5]# echo ${!array[*]}
index1 index2 index3
案例:
[root@test day5]# unset array
[root@test day5]# declare -A array
[root@test day5]# #a b c
[root@test day5]# let a++
[root@test day5]# let a++
[root@test day5]# let b++
[root@test day5]# let c++
[root@test day5]# echo $a $b $c
2 1 1
[root@test day5]# let array[a]++
[root@test day5]# let array[a]++
[root@test day5]# let array[b]++
[root@test day5]# let array[c]++
[root@test day5]# #array[a]++ ========= array[a]=array[a+1]
[root@test day5]# echo ${array[a]}
2
[root@test day5]# echo ${array[b]}
1
[root@test day5]# echo ${array[c]}
1
使用for循环依次取值:
[root@test day5]# cat user.txt
a
a
b
c
[root@test day5]# #i=a
[root@test day5]# #let array[$i]++
[root@test day5]# #let array[a]++
[root@test day5]# #let array[a]++
[root@test day5]# #echo ${array[a]}
[root@test day5]# #2
[root@test day5]# #let array[b]++
[root@test day5]# #let array[c]++
[root@test day5]# echo ${array[a]}
2
[root@test day5]# #echo ${array[a]}
[root@test day5]# #echo ${array[b]}
[root@test day5]# #echo ${array[c]}
[root@test day5]# cat array.sh
#!/bin/bash
declare -A array
for i in `cat user.txt`
do
let array[$i]++
done
for i in ${!array[*]}
do
echo $i 出现了 ${array[$i]} 次
done
[root@test day5]# sh array.sh
a 出现了 2 次
b 出现了 1 次
c 出现了 1 次
统计bash的数量
[root@test day5]# cat array1.sh
#!/bin/sh
declare -A array
while read line
do
bash=`echo $line|awk -F: '{print $NF}'`
let array[$bash]++
done
for i in ${!array[*]}
do
echo $i 出现了 ${array[$i]} 次
done
[root@test day5]# sh array1.sh
/sbin/nologin 出现了 17 次
/bin/sync 出现了 1 次
/bin/bash 出现了 26 次
/sbin/shutdown 出现了 1 次
/sbin/halt 出现了 1 次
数组统计IP出现次数:
[root@test day5]# cat array1.sh
#!/bin/sh
declare -A ips
while read line
do
ip=`echo $line|awk '{print $1}'`
let ips[$ip]++
done
for i in ${!ips[*]}
do
echo $i 出现了 ${ips[$i]} 次
done
shell结束..................................................
常用内容:
1.变量 全局 局部
2.传参方法
3.位置参数 $0 $# $n $?
4.数值运算 expr $(()) $[] let bc awk python
5.表达式 都支持命令
或者 -o 并且 -a
整数比较 man test
[ 10 -eq 10 ] -eq -ne -gt -ge -lt -le
文件判断
[ -f /etc/hosts ] -f -d -e -r -w -x
字符串比对
[ test = test ] [ test != oldboy ]
-z 为空则为真
-n 不为空则为真
正则比对[[ test =~ 正则 ]] 或者 || 并且 &&
6.语法
if判断
单分支 双分支 多分支
for循环
while循环
exit
break
continue
函数 定义 传参 变量 返回值 可以复用
case
数组 普通数字
定义和遍历
ip=(10.0.0.7 10.0.0.31)
echo ${ip[*]}