云服务器

使用paramiko控制交换机

2019-12-05 11:47:01 142

简介

paramiko是用python语言写的一个模块,遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接。

由于使用的是python这样的能够跨平台运行的语言,所以所有python支持的平台,如Linux, Solaris, BSD, MacOS X, Windows等,paramiko都可以支持。因此,如果需要使用SSH从一个平台连接到另外一个平台,进行一系列的操作时,paramiko是最佳工具之一。

此外,由于常见的交换机都支持ssh,那么使用paramiko控制交换机变成现实。


安装

pip 安装方式
pip install paramiko
如果没有安装pycrypto,则需要先安装pycrypto库


使用

paramiko提供了多种连接方式,在此我们使用ssh的方式连接交换机并发送命令以实现控制交换机的目的。


控制方式

通常有两种控制方式,使用SSHClient和使用terminal,这两种的差别分别为:
(1)使用SSHClient发送命令后,ssh通道自动关闭
(2)使用terminal发送命令后,ssh通道不会自动关闭


常规的控制流程


# 创建SSH对象# 连接服务器# 发送执行命令# 获取命令的返回结果# 关闭连接

SSHClient使用流程


# 创建SSH对象ssh = paramiko.SSHClient()# 允许连接不在know_hosts文件中的主机ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())# 连接服务器ssh.connect(hostname='xxx', port=22, username='yyy', password='zzz')# 执行命令stdin, stdout, stderr = ssh.exec_command('dis cu')# 获取命令结果result = stdout.read()# 关闭连接ssh.close()

注意:获取exec_command返回的数据,可以一次性获取全部

terminal使用流程


# 创建SSH对象ssh = paramiko.SSHClient()# 允许连接不在know_hosts文件中的主机ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())# 连接服务器ssh.connect(hostname='xxx', port=22, username='yyy', password='zzz')# 激活terminalch = ssh.invoke_shell()# 执行命令ch.send(cmd)# 获取命令结果result = ch.recv(100000).decode()# 关闭连接ssh.close()

注意:获取从terminal的返回数据,只能通过recv指定接收的数据量,遇到数据量大的时候,可以采用循环接收的方式.同时加入超时的判断,让程序的逻辑更为完善,代码如下:

def ssh_cmd(conn,cmd,timeout):    result = ""    if conn != None:        conn.send(cmd)        time1 = time.time()        while(1):            result = result + conn.recv(100000).decode()            time.sleep(0.01)            time2 = time.time()            if(time2 - time1 > timeout):                break    return result

当然,你可以加入结束符的控制,遇到接收的字符串中有特定的结束符,则跳出接收循环即可。

注意点

对交换机的控制,如果一个逻辑中包含了一个操作,则直接使用SSHClient控制即可;但事实上,对交换机的操作往往是需要执行一系列的命令,如果还是使用SSHClient就会显得力不从心,虽然SSHClient可以一次性发送多条命令,但同时发送命令会导致有些命令会执行不成功。因此,使用terminal发送命令,更为适合,控制起来也会更方便。

ssh= paramiko.SSHClient()ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())ssh.connect(hostname='xxx', port=22, username='yyy', password='zzz')ch = ssh.invoke_shell()ssh_cmd(ch,"system-view",1)ssh_cmd(ch,"sysname swtestname",1)ssh.close()




睿江云官网链接:https://www.eflycloud.com/home?from=RJ0032

上一篇: 无

微信关注

获取更多技术咨询