两种Linux下非交互式命令的实现
一、概述
在Linux环境,有多种实现自己主动化的脚本语言。如Shell、Python、Perl、Tcl等。
Shell语言因与Shell外壳结合紧密,是最常见的实现自己主动化的脚本语言。
同一时候,在Linux环境中存在大量功能单一的小工具——通常它们在指定输入后,马上就可获得输出,比如echo、cat等字符串/文本打印工具。又或者是如sed、awk等最经常使用的字符串编辑工具。通过编写Shell脚本,我们能够重复利用这些小工具来实现一些自己主动化的批处理。
在少数情况下,我们也须要用到一些交互式的工具,比如passwd、fdisk等——这意味着在自己主动化运行的过程中,我们必须停顿下来,满足工具本身的交互式流程。
本文将介绍两种在使用交互式命令时规避交互来实现自己主动化的方式。
二、用分界符控制交互式命令
Shell中的 ‘<<’符号表示一种特殊的重定向,用于向某一个命令传递多行输入。当脚本中出现此符号时。Shell将首先会把紧跟着‘<<’的一个字符串,视为一种特殊的分界符;然后。用户能够输入一连串的数据;最后,用户单独起一行,用还有一个同样的分界符结尾。在两个分界符之间的内容,都被视为命令的输入參数。
我们在实际的软件开发项目中看到最多的就是用cat向一个文件输入一段文本。比如以下的example1.sh脚本中的内容:
cat > example1.sql <<EOFSQL
declare @num int, @sql nvarchar(1000) 
set @sql='select @a=count(*) from tableName ' 
exec sp_executesql @sql,N'@a int output',@num output 
select @num
<<EOFSQL
该脚本的运行结果是生成一个example1.sql文件。内容为两个分界符EOFSQL之间所看到的的内容。
用cat命令向一个文本输入字符串,本身不是交互式的。当使用交互式命令时,分界符便能够控制命令的输入參数,满足不同的控制流的要求。
三、用expect命令控制多个命令
在运行另外一些操作(如ssh登录)时。我们无法用分界符的方法来输入多个命令,由于ssh的输入来源是终端(分界符的输入。应理解为通常意义上的字符串)。这时,我们能够考虑用expect命令。
expect命令是Linux中专门以非交互式方法处理交互式命令的工具。相比分界符来说,它更为强大。且能实现分界符能实现的一切功能。
expect命令的工作原理是在shell中另启一个新进程,而且在此进程中模拟了终端,对输入/输出进行全面监控。而要使用expect命令。则必须须要编写独立的脚本。
expect有相当多的參数和语法。以下我们仅介绍一些基础部分,供大家參考。
1.[#! /usr/bin/expect]
expect脚本的第一行总是用这个语法。这相似于shell脚本的#! /bin/sh。这句话的含义也是定义脚本的解释器。
值得注意的是,依据操作系统的不同,expect命令的位置也可能是在 /usr/local/bin/expect。使用前。用户应确认工具是否存在(确认方法是在root用户下运行“which expect”命令)。
2.[set timeout 30]
设置响应的超时时间,计时单位是秒。设置timeout -1表示永不超时。
3.[spawn ssh -l username ip]
spawn是进入expect环境后才干够运行的expect内部命令。
它基本的功能是给ssh运行进程加个壳,用来传递交互指令。
4.[expect "xxxxx:"]
这里的expect也是一个内部命令。
这个命令的意思是推断上次输出结果里是否包括“xxxxx:”的特定字符串。假设有则马上返回。
expect还有些扩展的使用方法,最常见的例如以下所看到的:
expect {
“xxx1” {command1;exp_continue}
“xxx2” {command 2}
}
以上代码的含义如同C语言的switch语句,不同的条件相似不同的case子句。
而当中的exp_continue就如同不加break语句,程序将继续运行后面的语句。
5.[send "ispass\r"]
这是运行交互动作,即模拟终端进行输入。值得注意的是,命令字符串结尾别忘记加上“\r”。
6.[expect eof]
退出expect解释器 。
以下是一个使用expect命令的实例:
#! /usr/bin/expect -f
set timeout -1
spawn ssh -l zhou 10.10.10.10
expect {
"yes/no" { send "yes\r";exp_continue}
"*assword:" {send "zhou"}
}
expect "*>" {send "echo’HelloWorld!’\r"}
expect "*>" {send"exit\r"}
expect eof
演示样例中。我们通过ssh以用户zhou登录了10.10.10.10,然后向ssh输入该用户的password。
登录成功之后,我们打印“Hello World。”。之后退出ssh,结束expect命令的运行。
expect命令的更具体使用方法请參考man手冊。
四、总结
本文简单地介绍了在Linux下,两种使用交互式命令时规避交互来实现自己主动化的方式。供相关的开发者參考。
-----------------
本人微信公众号:zhouzxi。请扫描以下二维码:
两种Linux下非交互式命令的实现的更多相关文章
- Linux下非root用户如何安装软件
		
Linux下非root用户如何安装软件 从windows转移到Linux的用户最开始总会有各种不适,因为这种不适最终放弃linux的不在少数.对于这类人只能说可惜,还没有领略到linux的美好就过早放 ...
 - linux下安装7z命令及7z命令的使用
		
本文主要介绍了在linux下安装7z命令的方法,同时介绍了7z命令的使用.7z压缩格式拥有众多优点,具有极高的压缩比率,如果你还不了解,请看文章:7z格式.LZMA压缩算法和7-Zip详细介绍. re ...
 - Linux下使用mail命令发送邮件
		
因为需要经常备份网站的数据,所以了解并学习了下linux下如何通过shell来发送邮件,这里以CentOS为例,使用mail命令来进行外部邮件的发送.mail命令的语法如下: Usage: mail ...
 - 在Linux下如何限制命令执行的时间?
		
在Linux下如何限制命令执行的时间?两种解决方法,如下: 1: Linux命令——timeout 运行指定的命令,如果在指定时间后仍在运行,则杀死该进程.用来控制程序运行的时间. 2: comman ...
 - Linux下磁盘管理命令df与du
		
Linux下磁盘管理命令df与du 对磁盘进行查看和控制的两个linux命令,df和du. 一.du命令 首先看一下du的help说明: [root@misdwh opt]# du --help ...
 - Linux下,非Docker启动Elasticsearch 6.3.0,安装ik分词器插件,以及使用Kibana测试Elasticsearch,
		
Linux下,非Docker启动Elasticsearch 6.3.0 查看java版本,需要1.8版本 java -version yum -y install java 创建用户,因为elasti ...
 - [转帖]linux下安装7z命令及7z命令的使用
		
linux下安装7z命令及7z命令的使用 https://www.cnblogs.com/yiwd/p/3649094.html yum install p7zip 执行命令为 7za x 或者是 7 ...
 - [转载]Linux下非root用户如何安装软件
		
[转载]Linux下非root用户如何安装软件 来源:https://tlanyan.me/work-with-linux-without-root-permission/ 这是本人遇到的实际问题,之 ...
 - linux下显示dd命令的进度:
		
linux下显示dd命令的进度: dd if=/dev/zero of=/tmp/zero.img bs=10M count=100000 想要查看上面的dd命令的执行进度,可以使用下面几种方法: 比 ...
 
随机推荐
- APP上线被APPStore拒绝的各种原因
			
1.程序有重大bug,程序不能启动,或者中途退出.2.绕过苹果的付费渠道,我们之前游戏里的用兑换码兑换金币.3.游戏里有实物奖励的话,一定要说清楚,奖励由本公司负责,和苹果没有关系.4.用到苹果的标志 ...
 - GPC:使用GPC计算intersection容易出现的问题
			
在使用GPC计算多边形的交的时候,出现问题 //1.2. 另一种方法,判断新的多边形是否和老多边形相交 Poly cross = (PolyDefault) Clip.intersection ...
 - Windows开启ICMP包回显
 - 安卓app测试之Monkeyrunner
			
一.MonkeyRunner简介 MonkeyRunner提供了系列的API ,MonkeyRunner可以完成模拟事件及截图操作 ,分为以下三类: MonkeyRunner:用来连接设备或模拟器的 ...
 - CAD二次开发控件,dwg控件,网页DWG控件,手机浏览编辑DWG控件
			
梦想绘图插件5.2(MxDraw5.2) 是国内最强,最专业的CAD开发插件(控件),不需要AutoCAD就能独立运行. 控件使用VC 2010开发,具有30万行代码规模,最早从2007年第一个版本完 ...
 - PHP数据乱码
			
本文主要总结下PHP数据乱码的解决方案 要点:多个不同文件系统里一定要统一编码 [注意] (1)HTML编码与MySQL编码一致: (2)PHP编码与MySQL编码一致: (3)header头发送字符 ...
 - luogu P3899 [湖南集训]谈笑风生 线段树合并
			
Code: #include<bits/stdc++.h> #define maxn 300002 #define ll long long using namespace std; vo ...
 - 【转载】dubbo约束的引入(解决eclipse中报错问题)
			
在采用分布式系统架构时,我们会经常使用到阿里巴巴的dubbo的分布式框架. 在相关xml配置了dubbo的约束依赖后,即使能上网eclipse.myeclipse等IDE也是无法识别dubbo的相关约 ...
 - 数组array的常用方法简介
			
数组方法简介 数组总共有22种方法,本文将其分为以下几类来进行详细介绍. 原数组变化:push() pop() shift() unshift() reverse() sort() splice() ...
 - Crossword Answers UVA - 232
			
题目大意 感觉挺水的一道题.找出左面右面不存在或者是黑色的格子的白各,然后编号输出一横向单词和竖向单词(具体看原题) 解析 ①找出各个格子的编号 ②对每个节点搜索一下 ③输出的时候注意最后一个数据后面 ...