大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新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
脚本介绍:
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账号...