Shell编程--expect

  • 实现批量修改密码,批量推送ssh的公钥,进行远程ssh连接,任何批量操作的基本都能处理。

  • 通过expect可以实现将交互式的命令变为非交互式执行,不需要人为干预(手动输入)

  • 是一个免费的编程工具,用来实现自动的交互式任务,而无需人为干预

  • 在实际工作中我们运行命令、脚本或程序时,都需要从终端输入某些继续运行的指令,而这些输入都需要人为的手工进行,而利用 expect 则可以根据程序的提示,模拟标准输入提供给程序,从而实现自动化交互执行,这就是 expect

  • 如果能够在工作中熟练的使用Shell脚本就可以很大程度的提高工作效率,那么再搭配上expect这个时候很多工作都可以实现自动化进行。

说白了 expect 就是一套用来实现自动交互功能的软件

用法

1)定义expect脚本执行的shell:#!/usr/bin/expect --类似于#!/bin/bash
2)set timeout 30:设置超时时间30s
3)spawn:执行expect之后后执行的内部命令开启一个会话,用来执行shell的交互命令
4)expect相当于捕捉,判断输出结果是否包含某项字符串(相当于捕捉返回的结果),没有则会断开,否则等待一段时间后返回,等待通过timeout设置
5)send:执行交互动作,将交互要执行的命令进行发送给交互指令,命令字符串结尾要加上“\r”,相当于回车
6)interact:执行完后保持交互状态,需要等待手动退出交互状态,如果不加这一项,交互完成会自动退出
7)exp_continue:继续执行接下来的操作

expect的安装

[root@localhost ~] yum -y install expect

实战——非交互式ssh连接

案例1:普通操作

[root@localhost ~]# vim ex.sh
#!/usr/bin/expect
spawn ssh root@192.168.17.137
​
expect {
        "yes/no" {  send "yes\r"; exp_continue }
        "password:" { send "1\r" };
}
interact
[root@localhost ~]# expect ex.sh
spawn ssh root@192.168.17.137
root@192.168.17.137's password:
Last login: Mon Jul 17 10:25:24 2023 from 192.168.17.128
[root@localhost ~]# ip a|grep inet
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host
    inet 192.168.17.137/24 brd 192.168.17.255 scope global noprefixroute ens33
    inet6 fe80::2022:2258:5fcc:dd1f/64 scope link noprefixroute
​
//如果添加interact参数将会等待我们手动交互进行退出。如果不加interact参数在登录成功之后会立刻退出。

案例2:设置变量与进行传参的方式

注意:expect环境中设置变量要用set!它识别不了bash方式定义的变量

[root@localhost ~]# vim expect01.sh
#!/usr/bin/expect
set user root
set pass 1
set ip [ lindex $argv 0 ]  
//expect固定写法,从0开始,第一个位置参数,相当于shell中的$1
​
set timeout 10
​
spawn ssh $user@$ip
expect {
        "yes/no" {  send "yes\r"; exp_continue }
        "password:" { send "$pass\r" };
}
interact
​
[root@localhost ~]# expect ex01.sh 192.168.17.137
spawn ssh root@192.168.17.137
root@192.168.17.137's password:
Last login: Mon Jul 17 10:37:55 2023 from 192.168.17.128
[root@localhost ~]# exit
登出
Connection to 192.168.17.137 closed.

如果想登录成功后,自动结束交互模式(也就是expect),可以采用下面方式:

#!/usr/bin/expect
set user root
set pass 1
set ip [ lindex $argv 0 ]
//expect固定写法,从0开始,第一个位置参数,相当于shell中的$1
set timeout 10
​
spawn ssh $user@$ip
expect {
        "yes/no" {  send "yes\r"; exp_continue }
        "password:" { send "$pass\r" };
                send "exit\r"
}
​
expect eof  //直接退出expect模式[root@localhost ~]# expect ex01.sh 192.168.17.137
spawn ssh root@192.168.17.137
root@192.168.17.137's password:
Last login: Mon Jul 17 10:46:07 2023 from 192.168.17.128[root@localhost ~]# ip a|grep inet
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host
    inet 192.168.17.128/24 brd 192.168.17.255 scope global ens33

案例3:进行批量推送公钥实现免密连接,ping通一个ip地址连接一个ip

[root@localhost script]# vim getip_push.sh
#!/usr/bin/bash
pass=1
//判断expect命令是否安装
rpm -qa expect &> /dev/null
if [ $? -ne 0 ];then
        yum install -y expect
fi
​
//判断主机下面是否生成秘钥,如果没有生成秘钥
if [ ! -f ~/.ssh/id_rsa ];then
        ssh-keygen -P "" -f ~/.ssh/id_rsa
fi
​
//循环执行获取up状态的ip地址。
for i in {2..254}
do
        {
        ip=192.168.17.$i
        ping -c1 -w1 $ip &> /dev/null
        if [ $? -eq 0 ];then
                echo "$ip" >> up_ip.txt
                set timeout 10
                /usr/bin/expect <<-EOF   //shell脚本中调用expect命令
                spawn ssh-copy-id $ip
                expect {
                        "yes/no" { send "yes\r"; exp_continue }
                        "password:" { send "$pass\r" };
                }
                expect eof
EOF
        fi      
        } &
wait
done
echo "finish..."[root@localhost script]# chmod +x getip_push.sh 
[root@localhost script]# expect getip_push.sh
​
//测试....
  • 11
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TA548464

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值