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实现交互式在多台服务器批量执行命令的主要内容,如果未能解决你的问题,请参考以下文章