Python异步SSH编程AsyncSSH的使用

 更新时间:2025年09月10日 11:27:19   作者:萧鼎  
本文介绍了Python异步SSH库AsyncSSH的核心功能与应用场景,相比传统同步SSH工具Paramiko,AsyncSSH基于asyncio框架,能够高效处理大规模并发连接,感兴趣的可以了解一下

一、前言

在网络自动化与远程运维中,SSH(Secure Shell) 协议几乎是所有 IT 工程师和开发者的必备工具。从服务器管理、网络设备配置,到批量自动化脚本,SSH 无处不在。

在 Python 生态中,传统的 SSH 客户端库有 paramikofabric 等,它们主要基于同步模式。然而,随着大规模自动化运维需求的增加,单线程阻塞模式逐渐暴露出效率瓶颈。在需要同时连接上百台、甚至上千台服务器时,异步化的 SSH 方案变得尤为重要。

这就是 AsyncSSH 的优势所在。它是一个基于 asyncio全功能 SSH 实现,支持客户端与服务器模式,功能丰富,性能优异,非常适合构建高并发的自动化运维系统。

本文将从基础到实战,全面解析 AsyncSSH 的功能与应用,帮助你在 Python 项目中灵活使用异步 SSH。

二、SSH 协议回顾

在深入 AsyncSSH 之前,先快速回顾 SSH 的基础概念。

  1. SSH 功能

    • 远程登录:加密的远程终端访问。
    • 文件传输:SCP/SFTP 协议。
    • 端口转发:本地/远程/动态隧道。
    • 密钥认证:支持公钥/私钥方式,提升安全性。
  2. SSH 常见应用场景

    • 系统管理员远程管理服务器。
    • DevOps 自动化部署与批量命令执行。
    • 安全隧道与代理服务。
    • 文件传输与同步。
  3. 为什么需要异步 SSH?

    • 同步 SSH(如 Paramiko)在执行大规模批量命令时会阻塞,性能受限。
    • 异步 SSH(AsyncSSH)基于 asyncio,可以同时处理成百上千的连接请求,大大提高效率。

三、AsyncSSH 简介

AsyncSSH 是一个 Python 异步 SSH 库,主要特性包括:

  • 完全基于 asyncio,天然支持异步并发。
  • 支持 SSH 客户端和服务器 模式。
  • 支持 SFTP、SCP 文件传输
  • 支持 端口转发(隧道代理)
  • 支持 公钥/密码认证,并支持 OpenSSH 格式密钥。
  • 性能优秀,可同时管理数千个 SSH 连接。

相比 Paramiko:

  • Paramiko:同步模式,适合小规模脚本。
  • AsyncSSH:异步模式,适合高并发场景。

四、安装与环境配置

AsyncSSH 可以通过 pip 安装:

pip install asyncssh

系统要求:

  • Python 3.7+
  • 支持 Linux、macOS、Windows(部分功能在 Windows 下受限)。

如果需要性能提升,可以配合 uvloop 作为 asyncio 事件循环:

pip install uvloop

五、核心 API 与使用模式

AsyncSSH 的核心 API 与 asyncio 高度集成,主要包括:

  1. 连接管理

    • asyncssh.connect(host, port, username, password/key)
  2. 命令执行

    • conn.run(cmd)
    • conn.create_process()
  3. 文件传输

    • asyncssh.scp()
    • asyncssh.sftp()
  4. 端口转发

    • create_connection() / start_server()
  5. 服务器模式

    • asyncssh.listen()

AsyncSSH 的编程模式非常贴近 asyncio,使用 async/await 即可完成 SSH 相关操作。

六、基础用法示例

1. 执行远程命令

import asyncio, asyncssh

async def run_cmd():
    async with asyncssh.connect('192.168.1.10', username='user', password='password') as conn:
        result = await conn.run('uname -a', check=True)
        print(result.stdout)

asyncio.run(run_cmd())

2. 批量并发执行命令

import asyncio, asyncssh

async def run_cmd(host):
    async with asyncssh.connect(host, username='user', password='password') as conn:
        result = await conn.run('uptime')
        print(f"{host}: {result.stdout.strip()}")

async def main():
    hosts = ['192.168.1.10', '192.168.1.11', '192.168.1.12']
    await asyncio.gather(*(run_cmd(h) for h in hosts))

asyncio.run(main())

相比 Paramiko 的串行执行,这种方式可以显著提升执行效率。

3. 文件传输(SCP/SFTP)

import asyncio, asyncssh

async def upload():
    async with asyncssh.connect('192.168.1.10', username='user', password='password') as conn:
        await asyncssh.scp('local.txt', (conn, '/home/user/remote.txt'))

asyncio.run(upload())

4. 创建 SSH 服务器

import asyncio, asyncssh

async def handle_client(process):
    process.stdout.write('Welcome to AsyncSSH server!\n')
    async for line in process.stdin:
        process.stdout.write(f'You said: {line}')

async def start_server():
    await asyncssh.listen('', 8022, server_host_keys=['ssh_host_key'], process_factory=handle_client)

asyncio.run(start_server())

七、实战案例

案例一:批量主机健康检查

需求:连接 100 台服务器,获取系统负载与内存使用情况,并存入数据库。

import asyncio, asyncssh

async def check_host(host):
    try:
        async with asyncssh.connect(host, username='user', password='pass') as conn:
            result = await conn.run("uptime && free -m")
            return host, result.stdout
    except Exception as e:
        return host, f"Error: {e}"

async def main():
    hosts = [f"192.168.1.{i}" for i in range(10, 110)]
    results = await asyncio.gather(*(check_host(h) for h in hosts))
    for host, output in results:
        print(f"{host}:\n{output}")

asyncio.run(main())

相比同步方式,AsyncSSH 可以在几秒内完成所有任务。

案例二:自动化部署脚本

async def deploy(host):
    async with asyncssh.connect(host, username='deploy', client_keys=['~/.ssh/id_rsa']) as conn:
        await conn.run("mkdir -p /opt/app")
        await asyncssh.scp('app.tar.gz', (conn, '/opt/app/'))
        await conn.run("cd /opt/app && tar -xzf app.tar.gz && ./start.sh")

asyncio.run(deploy("192.168.1.20"))

可轻松实现批量自动化部署。

案例三:SSH 隧道转发

async def forward():
    async with asyncssh.connect('remote.server.com', username='user') as conn:
        listener = await conn.forward_local_port('127.0.0.1', 8080, 'localhost', 80)
        await listener.wait_closed()

asyncio.run(forward())

这样本地 http://127.0.0.1:8080 就会转发到远程 localhost:80

八、AsyncSSH 与 Paramiko 对比

特性ParamikoAsyncSSH
模式同步异步(asyncio)
并发能力适合少量连接可管理数千连接
功能SSH/SFTPSSH/SFTP/Server/隧道
性能中等高并发优势明显
学习成本较低需要掌握 asyncio

九、性能优化与最佳实践

  1. 使用 asyncio.gather() 并发执行
  2. 配合 uvloop 提升事件循环性能。
  3. 复用连接,避免频繁建立/关闭 SSH 会话。
  4. 异常捕获与超时设置,保证稳定性。
  5. 批量任务分组,避免同时连接数过大导致服务器资源耗尽。

十、应用场景

  • 大规模运维监控:批量收集服务器状态。
  • 自动化部署系统:分发应用、更新配置。
  • CI/CD 流程:结合 Jenkins/GitLab 实现远程部署。
  • 网络设备管理:批量执行命令(如交换机配置)。
  • SSH 代理/隧道服务:构建中间跳板机。

十一、AsyncSSH 的优势与不足

优势

  • 原生 asyncio 支持,高并发性能优秀。
  • 功能覆盖 SSH/SFTP/隧道/服务器,几乎全能。
  • 接口简洁,代码结构清晰。

不足

  • 学习成本稍高,需要掌握异步编程。
  • Windows 下部分功能不完整(如 OpenSSH key 格式兼容性)。
  • 社区生态不如 Paramiko 广泛。

十二、未来发展与展望

随着 云计算、DevOps、自动化运维 的普及,异步编程逐渐成为主流。AsyncSSH 将在以下方向发挥更大作用:

  • Ansible、SaltStack 等工具集成,提高并发能力。
  • 更深入地支持 零信任安全架构
  • 优化与 asyncio/Trio/Curio 等异步框架的兼容性。
  • 增强 分布式自动化系统 的 SSH 基础组件地位。

十三、总结

通过本文,你应该掌握了:

  • SSH 协议的基本概念与应用场景。
  • AsyncSSH 的安装方法与核心功能。
  • 异步 SSH 的常见用法(命令执行、SFTP、隧道、服务器)。
  • 实战案例(批量检查、自动化部署、隧道转发)。
  • AsyncSSH 与 Paramiko 的对比与性能优化。
  • AsyncSSH 在运维、自动化和云原生领域的应用前景。

在现代高并发运维环境中,AsyncSSH 无疑是 Python 异步 SSH 编程的利器。如果你正在构建一个需要管理成百上千台服务器的系统,那么 AsyncSSH 会让你的自动化脚本更高效、更优雅。

到此这篇关于Python异步SSH编程AsyncSSH的使用的文章就介绍到这了,更多相关Python异步编程AsyncSSH内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • python openCV实现摄像头获取人脸图片

    python openCV实现摄像头获取人脸图片

    这篇文章主要为大家详细介绍了python openCV实现摄像头获取人脸图片,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-08-08
  • Django中使用pillow实现登录验证码功能(带刷新验证码功能)

    Django中使用pillow实现登录验证码功能(带刷新验证码功能)

    这篇文章主要介绍了Django中使用pillow实现登录验证码功能(带刷新验证码功能),本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-04-04
  • 一文秒懂python中的 \r 与 end=‘’ 巧妙用法

    一文秒懂python中的 \r 与 end=‘’ 巧妙用法

    这篇文章主要介绍了python中的 \r 与 end=‘’ 巧妙用法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-04-04
  • Python subprocess模块常见用法分析

    Python subprocess模块常见用法分析

    这篇文章主要介绍了Python subprocess模块常见用法,结合实例形式分析了subprocess模块进程操作相关使用技巧与注意事项,需要的朋友可以参考下
    2018-06-06
  • Python3实现的判断环形链表算法示例

    Python3实现的判断环形链表算法示例

    这篇文章主要介绍了Python3实现的判断环形链表算法,涉及Python针对环形链表的遍历、判断相关操作技巧,需要的朋友可以参考下
    2019-03-03
  • 如何利用itertuples对DataFrame进行遍历

    如何利用itertuples对DataFrame进行遍历

    这篇文章主要介绍了如何利用itertuples对DataFrame进行遍历问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-06-06
  • python 爬取天气网卫星图片

    python 爬取天气网卫星图片

    根据网站URL的规律编写的一个爬取天气网卫星图片的python爬虫,使用了requests包,感兴趣的朋友可以参考下
    2021-06-06
  • python+selenium 实现扫码免密登录示例代码

    python+selenium 实现扫码免密登录示例代码

    这篇文章主要介绍了python+selenium 实现扫码免密登录,首先扫码登录获取cookies保存到本地未后面免密登录做准备,本文通过示例代码给大家介绍的非常详细,需要的朋友可以参考下
    2022-07-07
  • 对python读写文件去重、RE、set的使用详解

    对python读写文件去重、RE、set的使用详解

    今天小编就为大家分享一篇对python读写文件去重、RE、set的使用详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-12-12
  • Numpy中扁平化函数ravel()和flatten()的区别详解

    Numpy中扁平化函数ravel()和flatten()的区别详解

    本文主要介绍了Numpy中扁平化函数ravel()和flatten()的区别详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-02-02

最新评论