简介:

Expect 可以替系统管理员完成与系统的交互式操作

shell > yum -y install expect # 可以通过 yum 安装

shell > which expect # 路径
/usr/bin/expect

例一:

shell > cat login.exp
#!/usr/bin/expect spawn ssh root@192.168.1.81;
expect {
"(yes/no)?" { send "yes\r"; exp_continue }
"password:" { send "123456\r"; exp_continue }
"#" { send "uptime\r"; interact }
}

## 使用 /usr/bin/expect 来解释脚本 , spawn 开启一个 ssh 进程 , expect 用来接收信息 , send 用来发送信息
"(yes/no)?" 当第一次登陆远程主机时会提示 yes/no , 匹配到信息时 send 发送 "yes\r" , \r 为换行 , exp_continue 为继续匹配下一条
"#" 由于是 root 用户登陆 , 那么匹配到正确的密码后会得到超级用户的标志 # 号 , 然后就可以 send 发送系统命令了 uptime
interact 指令意为:保持交互状态 , 将控制权交给控制台 , 也就是说刚登陆到远程主机 , 现在不会退出 , 且管理员可以操作主机

例二:

shell > cat login.exp

#!/usr/bin/expect
set timeout -;
spawn ssh root@192.168.1.81;
expect {
"(yes/no)?" { send "yes\r"; exp_continue }
"password:" { send "123456\r"; exp_continue }
"#" { send "uptime\rexit\r"; expect eof }
}

## set timeout -1 : 设置超时时间 , -1 为无穷大、可以指定例如 20 (单位为秒)
expect eof : 等待进程结束 (不保持交互状态), 当执行命令中没有明确指定退出登陆(exit\r)时 , expect eof 会等到超时时间过后自
动退出远程系统(timeout 设为 -1 时 , 不会退出 ) , 如果明确指定 exit\r (即上面例子)时 , 则执行完命令立即退出远程登陆系统

例三:

shell > cat login.sh

#!/bin/bash
list=("192.168.1.81 root 123456" "192.168.1.82 root 123456" "192.168.1.83 root 123456")
length=${#list[@]} for ((i=;i<$length;i++))
{
host=`echo ${list[$i]} | awk '{print $1}'`
user=`echo ${list[$i]} | awk '{print $2}'`
passwd=`echo ${list[$i]} | awk '{print $3}'` expect -c "
spawn ssh $user@$host;
expect {
\"(yes/no)?\" { send \"yes\r\"; exp_continue }
\"password:\" { send \"$passwd\r\"; exp_continue }
\"#\" { send \"uptime\rexit\r\"; expect eof }
}
"
}

## expect -c 从命令行执行 expect 脚本 现在可以实现循环登陆服务器执行命令后退出远程系统
将 exit\r 去掉 , 并且 expect eof 改为 interact 可以实现停留在远程服务器(只限一台服务器 , 如过多台的话第一台停留就不会循环了)

例四:

shell > cat login.exp1

#!/usr/bin/expect
if { $argc != } {
puts "usage $argv0 user host passwd"
exit
} set user [lindex $argv ]
set host [lindex $argv ]
set passwd [lindex $argv ] spawn ssh $user@$host;
expect {
"(yes/no)?" { send "yes\r"; exp_continue }
"password:" { send "$passwd\r"; exp_continue }
"#" { send "uptime\r"; interact }
}

## $argc 代表参数个数 , $argv0 代表脚本名 , $argv 0 代表第一个参数 ...
如果传递参数不足 3 个 , 那么屏幕显示 usage 脚本名 user host passwd , 所以执行脚本时应: ./login.exp1 root 192.168.1.81 123456
参数不足 3 个则退出脚本
set 将第一个参数赋值给变量 user ...( 变量存储从 0 开始计算 1 2 3 ... n )

Expect 小脚本的更多相关文章

  1. 第一个Mac shell 小脚本

    大多数程序员都喜欢偷懒的,我也不例外.相信好多Android开发的coder 在网络http请求方面,会浪费很多时间在接口调试这里..有时候,自己写了一个小测试,行还好,不行的话,还要跟写后台的哥们一 ...

  2. 写了一个常规性生成merge 的小脚本

    现在使用数据库来写存储过程,动不动参数就会用到xml ,当然罗,优势也很明显,参数相对固定,而且灵活,如果要修改或者什么的,中间接口层也不需要做变化,只需要修改封装的存储过程以及程序传参就ok了. 随 ...

  3. 周末娱乐一下--------恶搞windows小脚本

    下面这是个循环DOS命令,使用了C中的goto语句 echo命令式输出命令 set命令是设置命令 var是变量,初始为0 :continue是一个用于goto的标示. %var%输出变量名,%var% ...

  4. 用Python实现一个爬取XX大学电费通知的小脚本

    内容简要 1分析网站 2简单爬取 3进阶自定义爬取 4保存进数据库 学校基础设施太差,宿舍电量过低提醒虽然贴在楼下,但是作为低头一族,经常忘记看提醒导致宿舍酣战时突然黑屏,为了避免这种尴尬的场景以及强 ...

  5. 分享一个刷网页PV的python小脚本

    下面分享一个小脚本,用来刷网页PV. [root@huanqiu ~]# cat www.py #!/usr/bin/python# coding: UTF-8import webbrowser as ...

  6. 自动FTP的小脚本

    自动FTP的小脚本 使用以下脚本,可以实现自动FTP,将你需要的文件传送到需要的地方,或者将需要的文件从某个地方抓取下来. cd /PATH_YOU_WANT_TO_UPLOAD(DOWNLOAD) ...

  7. pyhton 查找一个数的所有因子 以及 判断一个数是否是质数 两个小脚本

    最近看到一个网站, 欧拉计划.挺好玩,都是一些算法题.这是本站:http://projecteuler.net/problems 这个是中文站:http://pe.spiritzhang.com/ 下 ...

  8. Unity 屏幕适配小脚本

    屏幕适配是可以通过代码实现的,相信给你时间就一定能写出来. 我们公司貌似没有分辨率适配框架通常对应小屏幕的苹果4要额外设置下等等就完了! 屏幕适配框架实现思路:  通过代码获取当前的分辨率 –> ...

  9. 初步学习nodejs,业余用node写个一个自动创建目录和文件的小脚本,希望对需要的人有所帮助

    初步学习nodejs,业余用node写个一个自动创建目录和文件的小脚本,希望对需要的人有所帮助,如果有bug或者更好的优化方案,也请批评与指正,谢谢,代码如下: var fs = require('f ...

随机推荐

  1. 何时使用padding和margin

    先看看这张图: 重点其实是background-image CSS边距属性定义元素周围的空间.通过使用单独的属性,可以对上.右.下.左的外边距进行设置.也可以使用简写的外边距属性同时改变所有的外边距. ...

  2. BZOJ4292 PA2015 Równanie 【暴力水题】

    BZOJ4292 PA2015 Równanie Description 对于一个正整数n,定义f(n)为它十进制下每一位数字的平方的和.现在给定三个正整数k,a,b,请求出满足a<=n< ...

  3. json对象和json字符串相互转换

    1.将JSON字符串转换为JSON对象 var data = JSON.parse(str); // JSON.parse();方法 console.log(data.name); 2.将JSON对象 ...

  4. [BZOJ3197][SDOI2013]刺客信条assassin

    bzoj luogu Description 故事发生在1486 年的意大利,Ezio原本只是一个文艺复兴时期的贵族,后来因为家族成员受到圣殿骑士的杀害,决心成为一名刺客.最终,凭借着他的努力和出众的 ...

  5. linux 磁盘挂载操作

    1. fdisk  -l      查看磁盘   2. fisk  /dev/vdb   进行分区        依次输入  n  p  1   两次回车  wq   3. fdisk -l  查看分 ...

  6. Java 实现 RSA 非对称加密

    非对称加密算法:用两个密钥(公钥/私钥)对数据进行加密和解密. 一.原理 非对称加密算法实现机密信息交换的基本过程是: 1)甲方生成一对密钥并将其中的一把作为公用密钥向其它方公开; 2)得到该公用密钥 ...

  7. 【Leetcode 338】 Counting Bits

    问题描述:给出一个非负整数num,对[0, num]范围内每个数都计算它的二进制表示中1的个数 Example:For num = 5 you should return [0,1,1,2,1,2] ...

  8. php端安装rabbitmq-c

    php端安装rabbitmq-c url:https://github.com/alanxz/rabbitmq-c cd rabbitmq-c**** ./configure --prefix=/us ...

  9. 【转】Jmeter使用之常用函数介绍

    "_csvRead"函数 csvRead函数是从外部读取参数,csvRead函数可以从一个文件中读取多个参数. 下面具体讲一下如何使用csvread函数: 1.新建一个csv或者t ...

  10. mysql分区表之二:MySQL的表的四种分区类型介绍

    一.什么是表分区 通俗地讲表分区是将一大表,根据条件分割成若干个小表.mysql5.1开始支持数据表分区了.如:某用户表的记录超过了600万条,那么就可以根据入库日期将表分区,也可以根据所在地将表分区 ...