当前位置: 首页 > article >正文

Python网络自动化运维---用户交互模块

文章目录

  • 目录

    文章目录

    前言

    实验环境准备

    一.input函数

     代码分段解析

    二.getpass模块 


前言

        在前面的SSH模块章节中,我们都是将提供SSH服务的设备的账户/密码直接写入到python代码中,这样很容易导致账户/密码泄露,而使用Python中的用户交互模块,如input函数和getpass函数等,让用户自行输入账户/密码,则可以有效避免信息泄露。


实验环境准备

基础配置:

  • 路由器各接口配置IP
  • 交换机创建对应VLAN和vlanif接口,vlanif接口配置IP
  • 两台交换机开启SSH服务,并在本地电脑使用远程工具(如:Xshell)成功连接。

实验目的:

  • 配置getpass模块和input函数实现交互式的SSH用户名和密码输入
  • 配置for循环同时给两台交换机配置vlan 100~vlan 103

一.input函数

   在 Python 中,input 函数是一个内置函数,主要用于从标准输入(通常是键盘)读取用户输入的信息,input 函数的默认行为是将用户输入的任何内容都作为字符串类型返回给Python程序。

实验代码

import paramiko
import time

for ip in ["192.168.10.1","192.168.9.2"]:
    username = input("请输入用户名:")
    password = input("请输入密码:")
    ssh_client = paramiko.SSHClient()
    ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    ssh_client.connect(hostname=ip,username=username,password=password)
    print(f"Successfully to connect {ip}")
    commend = ssh_client.invoke_shell()
    commend.send("sys\n")
    for vlan_id in range(100,104):
        print(f"正在创建vlan {vlan_id}")
        commend.send(f"vlan {vlan_id}\n")
    time.sleep(2)
    output = commend.recv(65535).decode("ascii")
    print("命令行界面配置过程:")
    print(output)
    time.sleep(2)
ssh_client.close()

 代码分段解析

导入模块

  • import paramiko:导入 paramiko 模块,这是一个强大的 Python 库,用于实现 SSHv2 协议,可用于远程连接和操作设备。
  • import time:导入 time 模块,用于在程序中添加延迟,等待设备处理命令。
import paramiko
import time

 遍历IP:

  • 利用for循环遍历元素为交换机IP地址的列表,实现每次for循环对一个交换机进行一次配置
for ip in ["192.168.10.1","192.168.9.2"]:

用户输入

  • username = input("请输入用户名:"):使用 input 函数接收用户输入的用户名。
  • password = input("请输入密码:"):使用 input 函数接收用户输入的密码。
username = input("请输入用户名:")
password = input("请输入密码:")

SSH 连接的建立

  • ssh_client = paramiko.SSHClient():创建一个 SSHClient 对象,用于建立 SSH 连接。
  • ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy()):设置主机密钥策略为 AutoAddPolicy(),这样在连接未知主机时,会自动添加SSH服务器发送的密码,防止建立SSH连接失败。
  • ssh_client.connect(hostname=ip, username=username, password=password):使用提供的用户名和密码通过connect()函数连接到指定的 IP 地址的 SSH 服务器。

创建交互式会话并发送命令

  • commend = ssh_client.invoke_shell():使用 invoke_shell() 方法调用设备的命令行界面
  • commend.send("sys\n"):发送 sys 命令,可能是为了进入系统配置模式
  • for vlan_id in range(100, 104)::使用 for 循环命令,依次遍历vlan_id,。
    • print(f"正在创建vlan {vlan_id}"):打印当前正在创建的 vlan 信息。
    • commend.send(f"vlan {vlan_id}\n"):发送 vlan 命令,\n 表示回车键,即执行命令。

等待和接收输出

  • time.sleep(2):等待 2 秒,期望设备在这段时间内完成命令的执行,但这种等待方式不够可靠,因为不同设备的执行时间不同。
  • output = commend.recv(65535).decode("ascii"):使用 recv(65535) 接收最多 65535 字节的输出,并将其解码为 ascii 编码的字符串。
  • print("命令行界面配置过程:") 和 print(output):打印输出,显示设备的命令行界面配置过程。

 代码执行过程:

实验结果验证: 

二.getpass模块 

        当使用 input 函数时,用户输入的内容会明文显示在屏幕上,使用 getpass 函数时,用户输入的信息不会显示在屏幕上,这对于输入敏感信息(如密码、API 密钥等)非常有用。

实验代码在input函数的代码基础上更改如下:

import paramiko
from getpass import getpass
import time

for ip in ["192.168.10.1","192.168.9.2"]:
    username = input("请输入用户名:")
    password = getpass('Password:')
    ssh_client = paramiko.SSHClient()
    ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    ssh_client.connect(hostname=ip,username=username,password=password)
    print(f"Successfully to connect {ip}")
    commend = ssh_client.invoke_shell()
    commend.send("sys\n")
    for vlan_id in range(100,104):
        print(f"正在创建vlan {vlan_id}")
        commend.send(f"vlan {vlan_id}\n")
    time.sleep(2)
    output = commend.recv(65535).decode("ascii")
    print("命令行界面配置过程:")
    print(output)
    time.sleep(2)
ssh_client.close()

 此处不再赘述代码解析,用户在输入密码时将不会显示在屏幕上。

注意:getpass模块存在bug,无法在pycharm中运行,想要看到隐藏输入效果,可以在windows终端里运行python代码。

在pycharm左下角存在终端图标,可以打开windows终端:

 


总结


http://www.kler.cn/a/514780.html

相关文章:

  • YOLOv8改进,YOLOv8检测头融合DSConv(动态蛇形卷积),并添加小目标检测层(四头检测),适合目标检测、分割等
  • 【C++】std::prev用法
  • Flink Gauss CDC:深度剖析存量与增量同步的创新设计
  • 【面试】Java 记录一次面试过程 三年工作经验
  • CSS中相对定位和绝对定位详解
  • 1/20赛后总结
  • Vue3组件重构实战:从Geeker-Admin拆解DataTable的最佳实践
  • 场馆预定平台高并发时间段预定实现V2
  • 计算机组成原理(计算机系统3)--实验七:新增指令实验
  • [操作系统] 环境变量详解
  • vue项目动态div滚动条滑动到指定位置效果
  • 手撕Diffusion系列 - 第四期 - Diffusion前向扩散
  • grafana新增email告警
  • .net 项目引用与 .NET Framework 项目引用之间的区别和相同
  • React的响应式
  • Python聚合的概念与实现
  • 告别繁琐的Try-Catch!优雅的异常处理解决方案
  • 2024电赛H题参考方案(+视频演示+核心控制代码)——自动行驶小车
  • Java多线程中Condition类的详细介绍、应用场景和示例代码
  • 大模型GUI系列论文阅读 DAY2续2:《使用指令微调基础模型的多模态网页导航》
  • leetcode136.寻找重复数
  • Python开发GUI的方法汇总
  • 基于springboot实验室信息管理系统
  • 2024:成长和学习之旅
  • 改写中断例程,用中断响应外设
  • 专业又简单:Geotiff文件转Cesium影像切片教程