python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Python异步编程AsyncSSH

Python异步SSH编程AsyncSSH的使用

作者:萧鼎

本文介绍了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 库,主要特性包括:

相比 Paramiko:

四、安装与环境配置

AsyncSSH 可以通过 pip 安装:

pip install asyncssh

系统要求:

如果需要性能提升,可以配合 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. 批量任务分组,避免同时连接数过大导致服务器资源耗尽。

十、应用场景

十一、AsyncSSH 的优势与不足

优势

不足

十二、未来发展与展望

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

十三、总结

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

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

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

您可能感兴趣的文章:
阅读全文