HuaWei_Paramiko_Ssh

HuaWei_Paramiko_Ssh

关于Paramiko的基本介绍在这个文档里面:点我跳转

第一版

要求:传递一个命令并取回执行结果

import time

import paramiko

port_number = 22
username = "zhangsan"
password = "passwordA1!"
ip = "192.168.80.101"

ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(
    port=port_number,
    username=username,
    password=password,
    hostname=ip
)

ssh_cmd = ssh.invoke_shell()
time.sleep(1)
tmp99 = ssh_cmd.recv(65535)
ssh_cmd.send("dis clock\n")
time.sleep(1)
tmp1 = ssh_cmd.recv(65535)
print(tmp1.decode())


"C:\Program Files\Python311\python.exe" G:\python2\第十章\text_files\test22.py 
dis clock
2023-03-22 19:39:33
Wednesday
Time Zone(DefaultZoneName) : UTC
<HUAWEI>

第二版

要求:传递多个命令并取回执行结果

# 前面的代码不用变,非常简单,连写三条命令即可
tmp99 = ssh_cmd.recv(65535)
ssh_cmd.send("dis clock\n")
ssh_cmd.send("dis version\n")
ssh_cmd.send("dis ip interface brie\n")
time.sleep(1)
tmp1 = ssh_cmd.recv(65535)
print(tmp1.decode())

第三版

要求:用函数的方式写成代码块,这样连续执行多个命令

import time
import paramiko

def ssh(cmd):
    port_number = 22
    username = "zhangsan"
    password = "passwordA1!"
    ip = "192.168.80.101"

    ssh = paramiko.SSHClient()
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    ssh.connect(
        port=port_number,
        username=username,
        password=password,
        hostname=ip
    )

    ssh_cmd = ssh.invoke_shell()
    time.sleep(1)
    tmp99 = ssh_cmd.recv(65535)
    ssh_cmd.send(cmd)
    time.sleep(1)
    tmp1 = ssh_cmd.recv(65535)
    print(tmp1.decode())

cmds = ["dis version","dis ip int brie"]
for cmd in cmds:
    cmd = f'{cmd}\n'
    ssh(cmd)

第四版

要求:要求把过于的信息过滤掉,只看自己想要的信息,比如说在不改变发送命令的前提下,只显示出具体的版本号和g1/0/1的接口信息;

# 初始版
import time
import paramiko


def ssh(cmd):
    port_number = 22
    username = "zhangsan"
    password = "passwordA1!"
    ip = "192.168.80.101"

    ssh = paramiko.SSHClient()
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    ssh.connect(
        port=port_number,
        username=username,
        password=password,
        hostname=ip
    )

    ssh_cmd = ssh.invoke_shell()
    time.sleep(1)
    tmp99 = ssh_cmd.recv(65535)
    ssh_cmd.send(cmd)
    time.sleep(1)
    tmp1 = ssh_cmd.recv(65535)
    tmp2 = f'{tmp1.decode()}'
    tmp3 = tmp2.split("\n")
    print(tmp3[2])

cmds = ["dis version"]
for cmd in cmds:
    cmd = f'{cmd}\n'
    ssh(cmd)
"C:\Program Files\Python311\python.exe" G:\python2\第十章\text_files\test22.py 
VRP (R) software, Version 8.180 (CE12800 V200R005C10SPC607B607)

但初始版非常不合理,因为只传递了一个命令,我们把命令的返回值搞成了列表,然后只打印我们需要的那一行,但我们我们传递的是多条命令,那想要的数据不一定在第二个元素,我们应该这样,在函数里面不动,还是打印那么多东西,但我们在向里面传统命令的时候我们再取我们想要的东西,这样就合理了,函数也通用了。

import time
import paramiko

def ssh(cmd):
    port_number = 22
    username = "zhangsan"
    password = "passwordA1!"
    ip = "192.168.80.101"

    ssh = paramiko.SSHClient()
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    ssh.connect(
        port=port_number,
        username=username,
        password=password,
        hostname=ip
    )

    ssh_cmd = ssh.invoke_shell()
    time.sleep(1)
    tmp99 = ssh_cmd.recv(65535)
    ssh_cmd.send(cmd)
    time.sleep(1)
    tmp1 = ssh_cmd.recv(65535)
    return tmp1   # 从这向下变了

version_1 = ssh("dis version \n")
version_2 = version_1.decode()
version_3 = version_2.split("\n")
print(version_3[2])

clock_1= ssh("dis clock\n")
clock_2 = clock_1.decode()
clock_3 = clock_2.split("\n")
print(clock_3[1])
"C:\Program Files\Python311\python.exe" G:\python2\第十章\text_files\test22.py 
VRP (R) software, Version 8.180 (CE12800 V200R005C10SPC607B607)
2023-03-22 20:16:18

第五版

在第四版我们使用ssh()函数时,发送的命令后面总得带着换行符,我们可以在函数当中让他自动添加;

def ssh(cmd):
    cmd = f'{cmd}\n'
    ……

第六版

version_1 = ssh("dis version \n")
version_2 = version_1.decode()
version_3 = version_2.split("\n")
print(version_3[2])

clock_1= ssh("dis clock\n")
clock_2 = clock_1.decode()
clock_3 = clock_2.split("\n")
print(clock_3[1])

上述是发送两个命令,并调用函数的,看着行数也有点多呀,你会发现前三行是一样的,我们可以再写一个函数,如下所示,这样代码就只有两行

import time
import paramiko
def ssh(cmd):
    cmd = f'{cmd}\n'
    port_number = 22
    username = "zhangsan"
    password = "passwordA1!"
    ip = "192.168.80.101"

    ssh = paramiko.SSHClient()
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    ssh.connect(
        port=port_number,
        username=username,
        password=password,
        hostname=ip
    )
    ssh_cmd = ssh.invoke_shell()
    time.sleep(1)
    tmp99 = ssh_cmd.recv(65535)
    ssh_cmd.send(cmd)
    time.sleep(1)
    tmp1 = ssh_cmd.recv(65535)
    return tmp1

def main(command):
    a1 = ssh(command)
    a2 = a1.decode()
    a3= a2.split("\n")
    return a3

version1 = main("dis version")
print(version1[2])
colock = main("dis clock")
print(colock[1])

"C:\Program Files\Python311\python.exe" G:\python2\第十章\text_files\test22.py 
VRP (R) software, Version 8.180 (CE12800 V200R005C10SPC607B607)
2023-03-22 20:46:37

第七版

  • 其实sleep的时间可以换成0.1秒的,这样程序的速度会比较快
  • 如果你想打印全部的配置信息,会发现一屏是无法显示完的,返回的信息仅仅是一屏的,所以我们要加上screen-length 0 temporary,这个命令,让他能一屏显示完,这样返回信息就是完事的了,如下所示:
import time
import paramiko
def ssh(cmd):
    cmd = f'{cmd}\n'
    port_number = 22
    username = "zhangsan"
    password = "passwordA1!"
    ip = "192.168.80.101"

    ssh = paramiko.SSHClient()
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    ssh.connect(
        port=port_number,
        username=username,
        password=password,
        hostname=ip
    )
    ssh_cmd = ssh.invoke_shell()
    ssh_cmd.send("screen-length 0 temporary \n")
    time.sleep(1)
    tmp99 = ssh_cmd.recv(65535)
    ssh_cmd.send(cmd)
    time.sleep(1)
    tmp1 = ssh_cmd.recv(65535)
    return tmp1

def main(command):
    a1 = ssh(command)
    a2 = a1.decode()
    a3= a2.split("\n")
    return a3

version1 = main("dis version")
print(version1[2])
colock = main("dis clock")
print(colock[1])
test1 = main("dis current-configuration")
print(test1)

初学菜鸟,请勿见笑,以后续续优化……

posted @ 2023-03-22 20:52  张贺贺呀  阅读(47)  评论(0编辑  收藏  举报