|

本帖最后由 〞剑舞长空 于 2025-4-11 21:05 编辑
VS2022写的
没有静态库 ,懒得整
sftp没封装
库的日志输出没有,懒得修
随缘再弄
收费6井壁:实例一起提供在压缩包中
eSSH.zip
(1.17 MB, 下载次数: 14, 售价: 5 枚 精币)
大家好!很高兴向大家介绍一款新的易语言支持库——多会话 SSH 回调支持库 V2.3。这款库旨在为易语言开发者提供一套强大而灵活的 SSH 客户Duan功能,让你的应用程序能够轻松地与远程 Linux/Unix 服务器进行交互。
核心功能亮点:
- 多会话管理: 不再局限于单一连接!本库采用面向对象的设计,允许你通过
SSH_CreateSession() 创建多个独立的 SSH 会话实例,并通过返回的会话句柄来管理和操作每一个连接。使用 SSH_DestroySession(句柄) 来安全地关闭和销毁会话。
- 多通道支持: 在一个已建立的 SSH 会话中,可以通过
SSH_OpenChannel(句柄, 是否Shell, 命令) 打开多个通道。每个新打开的通道都会获得一个唯一的通道 ID,并通过通道回调通知给你。你可以同时运行多个 Shell 或执行多个命令。使用 SSH_CloseChannel(句柄, 通道ID) 来关闭指定的通道。
- 异步事件驱动: 连接、认证、数据接收和通道状态变化都是异步进行的。库内部使用高效的事件模型(基于 Windows 的 WSAEventSelect)来处理网络 I/O,并通过你设置的回调函数实时通知易语言端发生的事件,避免了传统阻塞方式导致的界面卡顿。
- 回调机制: 通过
SSH_GlobalInit 设置三个核心回调函数:
- 状态回调: 接收会话级别的状态变化(连接中、连接成功、认证中、认证成功、错误、断开连接)及相关消息。
- 数据回调: 接收来自特定通道的标准输出 (
#SSH_数据_标准输出 ) 或标准错误 (#SSH_数据_标准错误 ) 数据,回调中包含会话句柄、通道 ID、数据类型、数据(字节集指针)和长度。请注意: 易语言在回调中需要立即复制数据,因为指针在回调返回后可能失效。
- 通道回调: 接收通道级别的事件,如通道打开成功 (
#SSH_通道事件_打开 ,此时可获取新通道 ID)、通道关闭 (#SSH_通道事件_关闭EOF / #SSH_通道事件_关闭错误 )、收到退出状态码 (#SSH_通道事件_退出状态 ) 等。
- 多种认证方式:
- 密码认证: 通过
SSH_Authenticate_Password(句柄, 密码) 实现。
- 公钥认证: 通过
SSH_Authenticate_PublicKey(句柄, 私钥路径, 密码短语) 实现。支持自动查找常用密钥(将 私钥路径 设为空)和指定密钥文件。
- None 认证: 通过
SSH_Authenticate_None(句柄) 尝试。
- (注意:键盘交互式认证暂不支持)
- 日志级别控制: 可以通过
SSH_SetLogLevel(句柄, 日志级别常量) 来设置 libssh 的日志详细程度,日志会输出到调试器(如果开启)或标准错误流(默认可能不可见)。
优点:
- 异步非阻塞: 核心 I/O 操作在后台线程中进行,并通过回调通知,最大限度地减少了对易语言主线程(UI 线程)的阻塞,提升了程序响应速度和用户体验。
- 多会话与多通道: 真正实现了同时管理多个 SSH 连接和在单个连接上并发执行多个任务的能力。
- 灵活的认证: 支持常用的密码和公钥认证方式。
- 事件驱动: 基于回调的设计符合易语言的编程习惯,易于集成到事件驱动的程序中。
- 面向对象封装 (内部): C++ 内部使用了面向对象的方式封装会话,提高了代码的可维护性和扩展性。
缺点与注意事项:
- 异步编程的复杂性: 使用回调函数意味着易语言端的逻辑需要按照异步事件的方式来编写和管理状态,相对于简单的同步调用会更复杂。你需要仔细处理回调函数中的逻辑,特别是状态转换和资源管理。
SSH_Write 的阻塞性: 当前版本的 SSH_Write 函数仍然是阻塞的。虽然发送少量数据通常很快,但如果网络状况不佳或发送大量数据,调用此函数可能会短暂阻塞易语言线程。理想的完全异步模型需要实现发送队列。
- TERM=vanilla 的局限性: 库在请求 PTY 时会尝试使用
"vanilla" 终端类型,旨在告知服务器尽量发送纯文本。
- 理想情况: 远程程序遵守此设置,禁用颜色和复杂格式。
- 现实情况: 很多现代程序(尤其是追求美观或功能的)可能会部分或完全忽略
TERM 设置,你仍然可能在数据回调中收到 ANSI 转义序列(如颜色代码 [01;32m 、模式设置 [?2004h] 等)。本支持库目前不包含 ANSI 序列的过滤或解析功能,如果需要显示纯净文本或模拟终端颜色,你需要在易语言端自行处理接收到的数据。
- 键盘交互式认证 (KbdInt) 不支持: 由于在 Win32 环境下模拟复杂的控制台交互式输入(特别是隐藏回显、处理多个提示)并通过回调与易语言安全交互非常困难,当前版本不支持键盘交互式认证 (
SSH_Authenticate_Interactive 会直接返回错误)。
- 公钥认证细节: 公钥认证的实现依赖于 libssh 的能力。自动查找密钥 (
privateKeyPath 为空) 依赖于标准的 SSH 客户Duan配置(如 ~/.ssh 目录或 SSH Agent)。带密码的私钥需要正确提供密码短语。
- 错误处理: 虽然提供了错误回调和返回值,但实际应用中可能需要更细致的错误来源判断和用户提示。
- 资源管理: 库内部使用 C++ 智能指针等管理资源,但易语言端需要正确调用
SSH_CreateSession 和 SSH_DestroySession ,以及 SSH_GlobalInit 和 SSH_GlobalCleanup 来确保资源的完整生命周期管理。
- 测试范围: 目前主要测试了密码认证流程。公钥认证等其他功能虽然已实现接口,但可能需要更多场景下的测试和完善。
主要函数接口说明:
全局初始化与清理:
整数型 SSH_GlobalInit (状态回调, 数据回调, 通道回调, 日志回调)
- 必须在使用库之前调用一次。
- 设置全局的回调函数子程序指针,用于接收来自库的各种事件和数据。
- 进行 libssh 的全局初始化。
- 成功返回
#SSH_成功 (0),失败返回错误码。
SSH_GlobalCleanup ()
- 必须在程序退出前调用一次。
- 停止所有后台线程,清理所有会话和通道资源,反初始化 libssh。
会话管理:
整数型 SSH_CreateSession ()
- 创建一个新的 SSH 会话实例。
- 成功返回一个大于 0 的会话句柄 (整数),用于标识这个会话。失败返回错误码 (如
#SSH_错误_内存 )。易语言需要保存此句柄。
SSH_DestroySession (整数型 会话句柄)
- 销毁指定的会话实例。
- 会自动触发断开连接(如果已连接)并停止相关后台线程,释放所有资源。
连接与断开:
整数型 SSH_Connect (整数型 会话句柄, 文本型 主机名, 整数型 端口, 文本型 用户名)
- 异步启动指定会话的 TCP 连接过程(不进行认证)。
- 立即返回
#SSH_成功 (0) 表示连接请求已发出,或返回错误码。
- 实际的连接结果(成功建立 TCP 连接或失败)将通过状态回调 (
#SSH_状态_已连接 或 #SSH_状态_错误 ) 通知。
SSH_Disconnect (整数型 会话句柄)
- 异步请求断开指定的 SSH 会话连接。
- 会通知后台线程停止并开始清理。最终断开结果通过状态回调 (
#SSH_状态_断开 ) 通知。
认证操作 (在 SSH_Connect 成功后调用):
整数型 SSH_Authenticate_Password (整数型 会话句柄, 文本型 密码)
- 异步尝试使用密码进行认证。
- 返回
#SSH_成功 (0) 表示认证请求已发送。
- 认证结果(成功或失败)通过状态回调 (
#SSH_STATUS_AUTHENTICATED 或 #SSH_STATUS_ERROR ) 返回。
整数型 SSH_Authenticate_PublicKey (整数型 会话句柄, 文本型 私钥路径, 文本型 密码短语)
- 异步尝试使用公钥进行认证。
私钥路径 : 可以是私钥文件的完整路径。如果为空文本或省略,库会尝试自动查找常用私钥(如 ~/.ssh/id_rsa )或使用 SSH Agent/Pageant。
密码短语 : 如果私钥文件有密码,在此提供。可为空或省略。
- 返回
#SSH_成功 (0) 表示认证请求已发送。结果通过状态回调返回。
整数型 SSH_Authenticate_None (整数型 会话句柄)
- 异步尝试进行 "none" 认证(通常用于探测)。
- 返回
#SSH_成功 (0) 表示请求已发送。结果通过状态回调返回。
整数型 SSH_Authenticate_Interactive (整数型 会话句柄, 子程序指针 交互回调)
- 当前版本不支持键盘交互式认证。调用此函数将直接返回错误码 (
#SSH_错误_通用 )。
通道操作 (在认证成功后调用):
整数型 SSH_OpenChannel (整数型 会话句柄, 逻辑型 是否Shell, 文本型 命令文本)
- 异步请求在指定的会话上打开一个新的通道。
是否Shell : 为真则请求一个交互式 Shell,为假则需要提供 命令文本 来执行命令。
- 返回
#SSH_成功 (0) 表示请求已发送。
- 新通道是否成功打开,以及它的通道 ID,将通过通道回调 (
#SSH_通道事件_打开 ) 返回。
整数型 SSH_CloseChannel (整数型 会话句柄, 整数型 通道ID)
- 异步请求关闭指定的通道。
- 返回
#SSH_成功 (0) 表示请求已发送。
- 通道实际关闭的结果通过通道回调 (
#SSH_通道事件_关闭EOF 或 #SSH_通道事件_关闭错误 ) 返回。
整数型 SSH_Write (整数型 会话句柄, 整数型 通道ID, 字节集 欲发送数据, 整数型 数据长度)
- 阻塞方式向指定通道发送数据。注意: 在易语言主线程调用此函数可能导致界面卡顿,特别是发送大量数据或网络慢时。
- 返回成功写入的字节数 (>=0),或负数错误码 (
#SSH_写入错误_* )。
日志设置:
整数型 SSH_SetLogLevel (整数型 会话句柄, 整数型 日志级别)
- 设置指定会话的 libssh 日志详细程度(使用
#SSH_LOG_* 常量)。
- 可以在
SSH_Connect 之前或之后调用。如果在连接之后调用,只会影响后续产生的日志级别。
- libssh 的日志默认输出到
stderr ,在此库中不会重定向到文件。你需要使用调试工具捕获 stderr 才能看到日志。
- 成功返回
#SSH_成功 (0)。
总结:
这款多会话 SSH 回调支持库为易语言带来了强大的异步 SSH 功能,特别适合需要同时管理多个连接或通道,并希望保持界面流畅的应用。但也需要开发者理解异步编程和回调机制,并注意处理可能出现的 ANSI 转义序列以及 SSH_Write 的潜在阻塞。
欢迎大家试用并提出宝贵的意见和建议!
|
|