expect交互工具

1.expect简介

  • expect是一个用来处理交互的命令。 借助expect,我们可以将交互过程写在一个脚本上,使之自动化完成。

2.expect安装(默认未安装)

[root@liang ~]# yum install expect -y

3.命令与参数解释

3.1脚本开头

  • expect脚本一般以#!/usr/bin/expect -f 开头,类似bash脚本。

3.2常用后缀

  • expect脚本常常以.exp或者.ex结束。

3.3主要命令

命令解释
send用于向进程发送字符串
expect从进程接收字符串
spawn启动新的进程
interact允许用户交互
exp_continue匹配多个字符串在执行动作后加此命令
set设定变量值
[lindex $argv 0]获取expect脚本的第1个参数,
set timeout 5设置超时时间,单位为秒,-1为没有限制
expect eof等待spawn进程结束后退出信号eof

4.实例操作:

4.1通过expect脚本,实现ssh自动化连接

4.1.1expect脚本内容与解释

[root@liang 2018-07-30]# cat expect.exp    
#!/usr/bin/expect -f
set timeout -1 #永远不会超时
set ip 10.0.0.130 #定义变量ip=10.0.0.130
set password 000000
spawn ssh root@${ip}#启动 ssh连接 root@10.0.0.130 的进程
expect {#接受进程的字符串
        "yes/no" {send "yes\r";exp_continue}#如果字符串包含"yes/no",则发送“yes”并回车,继续匹配
        "password" {send "${password}\r"};
}
interact #ssh连接后,停留在被控制端

4.1.2执行expect脚本

[root@liang 2018-07-30]# expect expect.exp 
spawn ssh root@10.0.0.130
root@10.0.0.130's password: 
Last login: Tue Jul 31 01:08:32 2018 from 10.0.0.129
[root@haproxy ~]# date
Tue Jul 31 01:09:33 EDT 2018

4.2通过expect脚本,实现免秘钥

4.2.1实验环境(主机名与IP)

liang 10.0.0.129(秘钥服务端)
haproxy 10.0.0.130
nginx 10.0.0.131
mysql 10.0.0.132

4.2.2在服务端生成秘钥

[root@liang ~]# ssh-keygen(打完这条命令,一直按回车) 
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
ca:3d:85:7f:21:88:56:31:51:6c:1d:65:87:86:d4:e8 root@rsync-A
The key's randomart image is:
+--[ RSA 2048]----+
|        ++.oo*o..|
|         oo +.+. |
|        .. . .   |
|       o o  E    |
|      o S o .    |
|     o o o . .   |
|      o o . .    |
|         . .     |
|                 |
+-----------------+

4.2.3编写shell嵌套expect脚本进行免秘钥操作

[root@liang 2018-07-30]# cat ssh.sh 
#!/bin/bash #shell脚本解释器
password=000000#设置变量,我这里所有虚拟机的密码都为000000
for ip in `seq 130 132` #循环主机
do
    expect -c " #调用expect命令
        spawn ssh-copy-id -i /root/.ssh/id_rsa.pub 10.0.0.$ip #发送公钥的虚拟机
        expect {
                \"yes/no\" { send \"yes\r\";exp_continue }#这里的写法跟前面一样,\"\"(只是所有双引号的前面都需要加个\转义符号)
                \"password\" { send \"${password}\r\"}
        };#结尾需要加分号
        expect eof #结束进程
    "
done

4.2.4执行脚本

[root@liang 2018-07-30]# bash ssh.sh   
spawn ssh-copy-id -i /root/.ssh/id_rsa.pub 10.0.0.130
root@10.0.0.130's password: 
Now try logging into the machine, with "ssh '10.0.0.130'", and check in:

  .ssh/authorized_keys

to make sure we haven't added extra keys that you weren't expecting.

spawn ssh-copy-id -i /root/.ssh/id_rsa.pub 10.0.0.131
root@10.0.0.131's password: 
Now try logging into the machine, with "ssh '10.0.0.131'", and check in:

  .ssh/authorized_keys

to make sure we haven't added extra keys that you weren't expecting.

spawn ssh-copy-id -i /root/.ssh/id_rsa.pub 10.0.0.132
root@10.0.0.132's password: 
Now try logging into the machine, with "ssh '10.0.0.132'", and check in:

  .ssh/authorized_keys

to make sure we haven't added extra keys that you weren't expecting.

4.2.5验证

[root@liang 2018-07-30]# ssh 10.0.0.130
Last login: Tue Jul 31 01:08:52 2018 from 10.0.0.129
[root@haproxy ~]# exit
logout
Connection to 10.0.0.130 closed.
[root@liang 2018-07-30]# ssh 10.0.0.131
Last login: Tue Jul 31 01:24:56 2018 from 10.0.0.129
[root@nginx ~]# exit
logout
Connection to 10.0.0.131 closed.
[root@liang 2018-07-30]# ssh 10.0.0.132
Last login: Mon Jul 30 11:15:28 2018 from 10.0.0.1
[root@mysql ~]# exit
logout
Connection to 10.0.0.132 closed.

4.3通过执行 脚本+用户@IP+密码,实现免秘钥。(例如:bash ssh_user.sh root@10.0.0.130 000000)

4.3.1脚本内容与解释

[root@liang 2018-07-30]# cat ssh_user.exp 
#!/usr/bin/expect -f #expect的解释器
set user_ip [lindex $argv 0] #设置user_ip变量=用户输入的第一个变量
set password [lindex $argv 1] #设置password变量=用户输入的第二个变量
spawn ssh-copy-id -i /root/.ssh/id_rsa.pub ${user_ip} #发送公钥给用户输入的用户
expect {
        "yes/no" { send "yes\r";exp_continue }
         "password" { send "${password}\r"};
}
expect eof

4.3.2删除主机的秘钥(前面把公钥发过去了,先删掉)

[root@liang 2018-07-30]# ssh root@10.0.0.130 rm -rf /root/.ssh/authorized_keys
[root@liang 2018-07-30]# ssh root@10.0.0.130
root@10.0.0.130's password: 

4.3.3执行脚本

[root@liang 2018-07-30]# expect ssh_user.exp root@10.0.0.130 000000
spawn ssh-copy-id -i /root/.ssh/id_rsa.pub root@10.0.0.130
root@10.0.0.130's password: 
Now try logging into the machine, with "ssh 'root@10.0.0.130'", and check in:

  .ssh/authorized_keys

to make sure we haven't added extra keys that you weren't expecting.

4.3.4测试

[root@liang 2018-07-30]# ssh 10.0.0.130
Last login: Tue Jul 31 01:29:52 2018 from 10.0.0.129
[root@haproxy ~]# exit
logout
Connection to 10.0.0.130 closed.
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值