## shell例子-expect-trap-select

shell例子

字符切片用法
[root@rocky ~]# nginx=https://nginx.org/download/nginx-1.12.2.tar.gz
[root@rocky ~]# wget $nginx
[root@rocky ~]# tar xvf ${nginx##*/}
[root@rocky ~]# nginxdir=`echo  ${nginx##*/} | cut -c 1-12`
[root@rocky ~]# cd $nginxdir
expect用法
expect1.1> expect "hi" { send "YOU HIHA\n" }
sajdasdasdhi
YOU HIHA
--------------------------------------------------
#!/usr/bin/expect
set ip 192.168.1.2	#定义ip变量
spawn  scp /etc/fstab root@192.168.1.2:/tmp
expect {
        "yes/no" { send "yes\n";exp_continue }   #exp_continue 表示遇见yes/no 一直执行send 的yes
        "password" { send "123123\n" }
}
expect eof
[root@cenots8 Linux]# ./ex 
spawn scp /etc/fstab root@192.168.1.2:/tmp
root@192.168.1.2's password: 
fstab   
----------------------------------------------------------
脚本调用expect #用标准重定向
#!/bin/bash
ip=$2
yonghu=$1
mima=$3
expect <<EOF
spawn  ssh $1@$2
expect {
        "yes/no" { send "yes\n";exp_continue }
        "password" { send "$3\n" }
}
expect  "]#" { send "useradd haha\n" }						#创建用户
expect  "]#" { send "echo magedu | passwd --stdin haha\n" } #设置密码
expect eof
EOF
-------------------------------------------------------------------
批量主机创建用户关闭selinux
#!/bin/bash
NET=192.168.1
USER=root
PASSWORD=123123
IPLIST="
111
200
"

for i in $IPLIST ;do
        IP=$NET.$i
expect <<EOF
spawn ssh $USER@$IP
expect {
        "yes/no" { send "yes\n" ;exp_continue }
        "password" { send "$PASSWORD\n" }
}
expect "#" { send "sed -i 's/^SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config\n"}
expect "#" { send "useradd tom\n" }
expect "#" { send "echo tom:123123 | chpasswd\n" }
expect "#" { send "exit\n"}
expect eof
EOF
done

while批量修改文件名
file里是源文件名 把a.0txt修改为a.0.aaa
#!/bin/bash
# 
while read line;do
        new=`echo ${line} |  cut -d't' -f1`
        mv $line ${new}.aaa
done < /root/date/file
while+if 测试成绩
#!/bin/bash
# 


while true ;do
read -p "please you number " chengji
 if [ $chengji -ge 60 -a $chengji -lt 100 ] &>/dev/null;then
    echo Pass ;break
 elif
   [ $chengji -lt 60 ] &>/dev/null;then
   echo No ;break
 elif
   [ $chengji == exit ];then
   exit 20
 else
   echo "请输出0~100正确的成绩,或者exit退出"
 fi

done
判断yes或者no
#!/bin/bash
read -p "请输入yes或者no " aa
[[ $aa =~ ^([Yy][Ee][Ss]|[Yy]|[Nn][Oo]?)$ ]] && echo "有效的" || echo "无效的"

判断用户nginx
[root@rocky ~]# aa=nginx
[root@rocky ~]# id $aa 2> /dev/null && echo $aa is exist || { useradd $aa ; echo $aa is creat ;}
nginx is creat
[root@rocky ~]# id $aa 2> /dev/null && echo $aa is exist || { useradd $aa ; echo $aa is creat ;}
uid=1008(nginx) gid=1009(nginx) groups=1009(nginx)
nginx is exist

简单for循环
#!/bin/bash
# 
for ((i=1;i<=10;i++));do
 echo $i
done
#
for a in `seq 10`;do
        echo $a
done
#
for b in {1..10};do
        echo $b
done
########################################
a="
100
200
123
"
for i iin $a;do		#变量a是三个数 for只循环三次
done
99乘法表
#!/bin/bash
for i in `seq 9`;do
 for a in `seq $i`;do
   let b=$i*$a
   echo  -e "$a*$i=${b}\t\c"
   done
   echo 
done
~    
[root@rocky tmp]# bash 99
1*1=1	
1*2=2	2*2=4	
1*3=3	2*3=6	3*3=9	
1*4=4	2*4=8	3*4=12	4*4=16	
1*5=5	2*5=10	3*5=15	4*5=20	5*5=25	
1*6=6	2*6=12	3*6=18	4*6=24	5*6=30	6*6=36	
1*7=7	2*7=14	3*7=21	4*7=28	5*7=35	6*7=42	7*7=49	
1*8=8	2*8=16	3*8=24	4*8=32	5*8=40	6*8=48	7*8=56	8*8=64	
1*9=9	2*9=18	3*9=27	4*9=36	5*9=45	6*9=54	7*9=63	8*9=72	9*9=81	
多线程扫描端口
#!/bin/bash
i=1
host=192.168.1.20
while [ $i -le 65535 ];do
 {
 if nc -zv $host $i &>/dev/null;then
         echo $i | tee -a prot.txt
 fi      
 let i++
  } & ##后台执行多线程
done
wait   #等待执行完关闭线程
打印文件里的变量赋值
[root@rocky tmp]# . /etc/os-release ;echo $ID
rocky
#############
[root@rocky tmp]# cat /etc/os-release
NAME="Rocky Linux"
VERSION="8.6 (Green Obsidian)"
ID="rocky"
ID_LIKE="rhel centos fedora"
VERSION_ID="8.6"
PLATFORM_ID="platform:el8"
PRETTY_NAME="Rocky Linux 8.6 (Green Obsidian)"
ANSI_COLOR="0;32"
CPE_NAME="cpe:/o:rocky:rocky:8:GA"
HOME_URL="https://rockylinux.org/"
BUG_REPORT_URL="https://bugs.rockylinux.org/"
ROCKY_SUPPORT_PRODUCT="Rocky Linux"
ROCKY_SUPPORT_PRODUCT_VERSION="8"
REDHAT_SUPPORT_PRODUCT="Rocky Linux"
REDHAT_SUPPORT_PRODUCT_VERSION="8"
nginx简单启动脚本
#!/bin/bash
#
nginx_cmd=/usr/local/nginx/sbin/nginx
nginx_pid=/usr/local/nginx/logs/nginx.pid
start(){
 $nginx_cmd
 sleep 2
 if [  -e $nginx_pid ];then
   echo "服务nginx已经启动PID是`cat $nginx_pid`"
 else
   echo "服务启动失败"
 fi
}

stop(){
 $nginx_cmd -s stop
 if [  -e $nginx_pid ];then
  echo "nginx服务停止"
 else
   echo "nginx关闭失败"
 fi
}

reload(){
 if $nginx_cmd -t &>/dev/null;then
    $nginx_cmd -s reload
 else
    $nginx_cmd -t
 fi
}

status(){
 if [  -e $nginx_pid ];then
   echo "服务nginx已经启动PID是`cat $nginx_pid`"
 else
   echo "没有nginx服务"
 fi
}

case $1 in
   start)
     start
     ;;
   stop)
     stop
     ;;
   reload)
     reload
     ;;
   status)
     status
     ;;
    *)
     echo -e "$1 is an invalid command\nplease input is start|stop|reload|status to use "
     ;;
esac
######################################
[root@111 init.d]# /etc/init.d/nginx asdsa
asdsa is an invalid command
please input is start|stop|reload|status to use 
[root@111 init.d]# /etc/init.d/nginx status
服务nginx已经启动PID是94971
[root@111 init.d]# /etc/init.d/nginx stop
nginx服务停止
[root@111 init.d]# /etc/init.d/nginx status
没有nginx服务
[root@111 init.d]# /etc/init.d/nginx start
服务nginx已经启动PID是95255
[root@111 init.d]# /etc/init.d/nginx status
服务nginx已经启动PID是95255
[root@111 init.d]# /etc/init.d/nginx reload
[root@111 init.d]# /etc/init.d/nginx reload
nginx: [emerg] unknown directive "djaskldjklas" in /usr/local/nginx/conf/nginx.conf:3
nginx: configuration file /usr/local/nginx/conf/nginx.conf test failed
[root@111 init.d]# /etc/init.d/nginx reload
[root@111 init.d]# 
批量创建用户设置随机密码
#!/bin/bash
aduser(){
for i in `seq 10`;do
  id user$i &> /dev/null && echo user$i is exists ||  { useradd user$i ; PASS=`cat /dev/urandom | tr -dc '[a-zA-Z0-9]' | head -c 12` ;echo "user${i}:${PASS}" >> /tmp/pass;echo "user${i}:${PASS}" | chpasswd ;}
done
}
#
deuser(){
for i in `seq 10`;do
  id user$i &>/dev/null && { userdel -rf user$i &>/dev/null ; cat /dev/null > /tmp/pass ;echo user$i del success ;}|| echo user$i no esists
done
}
#
echo "1-创建用户"
echo "2-删除用户"
read -p "请输入要操作的类型:"  sum

case  $sum in
   1)
        aduser
        ;;
   2)
        deuser
        ;;
   *)
        echo "输入错误"    
        ;;
esac
所有UID相加
awk -F: '{print $3}' /etc/passwd | paste -s -d+ |bc
0+1+2+3+4+5+6+7+8+11+12+14+65534+81+999+193+59+998+997+996+995+994+993+74+70+992+72

#!/bin/bash
while read i ;do
  num=`echo $i | awk -F: '{print $3}'`
  let nb=$nb+$num
done < /etc/passwd
  echo $nb
每十分钟检查一次超过80的/dev/硬盘
#/bin/bash
WARNING=80
while true;do
df | sed -rn '/^\/dev\//s/.* ([0-9]+)%.*/\1/p' | while read DKspace ;do
 if [ $DKspace -ge $WARNING ];then
	 echo "${DKspace} is no space available"
 fi

done
 sleep 10m 
done
nohub bash df.sh &
1-100的所以奇数相加
echo {1..100..2} | tr ' ' +|bc
#!/bin/bash
sum=0
for i in {1..100};do
  if [ $((i%2)) -eq 0 ];then continue;fi
  let sum+=i
done
  echo $sum

break循环退出和continue本次循环退出和return函数退出
#!/bin/bash
for i in `seq 10`;do
 if [ $i -eq 6 ];then break;fi
  echo $i
done
echo haha
#
1
2
3
4
5
haha
#############################

#!/bin/bash
for i in `seq 10`;do
 if [ $i -eq 6 ];then continue;fi
  echo $i
done
echo haha
#
1
2
3
4
5
7
8
9
10
haha

shift和cat菜单
cat <<EOF
haha
heihei
hehe
EOF
while [ $1 ];do
  echo $1 is ok
  shift
done
[root@rocky shell]# bash shift.sh wang abc 123
haha
heihei
hehe
wang is ok
abc is ok
123 is ok


批量创建00到100用户
#!/bin/bash
#
IPADDR=`ifconfig  | awk '/netmask/{print $2}' | head -n +1`
if [[ $IPADDR  =~ 3 ]] ;then
	date
else
    groupadd magedu
    for i  in `seq -w 00 99`;do
	 useradd -G magedu  magedu_$i >/dev/null && echo magedu_${i} is creat success  || echo creat fail
     done
     useradd -G magedu  magedu_$((i+1)) >/dev/null && echo magedu_$((i+1)) creat success  | echo creat fail
fi

###################################
#!/bin/bash
#
IPADDR=`ifconfig  | awk '/netmask/{print $2}' | head -n +1`
if [[ $IPADDR  =~ 3 ]] ;then
        date    
else    
    groupadd magedu
     for i  in `seq -w 00 10 && seq 11 100`;do
         useradd -G magedu  magedu_$i >/dev/null && echo magedu_${i} is creat success  || echo creat fail
     done
fi 
awk -F: '/bash$/{print $1}' /etc/passwd
select
菜单输入的值是变成$REPLY变量  PS3是显示输入栏的
#!/bin/bash
PS3="请点菜(1-6):"
select i in 北京烤鸭 佛跳墙 小龙虾 羊蝎子 火锅 点菜结束;do
case $REPLY in
1)
        echo $i 价格是 100¥
        let sum+=100
        ;;
2)
        echo $i 价格是 88¥
        let sum+=88
        ;;
3)
        echo $i 价格是 66¥
        let sum+=66
        ;;
4)
        echo $i 价格是 120¥
        let sum+=120
        ;;
5)
        echo $i 价格是 128¥
        let sum+=128
        ;;
6)
        echo "点菜结束,退出"
        break
        ;;
7)
        echo “输入错误,请重新输入”
        ;;
esac
done
echo "总价格是:$sum"
[root@rocky shell]# bash select 
1) 北京烤鸭
2) 佛跳墙
3) 小龙虾
4) 羊蝎子
5) 火锅
6) 点菜结束
请点菜(1-6):2
佛跳墙 价格是 88¥
请点菜(1-6):3
小龙虾 价格是 66¥
请点菜(1-6):6
点菜结束,退出
总价格是:154

color
#!/bin/bash
color () {
    RES_COL=60
    MOVE_TO_COL="echo -en \\033[${RES_COL}G"
    SETCOLOR_SUCCESS="echo -en \\033[1;32m"
    SETCOLOR_FAILURE="echo -en \\033[1;31m"
    SETCOLOR_WARNING="echo -en \\033[1;33m"
    SETCOLOR_NORMAL="echo -en \E[0m"
    echo -n "$1" && $MOVE_TO_COL
    echo -n "["
    if [ $2 = "success" -o $2 = "0" ] ;then
        ${SETCOLOR_SUCCESS}
        echo -n $"  OK  "
    elif [ $2 = "failure" -o $2 = "1"  ] ;then
        ${SETCOLOR_FAILURE}
        echo -n $"FAILED"
    else
        ${SETCOLOR_WARNING}
        echo -n $"WARNING"
    fi
    ${SETCOLOR_NORMAL}
    echo -n "]"
    echo
}

#[ $# -eq 0 ] && echo "Usage: `basename $0` {success|failure|warning}"

color $1 $2
[root@rocky shell]# ./color.sh httpd 1
httpd                                                      [FAILED]
[root@rocky shell]# ./color.sh httpd 2
httpd                                                      [WARNING]
[root@rocky shell]# ./color.sh httpd 0
httpd                                                      [  OK  ]

color模板
#!/bin/bash

function yellow() {
 echo -e "\033[33m[ $1 ]\033[0m"
}
## green to echo
function green(){
    echo -e "\033[32m[ $1 ]\033[0m"
}
## blue to echo
function blue(){
    echo -e "\033[34m[ $1 ]\033[0m"
}
## red to echo
function red(){
    echo -e "\033[31m[ $1 ]\033[0m"
}
red aa
数组
数组

#!/bin/bash
hehe=(
'ls'
'pwd'
'echo 123'
)


for i in "${hehe[@]}";do
  $i
done
trap
#!/bin/bash
trap "echo no ctrl+c or no ctrl+\ " int quit
trap -p
for i in `seq 10`;do
 sleep 1
 echo $i
done
trap '' int
trap -;
for i in `seq 11 20`;do
 sleep 1
 echo $i
done
trap '-' int
trap -p
for i in `seq 21 30`;do
 sleep 1
 echo $i
done

[root@centos8-node1 tmp]# bash trap 
trap -- 'echo no ctrl+c or no ctrl+\ ' SIGINT
trap -- 'echo no ctrl+c or no ctrl+\ ' SIGQUIT
1
2
^Cno ctrl+c or no ctrl+ 
3
4
5
^\Quit (core dumped)
no ctrl+c or no ctrl+ 
6
7
8
^Cno ctrl+c or no ctrl+ 
9
10
trap: usage: trap [-lp] [[arg] signal_spec ...]
11
12
^C13
14
15
^C16
17
18
19
20
trap -- 'echo no ctrl+c or no ctrl+\ ' SIGQUIT
21
^C
-------------------------------------------------------------------------------
#!/bin/bash
aa(){
 echo "test.`date +%F-%T`" | tee -a /root/aa
}
trap aa exit
while true ;do
 echo hehe
done

[root@centos8-node1 tmp]# cat /root/aa 
test.2022-08-03-09:43:09
批量修改密码
 chpasswd < pw.txt
 vi pw.txt
user1:978ebbf1763
user2:23c2626c37b
数组数字比对
数字比对
[root@wang ~]# cat bidui 
#!/bin/bash
#
aa=(10 2515 1515 489465 12313215 12312313 116516513132)
max=${aa[0]}
cc=${#aa[*]}
let bb=$cc-1
for i in `seq $bb`;do
 if [ "$max" -lt "${aa[$i]}" ];then
       max=${aa[$i]}
 fi
done
echo $max
----------------------------------------------
随机数字比对
#!/bin/bash
declare -i min max
declare -a num
for i in `seq 10`;do
    num[$i]=$RANDOM
[ $i -eq 1 ] && min=${num[1]} && max=${num[1]} && continue
[ ${num[$i]} -gt $max ] && max=${num[$i]} && continue
[ ${num[$i]} -lt $min ] && min=${num[$i]}
done
echo 所有数字是${num[@]} 第一个数字是${num[1]}
echo max is $max
echo min is $min
[root@rocky ~]# bash shuzu.sh 
所有数字是13961 6057 4610 28901 1928 12318 5569 15145 3481 21503 第一个数字是13961
max is 28901
min is 1928

批量修改多台主机的root密码为随机密码
cat change_root_password.sh

\#!/bin/bash

rpm -q sshpass &> /dev/null || yum -y install sshpass

export SSHPASS=123456

NET=10.0.0

for i in {1..254};do

  {

 PASS=`openssl rand -base64 9`

 sshpass -e ssh  -o  StrictHostKeyChecking=no $NET.$i "echo $PASS|passwd --

stdin root &> /dev/null"

 echo $NET.$i:$PASS >> host.txt

 }&

done

wait 
批量部署多台主机基于key验证脚本1
#!/bin/bash
NET=10.0.0
PASS=magedu
ssh-keygen  -P ""  -f /root/.ssh/id_rsa &> /dev/null
rpm -q sshpass &> /dev/null || yum -y install sshpass &> /dev/null
for i in {1..100};do
{
sshpass  -p $PASS ssh-copy-id -o  StrictHostKeyChecking=no -i
/root/.ssh/id_rsa.pub $NET.$i &> /dev/null
}&
done
wait
批量部署多台主机基于key验证脚本2
#!/bin/bash
#

HOSTS="
10.0.0.6
10.0.0.7
10.0.0.18
10.0.0.28
"
PASS=magedu
ssh-keygen  -P ""  -f /root/.ssh/id_rsa &> /dev/null
rpm -q sshpass &> /dev/null || yum -y install sshpass &> /dev/null
for i in $HOSTS;do
{
sshpass  -p $PASS ssh-copy-id -o  StrictHostKeyChecking=no -i
/root/.ssh/id_rsa.pub $i &> /dev/null
}&
done
wait
网段内免密登录
PASS=centos1
#设置网段最后的地址,4-255之间,越小扫描越快
END=254

IP=`ip a s eth0 | awk -F'[ /]+' 'NR==3{print $3}'`
NET=${IP%.*}.

. /etc/os-release

rm -f /root/.ssh/id_rsa
[ -e ./SCANIP.log ] && rm -f SCANIP.log

for((i=3;i<="$END";i++));do
    ping -c 1 -w 1  ${NET}$i &> /dev/null  && echo "${NET}$i" >> SCANIP.log &
done
wait

ssh-keygen -P "" -f /root/.ssh/id_rsa
if [ $ID = "centos" -o $ID = "rocky" ];then
    rpm -q sshpass || yum -y install sshpass
else
    dpkg -i sshpass &> /dev/null || apt -y install sshpass
fi

sshpass -p $PASS ssh-copy-id -o StrictHostKeyChecking=no $IP 

AliveIP=(`cat SCANIP.log`)
for n in ${AliveIP[*]};do
    sshpass -p $PASS scp -o StrictHostKeyChecking=no -r /root/.ssh root@${n}:
done

#把.ssh/known_hosts拷贝到所有主机,使它们第一次互相访问时不需要输入回车
for n in ${AliveIP[*]};do
    scp /root/.ssh/known_hosts ${n}:.ssh/
done
定时检查/tmp目录下文件数量
[root@rocky system]# vim /lib/systemd/system/haha.service 
[Unit]
Description=print /tmp num file
[Service]
TimeoutStartSec=0
ExecStart=/usr/bin/crontab
[Install]
WantedBy=multi-user.target

[root@rocky ~]# vim print.sh
#!/bin/bash

aa=`ls -l /tmp | wc -l`
[ $aa -eq 13 ] && echo `date +%F-%T`-good >> /root/print.txt || echo `date +%F-%T`-bad >> /root/print.txt

mysql二进制安装
#!/bin/bash

#MySQL Download URL: https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.29-linux-glibc2.12-x86_64.tar.gz
#http://mirrors.163.com/mysql/Downloads/MySQL-5.7/mysql-5.7.31-linux-glibc2.12-x86_64.tar.gz
#http://mirrors.163.com/mysql/Downloads/MySQL-8.0/mysql-8.0.23-linux-glibc2.12-x86_64.tar.xz
. /etc/init.d/functions 

SRC_DIR=`pwd`

MYSQL='mysql-8.0.28-linux-glibc2.12-x86_64.tar.xz'
#MYSQL='mysql-8.0.23-linux-glibc2.12-x86_64.tar.xz'
MYSQL_ROOT_PASSWORD=123456

COLOR='echo -e \E[01;31m'
END='\E[0m'

check (){

if [ $UID -ne 0 ]; then
  action "当前用户不是root,安装失败" false
  exit 1
fi

cd  $SRC_DIR


if [ !  -e $MYSQL ];then
        $COLOR"缺少${MYSQL}文件"$END
		$COLOR"请将相关软件放在${SRC_DIR}目录下"$END
        exit
elif [ -e /usr/local/mysql ];then
        action "数据库已存在,安装失败" false
        exit
else
	return
fi
} 

install_mysql(){
    $COLOR"开始安装MySQL数据库..."$END
    yum  -y -q install libaio numactl-libs
    tar xf $MYSQL -C /usr/local/
    MYSQL_DIR=`echo $MYSQL| sed -nr 's/^(.*[0-9]).*/\1/p'`
    ln -s  /usr/local/$MYSQL_DIR /usr/local/mysql
    chown -R  root.root /usr/local/mysql/
    id mysql &> /dev/null || { useradd -s /sbin/nologin -r  mysql ; action "创建mysql用户"; }
        
    echo 'PATH=/usr/local/mysql/bin/:$PATH' > /etc/profile.d/mysql.sh
    .  /etc/profile.d/mysql.sh
	ln -s /usr/local/mysql/bin/* /usr/bin/
    cat > /etc/my.cnf <<-EOF
[mysqld]
server-id=`hostname -I|cut -d. -f4`
log-bin
datadir=/data/mysql
socket=/data/mysql/mysql.sock                                                                                                   
log-error=/data/mysql/mysql.log
pid-file=/data/mysql/mysql.pid
[client]
socket=/data/mysql/mysql.sock
EOF
    [ -d /data ] || mkdir /data
	mysqld --initialize-insecure --user=mysql --datadir=/data/mysql 
    cp /usr/local/mysql/support-files/mysql.server  /etc/init.d/mysqld
    chkconfig --add mysqld
    chkconfig mysqld on
    service mysqld start
    [ $? -ne 0 ] && { $COLOR"数据库启动失败,退出!"$END;exit; }
    #MYSQL_OLDPASSWORD=`awk '/A temporary password/{print $NF}' /data/mysql/mysql.log`
    #mysqladmin  -uroot -p$MYSQL_OLDPASSWORD password $MYSQL_ROOT_PASSWORD &>/dev/null
	sleep 3
    mysqladmin  -uroot  password $MYSQL_ROOT_PASSWORD &>/dev/null
    action "数据库安装完成" 
}


check

install_mysql

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值