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

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

 

四、总结

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

 

 

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

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

 

时间: 2024-09-16 12:56:06

两种Linux下非交互式命令的实现的相关文章

Linux下非交互式远程执行命令脚本

  Linux下非交互式远程执行命令脚本(比ssh更好的方式) openssh在每台机器上都有,ssh与scp经常出现在我们的生活中. 然而当要管理的机器规模越来越大时,ssh登陆到目标机器进行管理就变得不现实了. 虽然可以直接在ssh后面接命令的方式,进行命令的执行. 但是ssh的严格的权限认证使得我们不得不输入密码,或是建立信任关系,很难去自定义一个特定的认证方式. 基于ssh的这种不足.于是笔者就写了一个jetfire,这个工具.比ssh多的一个重要的功能就是可以自定义认证方式,顺便避免了

Linux下非交互式sshpass登录

摘要 在命令行 非交互的SSH登录的时候,一般我们可以借助于生成用户的公钥私钥对,然后把公钥添加到远程主机的authorized_keys文件,可以实现非交互无密码登录. 其实这里也可以有另外一种方式实现,即用sshpass命令. 这种情况比较适合Mac下用iterm2 SSH登录到远程主机的时候,长时间不操作导致 packet_write_wait: Connection to 192.168.xxx.xxx port 22: Broken pipe问题的解决办法 安装sshpass #!/u

4个Linux下最好的命令行下载管理器/加速器

我们经常由于不同需求使用下载管理器从互联网下载文件,它给我和其他人提供了很多帮助.我们都想要一个超级快速的下载管理器来完成下载尽可能多的任务,以便我们可以节省时间来进一步地工作.有很多可以加速下载的下载管理器和加速器可用(图形化界面和命令行界面). 所有的下载工具做着同样的任务,但它们的处理方式和功能是不同的,比如,单线程和多线程.交互和非交互. 在这里,我们将列出 4 个最好的我们日常工作使用的命令行下载加速器. #1 Aria2 Aria2 是一个用于 Linux.Windows 和 Mac

怎么样称得上是Linux下优秀的命令行计算器

怎么样称得上是Linux下优秀的命令行计算器 每个现代的Linux桌面发行版都预装着一个带有图形界面的计算器程序.不过如果你的工作区中全是命令行窗口,那么你一定会在其中的一个命令行窗口中处理一些数字相关的问题.或许你在寻找一款基于命令行的计算器程序.如果是这样的话,GNU bc("basic calculator"的缩写)会是你不二的选择.当然Linux下有很多基于命令行的计算器应用,我认为GNU bc是功能最强大和最有用的. 在GNU时代之前,bc实际上是一个著名的精密计算语言.它的

linux 下的yum命令详解_Linux

yum(全称为 Yellow dog Updater, Modified)是一个在Fedora和RedHat以及SUSE中的Shell前端软件包管理器.基於RPM包管理,能够从指定的服务器自动下载RPM包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软体包,无须繁琐地一次次下载.安装.yum提供了查找.安装.删除某一个.一组甚至全部软件包的命令,而且命令简洁而又好记. yum的命令形式一般是如下:yum [options] [command] [package ...] 其中的[opt

linux下执行shell命令方法简介_linux shell

linux下执行shell命令有两种方法  在当前shell中执行shell命令 在当前shell中产生一个subshell,在subshell中执行shell命令  1.在当前shell中执行shell命令 主要就是在命令行中通过交互方式方式直接输入shell命令,命令行直接执行给出结果.比如这样: 2.在当前shell中产生一个subshell,在subshell中执行shell命令 比如我们把shell写成shell脚本的方式来运行,这个时候会先启动一个subshell来代替当前的shel

简单介绍一下Linux下的FTP命令

&http://www.aliyun.com/zixun/aggregation/37954.html">nbsp;   我是用虚拟机装了Linux,真实系统是Windows XP,在Windows XP下用Serv-u软件架设了FTP服务器,然后我们就可以在虚拟机的Linux下登录该FTP服务器下载或上传文件了,不同的仅是在Linux下是在命令行里输入相关FTP命令来完成的,应该也有像FlashFXP.CuteFTP这一类的Linux专用软件,不过我孤陋寡闻,不了解,也就不误人子

Linux下通过script 命令记录(数据库)操作步骤

对DBA而言,经常碰到升级数据库或是apply patch,以及有些时候需要运行大量的脚本.对于这些操作我们希望现在在屏幕同时又输出的文件以备后续查询过程中曾经丢失的步骤或错误.Linux下的script命令就是解决这个问题的好帮手   1.script命令描述   复制代码 代码如下: script命令会记录所有的操作到文件同时在屏幕上输出,直到终止登陆的会话,或使用CRTL+D,或使用exit退出则停止记录. 这个命令对于数据库的升级或是重要设置的情形下使用可以用于后续查询操作成功或失败.

如何通过c语言实现Linux下的top命令来获取cpu利用率?

问题描述 如何通过c语言实现Linux下的top命令来获取cpu利用率? 如何通过c语言实现Linux下的top命令来获取cpu利用率?我下载了好几个版本的procps但是在Ubuntu下编译里面的top.c时都出错,求各位大神帮忙解答. 解决方案 linux下用top命令查看cpu利用率超过100%linux下用top命令查看cpu利用率超过100%LINUX下查看CPU使用率的 top 命令 解决方案二: #include <stdio.h>#include <unistd.h>