[TOC] ## 安装 `yum install expect -y ` ## 命令 ### spwan 它启动一个进程,之后所有expect操作都在这个进程中进行 ### expect 等候一个相匹配内容的输出,一旦匹配则执行expect后面的动作命令, ``` -re 使用正则 expect -re ".*password" {send "root1234\r"} ``` `expect` 就会匹配命令执行后的输出,然后执行expect后面包含在{}中的send或exp_send动作,匹配及动作可以放在下一行,就可以省略{} 例子 ``` spwan ssh root@192.168.1.26 expect -re ".*password" send "root1234\r" ``` ### 启用选项 ``` -c 执行脚本前先执行的命令,可多次使用。 -d debug模式,可以在运行时输出一些诊断信息,与在脚本开始处使用exp_internal 1相似。 -D 启用交换调式器,可设一整数参数。 -f 从文件读取命令,仅用于使用#!时。如果文件名为"-",则从stdin读取(使用"./-"从文件名为-的文件读取)。 -i 交互式输入命令,使用"exit"或"EOF"退出输入状态。 -- 标示选项结束(如果你需要传递与expect选项相似的参数给脚本时),可放到#!行:#!/usr/bin/expect --。 -v 显示expect版本信息。 ``` ### 命令介绍 ``` close 关闭当前进程的连接。 debug 控制调试器。 disconnect 断开进程连接(进程仍在后台运行)。 exit 退出expect。 exp_continue [-continue_timer] 继续执行下面的匹配。 exp_internal [-f file] value: ``` ## 场景 ### 自动登录ssh执行命令 ``` #!/usr/bin/expect -f set ip [lindex $argv 0 ] # 接收第1个参数,作为IP set username [lindex $argv 1 ] # 接收第2个参数,作为username set mypassword [lindex $argv 2 ] # 接收第3个参数,作为密码 set timeout 10 # 设置超时时间 spawn ssh $username@$ip # 发送ssh请求 expect { # 返回信息匹配 "*yes/no" { send "yes\r"; exp_continue} # 第一次ssh连接会提示yes/no,继续 "*password:" { send "$mypassword\r" } # 出现密码提示,发送密码 } interact # 交互模式,用户会停留在远程服务器上面 ``` ### 自动建立FTP会话 ``` #!/usr/bin/expect -f set ip [lindex $argv 0 ] # 接收第1个参数,作为IP set userid [lindex $argv 1 ] # 接收第2个参数,作为Userid set mypassword [lindex $argv 2 ] # 接收第3个参数,作为密码 set timeout 10 # 设置超时时间 # 向远程服务器请求打开一个FTP会话,并等待服务器询问用户名 spawn ftp $ip expect "username:" # 输入用户名,并等待服务器询问密码 send "$userid\r" expect "password:" # 输入密码,并等待FTP提示符的出现 send "$mypassword\r" expect "ftp>" # 切换到二进制模式,并等待FTP提示符的出现 send "bin\r" expect "ftp>" # 关闭ftp的提示符 send "prompt\r" expect "ftp>" # 下载所有文件 send "mget *\r" expect "ftp>" # 退出此次ftp会话,并等待服务器的退出提示EOF send "bye\r" expect eof ```