文章目录
-  目录 文章目录 前言 实验环境准备 一.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 timefor 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 timefor 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终端:

