网站首页 > 技术文章 正文
概述
我们通过Shell可以实现简单的控制流功能,如:循环、判断等。但是对于需要交互的场合则必须通过人工来干预,有时候我们可能会需要实现和交互程序如telnet服务器等进行交互的功能。而expect就使用来实现这种功能的工具。
expect是一个免费的编程工具语言,用来实现自动和交互式任务进行通信,而无需人的干预。expect是不断发展的,随着时间的流逝,其功能越来越强大,已经成为系统管理员的的一个强大助手。expect需要Tcl编程语言的支持,要在系统上运行expect必须首先安装Tcl。
下面介绍一个通过expect来自动ssh连接的脚本,大家可以思考下里面实现的逻辑。
expect基础
在使用expect时,基本上都是和以下四个命令打交道:
- send命令接收一个字符串参数,并将该参数发送到进程。
- expect命令和send命令相反,expect通常用来等待一个进程的反馈,我们根据进程的反馈,再发送对应的交互命令。
- spawn命令用来启动新的进程,spawn后的send和expect命令都是和使用spawn打开的进程进行交互。
- interact命令用的其实不是很多,一般情况下使用spawn、send和expect命令就可以很好的完成我们的任务;但在一些特殊场合下还是需要使用interact命令的,interact命令主要用于退出自动化,进入人工交互。比如我们使用spawn、send和expect命令完成了ftp登陆主机,执行下载文件任务,但是我们希望在文件下载结束以后,仍然可以停留在ftp命令行状态,以便手动的执行后续命令,此时使用interact命令就可以很好的完成这个任务。
需求:自动连接
执行:/mnt/auto_connect.exp IP password 时 密码正确,则通过 ssh 连接到该 IP 主机,并保持登陆。
1.脚本内容:
# vim auto_connect.sh #!/bin/bash /usr/bin/expect << EOF //切换到expect环境 spawn ssh root@$1 //ssh连接IP expect { "yes/no" { send "yes\r";exp_continue } //确认连接 "password" { send "$2\r" } //输入密码 } Interact //保留 EOF //退出
2.执行:
# chmod +x auto_connect.sh //添加可执行权限 # sh auto_connect.sh 172.25.254.226 redhat //添加IP和密码 spawn ssh root@172.25.254.226 The authenticity of host '172.25.254.226 (172.25.254.226)' can't be established. ECDSA key fingerprint is eb:24:0e:07:96:26:b1:04:c2:37:0c:78:2d:bc:b0:08. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added '172.25.254.226' (ECDSA) to the list of known hosts.
如果大家能够在工作中熟练的使用Shell脚本就可以很大程度的提高工作效率,再搭配上expect,那么很多工作都可以自动化进行,对工作的展开如虎添翼。如果你会Python的话,你的视野将会更加开阔,那个时候你又会“嫌弃”expect了。
后面小编会分享更多Linux方面内容,感兴趣的朋友走一波关注哩~
猜你喜欢
- 2024-09-29 手帐中的“TO DO LIST”,帮你做好每日管理
- 2024-09-29 SwiftUI入门 - 7.todo页面-List循环数组
- 2024-09-29 TO DO LIST(TODOLiST是什么意思)
- 2024-09-29 工作中使用任务清单(To Do List)的4个益处
- 2024-09-29 China’s Leading Chipmaker AMEC Says its Inclusion onto CMC List Unreasonable
- 2024-09-29 春日To-Do List:去看一场有形有声的展览
- 2024-09-29 iOS限免App精选:Sure - 会定位可加密的To-Do(¥6→0)
- 2024-09-29 安卓待办清单,任务管理工具:To-do-List v1.01.99.0705 高级版
- 2024-09-29 实测:微软出的免费待办 App,到底有多智能?
- 2024-09-29 写下来更易于执行!to do list!(写下来更易于执行!to+do+list!如何解决)
- 最近发表
- 标签列表
-
- cmd/c (57)
- c++中::是什么意思 (57)
- sqlset (59)
- ps可以打开pdf格式吗 (58)
- phprequire_once (61)
- localstorage.removeitem (74)
- routermode (59)
- vector线程安全吗 (70)
- & (66)
- java (73)
- org.redisson (64)
- log.warn (60)
- cannotinstantiatethetype (62)
- js数组插入 (83)
- resttemplateokhttp (59)
- gormwherein (64)
- linux删除一个文件夹 (65)
- mac安装java (72)
- reader.onload (61)
- outofmemoryerror是什么意思 (64)
- flask文件上传 (63)
- eacces (67)
- 查看mysql是否启动 (70)
- java是值传递还是引用传递 (58)
- 无效的列索引 (74)