Expect 交换式处理

  1. Expect 能够替系统管理员完成与系统的交互式操做  bash

  2.   

  3. [root@localhost ~]# yum -y install expect  # 能够经过 yum 安装  服务器

  4.   

  5. [root@localhost ~]# which expect  # 路径  ssh

  6. /usr/bin/expect  ide

  7.   

  8. [root@localhost tmp]# cat login.exp  spa

  9. #!/usr/bin/expect  命令行

  10. spawn ssh root@192.168.1.81;  orm

  11. expect {  xml

  12.   "(yes/no)?" { send "yes\r"; exp_continue }  进程

  13.   "password:" { send "123456\r"; exp_continue }  it

  14.   "#" { send "uptime\r"; interact }  

  15. }  

  16.   

  17. ## 使用 /usr/bin/expect 来解释脚本 , spawn 开启一个 ssh 进程 , expect 用来接收信息 , send 用来发送信息  

  18.    "(yes/no)?" 当第一次登录远程主机时会提示 yes/no , 匹配到信息时 send 发送 "yes\r" , \r 为换行 , exp_continue 为继续匹配下一条  

  19.    "#" 因为是 root 用户登录 , 那么匹配到正确的密码后会获得超级用户的标志 # 号 , 而后就能够 send 发送系统命令了 uptime  

  20.    interact 指令意为:保持交互状态 , 将控制权交给控制台 , 也就是说刚登录到远程主机 , 如今不会退出 , 且管理员能够操做主机  

  21.   

  22. [root@localhost tmp]# cat login.exp  

  23. #!/usr/bin/expect  

  24. set timeout -1;  

  25. spawn ssh root@192.168.1.81;  

  26. expect {  

  27.   "(yes/no)?" { send "yes\r"; exp_continue }  

  28.   "password:" { send "123456\r"; exp_continue }  

  29.   "#" { send "uptime\rexit\r"; expect eof }  

  30. }  

  31.   

  32. ## set timeout -1 : 设置超时时间 , -1 为无穷大、能够指定例如 20 (单位为秒)  

  33.    expect eof : 等待进程结束 (不保持交互状态), 当执行命令中没有明确指定退出登录(exit\r)时 , expect eof 会等到超时时间事后自  

  34.    动退出远程系统(timeout 设为 -1 时 , 不会退出 ) , 若是明确指定 exit\r (即上面例子)时 , 则执行完命令当即退出远程登录系统   

  35.   

  36. [root@localhost tmp]# cat login.sh  

  37. #!/bin/bash  

  38. list=("192.168.1.81 root 123456" "192.168.1.82 root 123456" "192.168.1.83 root 123456")  

  39. length=${#list[@]}  

  40.   

  41. for ((i=0;i<$length;i++))  

  42.   {  

  43.      host=`echo ${list[$i]} | awk '{print $1}'`  

  44.      user=`echo ${list[$i]} | awk '{print $2}'`  

  45.      passwd=`echo ${list[$i]} | awk '{print $3}'`  

  46.   

  47.      expect -c "  

  48.      spawn ssh $user@$host;  

  49.      expect {  

  50.        \"(yes/no)?\" { send \"yes\r\"; exp_continue }  

  51.        \"password:\" { send \"$passwd\r\"; exp_continue }  

  52.        \"#\" { send \"uptime\rexit\r\"; expect eof }  

  53.      }  

  54.    "  

  55. }  

  56.   

  57. ## expect -c 从命令行执行 expect 脚本  如今能够实现循环登录服务器执行命令后退出远程系统  

  58.    将 exit\r 去掉 , 而且 expect eof 改成 interact 能够实现停留在远程服务器(只限一台服务器 , 如过多台的话第一台停留就不会循环了)  

  59.   

  60. [root@localhost tmp]# cat login.exp1  

  61. #!/usr/bin/expect  

  62. if { $argc != 3 } {  

  63.   puts "usage $argv0 user host passwd"  

  64.   exit 1  

  65. }  

  66.   

  67. set user [lindex $argv 0]  

  68. set host [lindex $argv 1]  

  69. set passwd [lindex $argv 2]  

  70.   

  71. spawn ssh $user@$host;  

  72. expect {  

  73.   "(yes/no)?" { send "yes\r"; exp_continue }  

  74.   "password:" { send "$passwd\r"; exp_continue }  

  75.   "#" { send "uptime\r"; interact }  

  76. }  

  77.   

  78. ## $argc 表明参数个数 , $argv0 表明脚本名 , $argv 0 表明第一个参数 ...  

  79.    若是传递参数不足 3 个 , 那么屏幕显示 usage 脚本名 user host passwd , 因此执行脚本时应: ./login.exp1 root 192.168.1.81 123456  

  80.    参数不足 3 个则退出脚本  

  81.    set 将第一个参数赋值给变量 user ...( 变量存储从 0 开始计算 1 2 3 ... n )  

相关文章
相关标签/搜索