shell实现交互式在多台服务器批量执行命令

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了shell实现交互式在多台服务器批量执行命令相关的知识,希望对你有一定的参考价值。

参考技术A expect是一个自动化交互套件,主要应用于执行命令和程序时,系统以交互形式要求输入指定字符串,实现交互通信。

注:这里的ip.txt文件存储服务器ip

注:执行方式:*.sh command

3.此脚本目的是实现将目标服务器切换为root用户并启动程序自身启动脚本

4.将上一个脚本发送到指定服务器并执行

paramiko实现SSH交互式命令执行

参考技术A

需要批量在路由器上进行配置,与网元建立SSH连接,同时存在交互操作。比如:键入 Configure ,进入配置模式成功后才可以键入后续指令。

在这个过程中遇到很多坑,在此分享。

SSHClient是最简单的命令行执行方式,简单的参数填写,优雅的结果处理,这很难不让人赶紧上手一试。

但遗憾的是 SSHClient不支持交互式命令执行 ,其原因在于其 exec_command 方法每次执行一条命令都会开启一个新的“channel”,从而开启一个新的session,这相当于我们每执行一次命令,都重新登录了一次网元设备,这使得交互式无从谈起。

所以我们要创建固定channel,从而创建固定session

以上是交互式连接的过程,但事情并不是一帆风顺的,在这个过程中还有两个问题,这两个问题都由交互结果获取函数 channel.recv 引起,这将导致。

以上是 channel.recv 的实现过程,归根结底还是 _ssl_io_loop 这个函数会递归的获取ssh交互结果,形成一种循环。这种循环的结束条件就是接受到交互结果,或者是结果读取异常。

如果我们在执行命令之后立刻获取结果,交互可能尚未产生结果,获取失败,结束循环(接收无效), channel.recv 仿佛没有执行一样。

这时我们就会想到,既然交互结果的获取具有滞后性,那我们就编写逻辑,使其等待或者循环等待。

这就会引发下一个问题,如果我们循环调用 channel.recv 时,必须在获取到交互结果后结束我们的循环,不论这个交互的结果是不是你期望的;否则会进入死循环,程序无法推进。

以上是关于shell实现交互式在多台服务器批量执行命令的主要内容,如果未能解决你的问题,请参考以下文章

shell中怎么批量执行命令。

批量复制及执行命令shell脚本

一次针对多台服务器交互式主机命令采集Python脚本编写

SQLServer用powershell实现多台服务器批量执行SQL脚本

批量远程执行命令

paramiko实现SSH交互式命令执行