【转】使用expect实现shell自动交互
原文地址:http://www.nginx.cn/1934.html
shell脚本需要交互的地方可以使用here文档是实现,但是有些命令却需要用户手动去就交互如passwd、scp
对自动部署免去用户交互很痛苦,expect能很好的解决这类问题。
expect的核心是spawn expect send set
spawn 调用要执行的命令
expect 等待命令提示信息的出现,也就是捕捉用户输入的提示:
send 发送需要交互的值,替代了用户手动输入内容
set 设置变量值
interact 执行完成后保持交互状态,把控制权交给控制台,这个时候就可以手工操作了。如果没有这一句登录完成后会退出,而不是留在远程终端上。
expect eof 这个一定要加,与spawn对应表示捕获终端输出信息终止,类似于if....endif
expect脚本必须以interact或expect eof结束,执行自动化任务通常expect eof就够了。
设置expect永不超时
set timeout -1
设置expect 300秒超时,如果超过300没有expect内容出现,则推出
set timeout 300
expect编写语法,expect使用的是tcl语法。
一条Tcl命令由空格分割的单词组成. 其中, 第一个单词是命令名称, 其余的是命令参数
cmd arg arg arg
$符号代表变量的值. 在本例中, 变量名称是foo.
$foo
方括号执行了一个嵌套命令. 例如, 如果你想传递一个命令的结果作为另外一个命令的参数, 那么你使用这个符号
[cmd arg]
双引号把词组标记为命令的一个参数. "$"符号和方括号在双引号内仍被解释
"some stuff"
大括号也把词组标记为命令的一个参数. 但是, 其他符号在大括号内不被解释
{some stuff}
反斜线符号是用来引用特殊符号. 例如:n 代表换行. 反斜线符号也被用来关闭"$"符号, 引号,方括号和大括号的特殊含义
expect使用实例
1。首先确认expect的包要安置。
#rpm -qa | grep expect
如果没有则需要下载安装,
#yum install expect
2.安装完成后,查看expect的路径,可以用
#which expect
/usr/bin/expect
3.编辑脚本
#vi autosu.sh
添加如下内容
#!/usr/bin/expect -f //这个expect的路径就是用which expect 查看的结果 spawn su - nginx //切换用户
expect "password:" //提示让输入密码
send "testr" //输入nginx的密码
interact //操作完成
4.确定脚本有可执行权限
chmod +x autosu.sh
5.执行脚本 expect autosu.sh 或 ./autosu.sh
expect常用脚本
登陆到远程服务器
#!/usr/bin/expect
set timeout 5
set server [lindex $argv 0]
set user [lindex $argv 1]
set passwd [lindex $argv 2] spawn ssh -l $user $server
expect {
"(yes/no)" { send "yesr"; exp_continue }
"password:" { send "$passwdr" }
}
expect "*Last login*" interact
scp拷贝文件
#!/usr/bin/expect
set timeout 10
set host [lindex $argv 0] //第1个参数,其它2,3,4参数类似
set username [lindex $argv 1]
set password [lindex $argv 2]
set src_file [lindex $argv 3]
set dest_file [lindex $argv 4]
spawn scp $src_file $username@$host:$dest_file
expect {
"(yes/no)?"
{
send "yesn"
expect "*assword:" { send "$passwordn"}
}
"*assword:"
{
send "$passwordn"
}
}
expect "100%"
expect eof
使用方法
./expect_scp 192.168.75.130 root 123456 /root/src_file /root/dest_file
以上的命令执行后,将把本地/root目录下的src_file文件拷贝到用户名为root,密码为123456的主机192.168.75.130中的/root下,同时还将这个源文件重命名为dest_file
一样例:
自动建立ssh信任脚本
在工作中经常遇到给两台主机建立ssh信任,手动建立太费事了,索性胡乱写了个脚本ssh_trust.sh来自动建立信任:
- #!/bin/bash
- src_host=$1
- src_username=$2
- src_passwd=$3
- dst_host=$4
- dst_username=$5
- dst_passwd=$6
- #在远程主机1上生成公私钥对
- Keygen()
- {
- expect << EOF
- spawn ssh $src_username@$src_host ssh-keygen -t rsa
- while 1 {
- expect {
- "password:" {
- send "$src_passwd\n"
- }
- "yes/no*" {
- send "yes\n"
- }
- "Enter file in which to save the key*" {
- send "\n"
- }
- "Enter passphrase*" {
- send "\n"
- }
- "Enter same passphrase again:" {
- send "\n"
- }
- "Overwrite (y/n)" {
- send "n\n"
- }
- eof {
- exit
- }
- }
- }
- EOF
- }
- #从远程主机1获取公钥保存到本地
- Get_pub()
- {
- expect << EOF
- spawn scp $src_username@$src_host:~/.ssh/id_rsa.pub /tmp
- expect {
- "password:" {
- send "$src_passwd\n";exp_continue
- }
- "yes/no*" {
- send "yes\n";exp_continue
- }
- eof {
- exit
- }
- }
- EOF
- }
- #将公钥的内容附加到远程主机2的authorized_keys
- Put_pub()
- {
- src_pub="$(cat /tmp/id_rsa.pub)"
- expect << EOF
- spawn ssh $dst_username@$dst_host "chmod 700 ~/.ssh;echo $src_pub >> ~/.ssh/authorized_keys;chmod 600 ~/.ssh/authorized_ke
- ys"
- expect {
- "password:" {
- send "$dst_passwd\n";exp_continue
- }
- "yes/no*" {
- send "yes\n";exp_continue
- }
- eof {
- exit
- }
- }
- EOF
- }
- Keygen
- Get_pub
- Put_pub
复制代码
脚本主要由3个expect组成,比较简单,用法是
- ./ssh_trust.sh host1 user1 passwd1 host2 user2 passwd2
复制代码
即建立从user1@host1到user2@host2的ssh信任。
说明:
1、当然得安装expect
2、脚本放在第三方机器(能远程登录host1和host2)上运行即可,当然放在host1和host2上运行也行。
3、如果想批量建立信任,可以编辑一个文件夹file如:
- host1 user1 passwd1 host2 user2 passwd2
- host3 user3 passwd3 host4 user4 passwd4
- host5 user5 passwd5 host6 user6 passwd6
复制代码
使用下面命令执行脚本即可:
- xargs -n6 ./ssh_trust.sh < file
复制代码
4、仓促写的,脚本只是简单实现功能,使用前确保参数的可用性(用户密码主机名),不然很容易报错
5、只在linux redhat上测试过,运行成功,欢迎大家提意见~~
【转】使用expect实现shell自动交互的更多相关文章
- 使用expect实现shell自动交互
expect 是一个自动交互功能的工具.expect 是开了一个子进程,通过 spawn 来执行 shell 脚本,监测到脚本的返回结果,通过 expect 判断要进行的交互输入内容. expect ...
- [转载]使用expect实现shell自动交互
FROM:http://www.nginx.cn/1934.html shell脚本需要交互的地方可以使用here文档是实现,但是有些命令却需要用户手动去就交互如passwd.scp 对自动部署免去用 ...
- shell自动交互之expect脚本_转
转自:linux expect详解(ssh自动登录) shell脚本实现ssh自动登录远程服务器示例: #!/usr/bin/expect spawn ssh root@192.168.22.194 ...
- Linux Shell自动交互/人机交互的三种方法
如果你要学习linux,你可能会遇到Linux Shell自动交互问题,这里将介绍Linux Shell自动交互的解决方法,在这里拿出来和大家分享一下. 一.背景 shell脚本在处理自动循环或大的任 ...
- 3种shell自动交互的方法【转】
一.背景 shell脚本在处理自动循环或大的任务方面可节省大量的时间,通过创建一个处理任务的命令清单,使用变量.条件.算术和循环等方法快速创建脚本以完成相应工作,这比在命令行下一个个敲入命令要省时省力 ...
- Linux Shell 自动交互功能
需求背景: 近日,在安装某软件过程,发现在安装过程需要输入一些信息才能继续下一步操作,在机器数量较少情况下,我们可以单台登录上去完成安装操作,但当机器数量超过一定时,如果再手动登录操作,就会产生大 ...
- [转]expect实现ssh自动交互
shell脚本实现ssh自动登录远程服务器示例: #!/usr/bin/expect spawn ssh root@192.168.22.194 expect "*password:&quo ...
- 使用expect实现自动交互,shell命令行自动输入,脚本自动化,变量引用,expect spawn执行带引号命令,expect 变量为空,不生效,不能匹配通配符*,函数,数组
背景 有需求,在允许命令或者脚本跳出交互行,需要进行内容输入,但需要人手动输入,不是很方便,此时可以通过expect来实现自动互动交互. expect是一个自动交互功能的工具,可以满足代替我们实际工作 ...
- 使用expect实现自动交互,shell命令行自动输入
背景 有需求,在允许命令或者脚本跳出交互行,需要进行内容输入,但需要人手动输入,不是很方便,此时可以通过expect来实现自动互动交互. expect是一个自动交互功能的工具,可以满足代替我们实际工作 ...
随机推荐
- Flask-mail 发邮件慢(即使异步)
Flask-mail 发邮件慢(即使异步) 一开始,按照狗书上的代码异步发邮件,但是发现原本响应只需要150ms的页面加了邮件发送就变成了5s响应(这怕不是假异步) 狗书的异步发邮件代码: def s ...
- Python and Bluetooth
环境 Windows7-64bit + Python2.7.15-64bit + Pybluez 安装pybluez时会报错,处理方法~ 1.安装VCForPython27.msi,这是为了提供vis ...
- SpringMVC初写(四)上传和下载功能的实现
一.文件上传 流程: 导入包commons-fileuplad组件和依赖包commons-io组件 配置springmvc支持上传的组件: 启动SpringMVC注解支持 配置上传解释器 构建一个上传 ...
- Highcharts图表.net版开源,支持webform 和 mvc3,完全开源
Highcharts是一个制作图表的纯Javascript类库,主要特性如下: 兼容性:兼容当今所有的浏览器,包括iPhone.IE和火狐等等: 对个人用户完全免费: 纯JS,无BS: 支持大部分的图 ...
- 【Kafka】Producer配置
名称 描述 类型 默认值 bootstrap.servers kafka集群地址,ip+端口,以逗号隔开.不管这边配置的是什么服务器,客户端会使用所有的服务器.配置的列表只会影响初始发现所有主机.配置 ...
- vuex requires a Promise polyfill in this browser
ie 浏览器访问 vue 项目(使用的vuex 状态管理组件)报错:vuex requires a Promise polyfill in this browser 处理办法: 1.npm insta ...
- 性能调优-CPU方面,内存方面
CPU调优 首先要清楚数据库应用的分类,一般分为两类:OLTP(Online Transaction Processing,在线事务处理)和OLAP(Online Analytical Process ...
- [中英对照]vmlinuz Definition | vmlinuz的定义
vmlinuz Definition | vmlinuz的定义 vmlinuz is the name of the Linux kernel executable.vmlinuz是Linux内核可执 ...
- CodeForces 1060 B Maximum Sum of Digits
Maximum Sum of Digits You are given a positive integer n. Let S(x)S(x) be sum of digits in base 10 r ...
- ORACLE: private ,dao中util执行规范,nextval计数把通过nextval插入但已删除的列也统计在内向后计数
private DAO中的util.rs.sql都应该为private. 其中每个具体方法执行增删改查操作前打开数据库连接,操作完成后关闭数据库连接.操作要规范,不然易出错. nextval seq_ ...