shell——随机数(RANDOM)+ expect 自动应答
Posted 郭怀远
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了shell——随机数(RANDOM)+ expect 自动应答相关的知识,希望对你有一定的参考价值。
文章目录
RANDOM
bash默认有一个$RANDOM的变量 默认是0~32767。使用set |grep RANDOM 查看上一次产生的随机数
产生0~1之间的随机数
echo $[$RANDOM%2]
产生0~2之间的随机数
echo $[$RANDOM%3]
产生0~3之间的随机数
echo $[$RANDOM%4]
。。。。
产生0~9内的随机数
echo $[$RANDOM%10]
产生0~100内的随机数
echo $[$RANDOM%101]
产生50-100之内的随机数
echo $[$RANDOM%51+50]
产生三位数的随机数
echo $[$RANDOM%900+100]
示例
示例1
写一个脚本,产生一个phonenum.txt文件,随机产生以138开头的手机号1000个,每个一行
思路:
- 循环1000次产生号码
- 138+8位数字,后面8位数字随机产生($[RANDOM%10])
- 将随机数保存到变量里,在保存到文件里
#!/bin/bash
for (( i = 0; i < 1000; i++ ))
do
n1=$[RANDOM%10]
n2=$[RANDOM%10]
n3=$[RANDOM%10]
n4=$[RANDOM%10]
n5=$[RANDOM%10]
n6=$[RANDOM%10]
n7=$[RANDOM%10]
n8=$[RANDOM%10]
tmp=138$n1$n2$n3$n4$n5$n6$n7$n8
echo $tmp >> phonenum.txt
done
示例2
在上面的1000个手机号里抽奖5个幸运观众,显示出这5个幸运观众。但只显示头3个数和尾号的4个数,中间的都用*代替
#!/bin/bash
#从 phonenum.txt中 随机抽4个号码
path=/root/test/phonenum.txt
for (( i = 0; i < 4; i++ ))
do
#统计文件的行数
line=`wc -l $path | cut -d' ' -f1`
#随机生成行号
line=$[RANDOM%line+1]
#定位到指定行的号码
num=`head -$line $path | tail -1`
#打印到屏幕
echo "139****$num:7:4"
#把完整号码保存到指定问文件
echo $num >> winning_numbers.txt
#删除已经抽过的号码
sed -i "/$num/d" $path
done
expect 自动应答
expect是一个用来处理交互的命令。借助Expect,我们可以将交互过程写在一个脚本上,使之自动化完成。
expect (自动应答),基于tcl语言
安装 expect yum install expect -y
在脚本文件的第一行写上这么一行,告诉系统用expect
来执行
#!/usr/bin/expect
使用expecrt时基本上就是配合下面4条命令使用
命令 | 作用 |
---|---|
send | 用于向进程发送字符串 |
expect | 用于从进程读取字符串 |
spawn | 启动新的进程 |
interact | 运行用户交互 |
使用示例
示例1:A远程登录到另外一台主机上什么都不做
#!/usr/bin/expect
#开启一个新的进程
spawn ssh root@192.168.44.122
# 捕获相关内容
expect
"(yes/no)?" send "yes\\r";exp_continue
"password:" send "root\\r"
interact #交互执行
1)定义变量
#!/usr/bin/expect
set ip 192.168.44.122
set passwd root
spawn ssh root@$ip
expect
"yes/no" send "yes\\r";exp_continue
"password:" send "$passwd\\r"
interact
2)使用位置参数
#!/usr/bin/expect
set ip [ lindex $argv 0 ]
set passwd [ lindex $argv 1 ]
spawn ssh root@$ip
expect
"yes/no" send "yes\\r";exp_continue
"password:" send "$passwd\\r"
interact
#运行脚本时给定参数
# ./expect.sh 192.168.44.122 root
- exp_continue:无论是捕捉到都继续执行
- \\r:换行
示例2:A远程登录到另外一台主机上操作
#!/usr/bin/expect
set ip 192.168.44.122
set passwd root
spawn ssh root@$ip
expect
"yes/no" send "yes\\r";exp_continue
"password:" send "$passwd\\r"
#只要读取到"#"就会执行下面的代码(root用户是带#的)
expect "#"
send "mkdir tmp\\r"
send "cd tmp\\r"
send "touch file1..5\\r"
send "exit\\r"
expect eof
示例3:shell脚本和expect结合使用,在多台服务器上创建1个用户
#!/bin/bash
while read ip passwd
do
#加 - 表示下面的END可以加个制表符号
/usr/bin/expect <<-END &>/dev/null
spawn ssh root@$ip
expect
"yes/no" send "yes\\r";exp_continue
"password:" send "$passwd\\r"
expect "#" send "useradd my_user;rm -rf /tmp/*;exit\\r"
expect eof
END
done < ip.txt
示例4:写一个脚本,将跳板机上test用户的公钥推送到局域网内可以ping通的所有机器上
准备3台机器
ip | 身份 |
---|---|
192.168.44.122 | 内网主机 |
192.168.44.166 | 内网主机 |
192.168.44.144 | 跳板机 |
给跳板机上test用户提权,命令visudo
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
test ALL=(root) NOPASSWD:ALL,!/sbin/shutdown,!/sbin/init,!/bin/rm -rf /
在跳板机上创建一个主机密码文件pass.txt
主机Ip:密码
192.168.44.122:root
192.168.44.144:root
在根目录创建ip_up.txt
文件,保存可以ping通的主机ip
脚本实现
#!/bin/bash
#判断公钥是否存在
[ ! -f /home/test/.ssh/id_rsa ] && ssh-keygen -P '' -f ~/.ssh/id_rsa
#循环判断主机是否ping通,如果ping通推送公钥
tr ':' ' ' < /test/ip.txt|while read ip password
do
ping -c1 $ip &>/dev/null
if [ $? -eq 0 ];then
echo $ip >> ~/ip_up.txt
/usr/bin/expect <<-END &>/dev/null
spawn ssh-copy-id root@ip
expecct
"yes/no" send "yes\\r";exp_continue
"password:" send $password\\r"
expect eof
END
fi
&
done
wait
echo "公钥推送完毕,正在测试..."
#测试验证
remote_ip=`tail -1 ~/ip_up.txt`
ssh root@remote_ip hostname &>/dev/null
test $? -eq 0 && echo "公钥推送成功"
示例5:写一个脚本,统计web服务的不同连接状态个数
#!/bin/bash
#统计每个状态的个数
declare -A array
states=`ss -ant | grep 80 | cut -d ' ' -f1`
for i in $states
do
let array[$i]++
done
#通过遍历数组里的索引和元素打印出来
for j in $!array[*]
do
echo $j:$array[$j]
done
以上是关于shell——随机数(RANDOM)+ expect 自动应答的主要内容,如果未能解决你的问题,请参考以下文章