expect 脚本

  • expect 是用来进行自动化控制和测试的工具,可以执行交互式的脚本
  • 在执行脚本过程中,一些交互式的过程可能需要用户输入等信息,这种情况下课使用 expect 脚本
  • 基本命令
    • send:向进程发送字符串,用于模拟用户的输入,一定要加 \r 回车
    • expect:从进程接收字符串
    • spawn:启动进程,spawn 启动的进程的输出可被 expect 捕获
    • interact:用户交互
  • 下面的脚本可将文件 scp 远程拷贝到某台机器

    #!/usr/bin/expect
    set timeout 100                     ## 设置超时时间, -1 可无限等待
    set filename [lindex $argv 0]       ## 接收输入参数,保存文件名
    set machineURL [lindex $argv 1]     ## 接收输入参数,保存远程机器的上传的 URL,包括用户名,IP 地址和路径
    set machinePWD [lindex $argv 2]     ## 接收输入参数,保存远程机器的密码
    spawn scp $filename $machineURL     ## 执行 scp 命令
    expect {
    "yes/no" { send "yes\r"; exp_continue}  ## 如果出现"yes/no",则输入"yes",然后继续这个循环
    "password:" { send "$machinePWD\r" }    ## 如果出现"password:",则输入保存的密码,然后退出这个循环,继续往下
    }
    expect 100%                         ## 出现 100% 表明上传成功
    expect eof                          ## 等待结束标记,由 spawn 启动的命令在结束时回产生一个 eof 标记
    

注意: expect 不能正确解释 shell 的 glob 模式,所以执行类似 spawn scp -r /home/user/dir1/ cluster_server: 的命令会出错。解决方法:

spawn bash -c "scp -r /home/user/dir1/* cluster_server:"

相关