两种Linux下非交互式命令的实现

简介: 一、概述在Linux环境,有多种实现自动化的脚本语言,如Shell、Python、Perl、Tcl等。Shell语言因与Shell外壳结合紧密,是最常见的实现自动化的脚本语言。

一、概述

在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”   {command1exp_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输入该用户的密码。登录成功之后,我们打印“Hello World!”,之后退出ssh,结束expect命令的执行。

expect命令的更详细用法请参考man手册。

 

四、总结

本文简单地介绍了在Linux下,两种使用交互式命令时规避交互来实现自动化的方式,供相关的开发人员参考。

 

 

 -----------------

本人微信公众号:zhouzxi,请扫描以下二维码:

 

目录
相关文章
|
2月前
|
Linux 网络安全 数据安全/隐私保护
Linux 超级强大的十六进制 dump 工具:XXD 命令,我教你应该如何使用!
在 Linux 系统中,xxd 命令是一个强大的十六进制 dump 工具,可以将文件或数据以十六进制和 ASCII 字符形式显示,帮助用户深入了解和分析数据。本文详细介绍了 xxd 命令的基本用法、高级功能及实际应用案例,包括查看文件内容、指定输出格式、写入文件、数据比较、数据提取、数据转换和数据加密解密等。通过掌握这些技巧,用户可以更高效地处理各种数据问题。
242 8
|
1月前
|
Linux Shell
Linux 10 个“who”命令示例
Linux 10 个“who”命令示例
84 14
Linux 10 个“who”命令示例
|
1月前
|
Ubuntu Linux
Linux 各发行版安装 ping 命令指南
如何在不同 Linux 发行版(Ubuntu/Debian、CentOS/RHEL/Fedora、Arch Linux、openSUSE、Alpine Linux)上安装 `ping` 命令,详细列出各发行版的安装步骤和验证方法,帮助系统管理员和网络工程师快速排查网络问题。
161 20
|
27天前
|
Linux
linux查看目录下的文件夹命令,find查找某个目录,但是不包括这个目录本身?
通过本文的介绍,您应该对如何在 Linux 系统中查看目录下的文件夹以及使用 `find` 命令查找特定目录内容并排除该目录本身有了清晰的理解。掌握这些命令和技巧,可以大大提高日常文件管理和查找操作的效率。 在实际应用中,灵活使用这些命令和参数,可以帮助您快速定位和管理文件和目录,满足各种复杂的文件系统操作需求。
79 8
|
1月前
|
网络协议 Linux 应用服务中间件
kali的常用命令汇总Linux
kali的常用命令汇总linux
73 7
|
2月前
|
Linux 数据库
Linux中第一次使用locate命令报错?????
在Linux CentOS7系统中,使用`locate`命令时出现“command not found”错误,原因是缺少`mlocate`包。解决方法是通过`yum install mlocate -y`或`apt-get install mlocate`安装该包,并执行`updatedb`更新数据库以解决后续的“can not stat”错误。
52 9
|
2月前
|
监控 网络协议 Linux
Linux netstat 命令详解
Linux netstat 命令详解
|
2月前
|
运维 监控 网络协议
运维工程师日常工作中最常用的20个Linux命令,涵盖文件操作、目录管理、权限设置、系统监控等方面
本文介绍了运维工程师日常工作中最常用的20个Linux命令,涵盖文件操作、目录管理、权限设置、系统监控等方面,旨在帮助读者提高工作效率。从基本的文件查看与编辑,到高级的网络配置与安全管理,这些命令是运维工作中的必备工具。
226 3
|
2月前
|
存储 运维 Linux
如何在 Linux 系统中使用 envsubst 命令替换环境变量?
`envsubst` 是 Linux 系统中用于替换文本中环境变量值的实用工具。本文分三部分介绍其工作原理、使用方法及实际应用,包括配置文件替换、脚本执行中环境变量替换和动态生成文件等场景,帮助用户高效利用 `envsubst` 进行开发和运维工作。
123 4
|
2月前
|
Linux
在 Linux 系统中,`find` 命令
在 Linux 系统中,`find` 命令
48 1