操作系统 / 系统运维

Linux中通过expect工具实现免交互自动应答

浅时光 · 5月25日 · 2020年 8282次已读

一、下载工具

  • Expect工具是依赖tcl的,文章来源(Source):浅时光博客所以需要先检查是否安装tcl
[[email protected] ~]# whereis tcl
tcl: /usr/lib64/tcl8.5 /usr/share/tcl8.5
  • 如果没有安装运行下面命令安装
[[email protected] ~]# yum install -y tcl
[[email protected] ~]# yum install -y expect
[[email protected] ~]# command -v expect
/usr/bin/expect

二、选项介绍

  • spawn  启动新的交互进程, 后面跟命令或者指定程序
  • expec文章来源(Source):https://www.dqzboy.comt  从进程中接收信息, 如果匹配成功, 就执行expect后的动作
  • send &n文章来源(Source):https://www.dqzboy.combsp;  向文章来源(Source):https://www.dqzboy.com进程发送字符串
  • send exp_send   用于发送指定的字符串信息
  • exp_continue    在expect文章来源(Source):浅时光博客文章来源(Source):https://www.dqzboy.com多次匹配就文章来源(Source):https://www.dqzboy.com需要文章来源(Source):浅时光博客用到
  • s文章来源(Source):浅时光博客end_user    文章来源(Source):浅时光博客;   用来打印输出 相当于shell中的echo
  • interact      &n文章来源(Source):浅时光博客文章来源(Source):https://www.dqzboy.combsp; 允许用户交互
  • exit&n文章来源(Source):浅时光博客bsp;   退出expect脚本
  • eof 文章来源(Source):浅时光博客    expect执行结束, 退出
  • set 文章来源(Source):https://www.dqzboy.com;   定义变量
  • puts    输出变量
  • set timeout&nbs文章来源(Source):浅时光博客p;   设置超时时间

三、使用实践

1、免交互拷贝公钥

1.1:编辑脚本

[[email protected] ~]# vim autocopy.exp
#!/usr/bin/expect
set timeout 10
set user_hostname [lindex $argv 0]
set password [lindex $argv 1]
spawn ssh-copy-id $user_hostname
    expect {
        "(yes/no)?"
        {
            send "yes\n"
            expect "*assword:" { send "$password\n"}
        }
        "*assword:"
        {
            send "$password\n"
        }
    }
expect eof

[[email protected] ~]# chmod +x autocopy.exp

1.2:测试使用

[[email protected] ~]# ./autocopy.exp [email protected] 密码
Linux中通过expect工具实现免交互自动应答-浅时光博客

2、SCP自动应答脚本

2.1:编辑脚本

[[email protected] ~]# vim autocopy.exp
#!/usr/bin/expect
set timeout 10
set user_hostname [lindex $argv 0]
set src_file [lindex $argv 1]
set dest_file [lindex $argv 2]
set password [lindex $argv 3]
spawn scp $src_file $user_hostname:$dest_file
    expect {
        "(yes/no)?"
        {
            send "yes\n"
            expect "*assword:" { send "$password\n"}
        }
        "*assword:"
        {
            send "$password\n"
        }
    }
expect "100%"
expect eof

[[email protected] ~]# chmod +x autocopy.exp

2.2:测试使用

  • 用法autoscp.exp [[email protected]]hostname 源文件 目标目录 [password]
  • 说明:该自动回答脚本可以自动完成主机验证和密码认证,即使文章来源(Source):https://www.dqzboy.com已经是实现公钥认证的机器也没问题,因为公钥认证机制默认优先于密码认证,且此脚本的password项是可选的,当然,在没有实现公钥认证的情况下,password文章来源(Source):https://www.dqzboy.com是必须项,否则expect实现非交互的目文章来源(Source):浅时光博客的就失去意义了。
Linux中通过expect工具实现免交互自动应答-浅时光博客
0 条回应
    本站已安全运行: | 耗时 0.772 秒 | 查询 119 次 | 内存 18.77 MB