expect用法介绍

expect用法介绍一、概念Expect是一个用来实现自动交互功能的软件套件。执行shell脚本,需要从终端得到输入时(如sshroot@192.168.1.2),Expect可以根据提示,模拟标准输入来实现交互脚本执行,使其以非交互的方式执行可以把shell和expect理解为两种不同的脚本语言,expect有独自的语法、变量二、ssh远程主机的方式2.1.简单方式,直接使用expect命令#!/bin/bash#登陆远程主机并查看主机名IP=”192.168.1.2″USERNAME=”root”P

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全家桶1年46,售后保障稳定

一、概念

Expect是UNIX系统中用来实现自动化控制和测试的软件工具,作为Tcl脚本语言的一个扩展应用在交互式软件中,如Telnet、FTP、SSH等。

执行shell脚本,需要从终端得到输入时(如ssh root@192.168.1.2),Expect可以根据提示,模拟标准输入来实现交互脚本执行

可以把shell和expect理解为两种不同的脚本语言,expect有独自的语法、变量

二、ssh远程主机的方式

2.1.简单方式,直接使用expect命令

#!/bin/bash
#登陆远程主机并查看主机名

IP="192.168.1.2"
USERNAME="root"
PWD="123456"

expect << EOF set timeout 6 spawn ssh ${USERNAME}@${IP} -o "StrictHostKeyChecking no" expect "password:" {send "${ 
    PWD}\r"} expect "#" {send "hostname\r"} expect "#" {send "exit\r"} EOF

Jetbrains全家桶1年46,售后保障稳定

脚本介绍:

expect << EOF ....... EOF					#表示里面的内容均由expect命令去执行
set timeout 6		#设置超时时间为6秒,下面的代码需在6秒钟内完成,如果超过,则退出。用来防止ssh远程主机网络不可达时卡住及在远程主机执行命令宕住
spawn				#激活一个交互式会话,在系统中创建一个进程
ssh ${USERNAME}@${IP} 			#ssh登陆远程主机
-o "StrictHostKeyChecking no"	#不弹出“(yes/no)?”的对话框
expect "password:"				#期望终端出现包含"password:"的字段。如果没有出现,则不执行后面的代码,会卡在此处,达到超时时间退出。
{ 
   send "${ 
    PWD}\r"}		#传递给交互终端的指令,这里是发送密码。\r相当于在终端敲了下回车
{ 
   send "hostname\r"}		#向远程主机发送hostname的指令
{ 
   send "exit\r"}			#最后一个expect不会执行,因此不会发送exit的指令,这里用来标识该expect要退出了

2.2.稍复杂方式,shell脚本调用expect脚本,并传入参数(推荐)

shell脚本

#!/bin/bash

IP="192.168.1.2"
USERNAME="root"
PWD="123456"

/usr/bin/expect -f expect.exp ${IP} ${USERNAME} ${ 
   PWD}

expect脚本expect.exp

#!/usr/bin/expect -f

#位置参数会存入数组$argv,与shell不一样
set IP [lindex $argv 0]
set USERNAME [lindex $argv 1]
set PWD [lindex $argv 2]

set timeout 6
spawn ssh ${USERNAME}@${IP}
expect { 
   
	#如果有yes/no关键字
    "yes/no" { 
   
    	#则输入yes
        send "yes\n"
        #输入yes后如果输出结果有"*assword:"关键字,则输入密码
        expect "*assword:" { 
    send "${ 
    PWD}\n" }
    }
    #如果上次输出结果有"*assword:"关键字,则输入密码
    "*assword:" { 
    send "${ 
    PWD}\n" }
    timeout  { 
      send_error "User 'root' login timeout.\n";  exit 1;  }
}


expect "#"
send "hostname\r"
expect "#"
send "exit\r"
expect eof

相关解释:
[lindex $argv 0]:expect.exp脚本的第一个位置参数,以此类推

set IP [lindex $argv 0]:把第一个位置参数的值赋给变量IP。注意:echo $IP会报错
在这里插入图片描述
这种写法表示,如果终端出现yes,会执行yes里面语句;没有yes会往后面匹配
在这里插入图片描述
如果超时,通过send_error打印错误信息到终端,并退出脚本,退出码为1

expect eof:spawn进程结束后会向expect发送eof,接收到eof代表该进程结束

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/200689.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • 2021IDEA创建JavaWeb项目

    2021IDEA创建JavaWeb项目IntellijIDEA2021.1创建Javaweb项目(超详细)_十九舟的博客-CSDN博客_idea2021创建web项目在此基础上,添加lib

  • 反相加法器与同相加法器对比分析「建议收藏」

    反相加法器与同相加法器对比分析「建议收藏」最近对比复习了模电里面同相加法器与反相加法器电路。分析了他们之间的差别,并将分析过程记录在下,欢迎大家交流讨论。1、反相加法器R为平衡电阻,R=R1//R2//Rf。根据运算放大器的虚短虚断特性

  • HTML中meta标签的作用与使用

    HTML中meta标签的作用与使用META标签用来描述一个HTML网页文档的属性META标签可分为两大部分:HTTP-EQUIV和NAME变量。HTTP实例HTML代码实例中有一项内容是&lt;metahttp-equiv="Content-Type"content="text/html;charset=gb2312"&gt;其作用是指定了当前文档所使用的字符编码为gb2312,也就是中文简体字符。根据这一行代码,浏览器就可以…

  • 在本地磁盘型云主机做软RAID的实践[通俗易懂]

    在本地磁盘型云主机做软RAID的实践[通俗易懂]在本地磁盘型云主机做软RAID的实践

  • linux读写锁_共享内存读写锁

    linux读写锁_共享内存读写锁一、读写锁是什么?读写锁其实还是一种锁,是给一段临界区代码加锁,但是此加锁是在进行写操作的时候才会互斥,而在进行读的时候是可以共享的进行访问临界区的ps:读写锁本质上是一种自旋锁二、为什么需要读写锁?有时候,在多线程中,有一些公共数据修改的机会比较少,而读的机会却是非常多的,此公共数据的操作基本都是读,如果每次操作都给此段代码加锁,太浪费时间了而且也很浪费资源…

  • vip导致的serverConnection closed by foreign host问题

    vip导致的serverConnection closed by foreign host问题问题描述:应应用需求,设计搭建了一套带tokudb存储引擎的percona数据库,使用的是常见的双主架构。具体的架构如下图所示:在172.20.32.x1上进行验证的时候出现了下面的问题:FHo

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号