当前位置:首页>python>【懒人运维】Python自动化运维paramiko模块

【懒人运维】Python自动化运维paramiko模块

  • 2026-10-11 07:56:16
【懒人运维】Python自动化运维paramiko模块

使用与概述

paramiko是一个用于在Python中执行远程操作的模块,支持SSH协议。它可以用于连接到远程服务器,执行命令、上传和下载文件,以及在远程服务器上执行各种操作。

  • 建立 SSH 连接
  • 执行远程命令
  • 文件传输(SFTP)
  • 端口转发

核心组件

Paramiko 提供了几个关键类

类名
作用
SSHClient
建立 SSH 连接、执行命令、传输文件
SFTPClient
基于 SSH 的 SFTP 文件传输
AutoAddPolicy
自动接受未知主机密钥
RSAKey/Ed25519Key
加载私钥文件进行身份认证

安装

使用  pip 命令 来安装 paramiko 模块:

pip install paramiko

基本用法

建立 SSH 连接:  使用 paramiko 可以建立到远程服务器的 SSH 连接。

import paramiko# 创建 SSH 客户端client = paramiko.SSHClient()# 自动添加主机密钥 (不写这个可能会报错找不到主机)client.set_missing_host_key_policy(paramiko.AutoAddPolicy())# 连接到远程服务器client.connect('your_host', username='your_username', password='your_password', allow_agent=False, look_for_keys=False)# 参数说明:# - hostname: 远程主机的IP地址或域名# - username: 用于SSH连接的用户名# - password: 用于SSH连接的密码# - allow_agent: 是否允许使用代理验证,默认为False# - look_for_keys: 是否在本地寻找私钥文件,默认为False# 执行命令stdin, stdout, stderr = client.exec_command('ls -l')# - stdin:命令的标准输入# - stdout:命令的标准输出# - stderr:命令的错误输出print(stdout.read().decode())# 关闭连接client.close()

上传和下载文件:

使用 paramiko的sftp可以上传和下载文件到远程服务器。

import paramiko# 创建 SSH 客户端client = paramiko.SSHClient()client.set_missing_host_key_policy(paramiko.AutoAddPolicy())client.connect('your_host', username='your_username', password='your_password')# 上传文件sftp = client.open_sftp()local_file_path = 'local_file.txt'remote_file_path = '/path/on/remote/server/remote_file.txt'sftp.put(local_file_path, remote_file_path)# 下载文件local_download_path = 'local_download.txt'remote_download_path = '/path/on/remote/server/remote_file.txt'sftp.get(remote_download_path, local_download_path)# 关闭连接sftp.close()client.close()

SSH 密钥

使用 SSH 密钥进行认证。

import paramiko# 创建 SSH 客户端client = paramiko.SSHClient()client.set_missing_host_key_policy(paramiko.AutoAddPolicy())# 使用密钥认证private_key_path = '/path/to/your/private/key'key = paramiko.RSAKey(filename=private_key_path)client.connect('your_host', username='your_username', pkey=key)# 执行命令等操作# 关闭连接client.close()

异常处理

Paramiko 常见异常:

  • paramiko.ssh_exception.AuthenticationException
    :认证失败
  • paramiko.ssh_exception.SSHException
    :连接失败
  • socket.timeout
    :超时

示例:

import paramikoimport sockettry:    ssh = paramiko.SSHClient()    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())    ssh.connect(        hostname="192.168.1.100",        username="root",        password="wrong_password",        timeout=5    )except paramiko.AuthenticationException:    print("认证失败,请检查用户名或密码")except paramiko.SSHException as e:    print(f"SSH 连接错误: { e}")except socket.timeout:    print("连接超时")finally:    ssh.close()

端口转发(隧道)

Paramiko 可以像 ssh -L 一样做本地端口转发,把本地端口映射到远程服务。

import paramikofrom paramiko.forward import forward_tunneltransport = paramiko.Transport(("192.168.1.100", 22))transport.connect(username="root", password="123456")# 将本地 8080 转发到远程 127.0.0.1:80forward_tunnel(local_port=8080,remote_host="127.0.0.1",remote_port=80, transport=transport)

示例

获取交换机配置信息

def get_config(ip,username,passwd,port):    config = ''    try:        t = paramiko.SSHClient()        t.set_missing_host_key_policy(paramiko.AutoAddPolicy)        t.connect(hostname=ip,username=username,port=port,password=passwd)        chan = t.invoke_shell()        #sleep 1秒,防止执行过快导致卡死        time.sleep(1)        chan.recv(1024)        #华为设备关闭分页        chan.send('screen-length 0 temporary'+'\n')        #chan.send('screen-length disable '+'\n')  H3c设备关闭分页        time.sleep(1)        chan.recv(1024)        chan.send('dis cu'+'\n')        time.sleep(1)        count = 0        while True:            line = chan.recv(RECV_LEN)            config +=str(line).strip()            count = count + 1            if "return " in line:                break            else:                time.sleep(0.05)                chan.sendall(' ')            #防止莫名其妙进入死循环            if count >50:               break        #清除一些无关信息        config = config.replace('\033[16D','')\                 .replace('---- More ----','')\                 .replace('dis cu','').replace("\r\n","\n")    except Exception as e:        traceback.print_exc()    return config 

最新文章

随机文章