如何在dartssh2的SSHClient中捕获认证失败并记录日志?
解决dartssh2认证失败的日志记录问题
针对你用dartssh2连接服务器时无法捕获认证失败错误的问题,有两种可靠的解决方案:
方案1:监听SSHClient的错误流
由于SSHClient继承自Stream,认证失败等后续错误会通过error事件抛出,你可以通过监听error事件来捕获并记录日志:
Future<void> connectToSshClient() async { try { _sshSocket = await SSHSocket.connect(hubData.ipaddress, 22666); _sshClient = SSHClient(_sshSocket, username: 'root', onPasswordRequest: () => hubData.password, onAuthenticated: () { log("Authenticated"); _fetchAllInformation(); }, ); // 监听SSHClient的错误事件 _sshClient.listen( (_) {}, // 无需处理数据流,仅监听错误 onError: (error) { if (error is SSHError && error.message.contains('authentication failed')) { log("not authenticated"); } else { log("SSH连接错误: ${error.toString()}"); } }, onDone: () => log("SSH连接已关闭"), ); } catch (e) { // 捕获TCP连接阶段的错误(如服务器不可达) log("无法连接到服务器: ${e.toString()}"); } }
方案2:显式调用authenticate并await
如果你的dartssh2版本支持显式认证,可以直接await authenticate()方法,用try-catch捕获认证错误:
Future<void> connectToSshClient() async { try { _sshSocket = await SSHSocket.connect(hubData.ipaddress, 22666); _sshClient = SSHClient(_sshSocket, username: 'root', onPasswordRequest: () => hubData.password, ); // 显式执行认证并等待结果 await _sshClient.authenticate(); log("Authenticated"); _fetchAllInformation(); } on SSHError catch (e) { if (e.message.contains('authentication failed')) { log("not authenticated"); } else { log("SSH认证错误: ${e.toString()}"); } } catch (e) { // 捕获连接或其他未知错误 log("连接失败: ${e.toString()}"); } }
为什么之前的try-catch无效?
你之前的代码中,await SSHSocket.connect()只会捕获TCP连接阶段的错误(比如服务器不可达、端口不通),而SSH认证是在SSHClient构造后异步执行的,错误不会被外层的try-catch捕获。必须通过监听SSHClient的error流,或者显式await认证方法,才能捕获认证失败的错误。
内容的提问来源于stack exchange,提问作者Feadl van Krockk
相关产品推荐
相关产品推荐

