expect交互脚本

expect是一个免费的编程工具语言,用来实现自动和交互式任务通信的编程工具语言。

toc

expect 安装

源码包安装需要先 Tcl 库,因为expect是在 Tcl 基础上创建起来的,所以这里我就不用源码包安装了,直接用yum安装

## expect 在base源,这里我用的是阿里云的YUM源,有base源可以忽略
[root@Shell ~]# wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
[root@Shell ~]# yum makecache
## 用yum安装expect
[root@Shell ~]# yum install expect -y

expect基础应用

  • expect脚本一般以 #!/usr/bin/expect 开头
  • expect脚本常以.exp或者.ex结束。
  • expect主要命令
    • spawn 新建一个由expect控制的进程
    • expect 等待接受进程返回的字符串,直到超时时间
    • send 发送字符串给expect控制的进程
    • set 设定变量
    • exp_continue 重新从当前expect块的开始执行
    • [lindex argv0]expect11
    • [lindex argv1]expect22
    • set timeout -1 设置超时时间为永远等待
    • set timeout 30 设置超时时间为30秒
    • interact 保持当前状态,并把控制权交给用户
    • expect eof 等待spawn进程结束后退出

expect 实现用ssh密码交互登陆

#!/usr/bin/expect
## 设定变量password等于123.com
set password 123.com
## 新建一个进程,执行ssh命令
spawn ssh root@192.168.1.2
expect {
    ## 当询问
    "yes/no" { send "yes
"; exp_continue }
    "password" { send "$password
" }
}
interact

expect 进行参数传递,ssh登陆之后创建用户 yunxiang 并设置密码

#!/usr/bin/expect
## 位置参数传递
set ip [lindex $argv 0]
set user root
set password 123.com
set passwd 456.com
## 响应等待5秒,超时进入下一条
set timeout 5
spawn ssh $user@$ip
expect {
    "yes/no" { send "yes
"; exp_continue }
    "password" { send "$password
" };
}
# 当出现 # 号符执行如下命令
expect "#"
send "useradd yunxiang
"
send "passwd yunxiang
"
expect {
    "New password:" { send "$passwd
"; exp_continue }
    "Retype new password:" { send "$passwd
" }
}
send "exit
"
## 都执行完了就退出
expect eof

最后用 Shell+expect 批量获取在线主机, 进行秘钥批量分发

#!/usr/bin/bash
password="123.com"
## 清空ip.txt文件
>ip.txt
## 使用循环把ping通ip放到ip.txt文件中
for i in {2..10}
do
    ip=192.168.1.$i
    {
    ping -c1 -W1 $ip &>/dev/null
    if [ $? -eq 0 ];then
        echo "$ip" >> ip.txt
    fi
    }&
done
## 生成对应的密钥
if [ ! -f ~/.ssh/id_rsa ];then
    ssh-keygen -P "" -f ~/.ssh/id_rsa
fi
## 把ip.txt文件以每行循环
while read line
do
    ## 调用expect
    /usr/bin/expect <<-EOF
    set timeout 5
    spawn ssh-copy-id $line -f
    expect {
        "yes/no" { send "yes
"; exp_continue }
        "password:" { send "$password
" }
    }
    expect eof
    EOF
done<ip.txt
#!/bin/bash
password="123"
> ip.txt
if [ ! -f ~/.ssh/id_rsa ]
then
    ssh-key-id -P "" -f ~/.ssh/id_rsa
fi
for i in {2..10}
do
    ip=192.168.1.$i
    ping -c 1 -W 1 $ip > /dev/null
    if [ $? -eq 0 ]
    then
        /usr/bin/expect <<-EOF
        set timeout 5
        spawn ssh-copy-id $ip -f
        expect {
            "yes/no" { send "yes
"; exp_continue }
            "password" { send "$password
" }
        }
        expect eof
        EOF >> ip.txt
    fi
done
原文地址:https://www.cnblogs.com/songguoyou/p/11884253.html