You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 02:25:14