Flutter SSH连接插件libssh_binding的使用

Flutter SSH连接插件libssh_binding的使用

libssh_binding 是一个用于在 Dart 和 Flutter 中通过 libssh 库实现 SSH 连接的插件。libssh 是一个多平台的 C 库,实现了 SSHv2 协议的客户端和服务器端功能。使用 libssh_binding 可以远程执行程序、传输文件,并通过安全透明的隧道进行通信。

低级示例

import 'dart:io';
import 'package:libssh_binding/libssh_binding.dart';
import 'package:libssh_binding/src/extensions/sftp_extension.dart';
import 'dart:ffi' as ffi;
import 'package:path/path.dart' as path;

void main() async {
  // 打开动态库
  var libraryPath = path.join(Directory.current.path, 'libssh_compiled', 'ssh.dll');
  final dll = ffi.DynamicLibrary.open(libraryPath);
  var libssh = Libssh(dll);

  var host = "localhost";
  var port = 22;
  var password = "pass";
  var username = "root";

  // 打开会话并设置选项
  var my_ssh_session = libssh.ssh_new();
  libssh.ssh_options_set(my_ssh_session, ssh_options_e.SSH_OPTIONS_HOST, stringToNativeVoid(host));
  libssh.ssh_options_set(my_ssh_session, ssh_options_e.SSH_OPTIONS_PORT, intToNativeVoid(port));
  libssh.ssh_options_set(my_ssh_session, ssh_options_e.SSH_OPTIONS_USER, stringToNativeVoid(username));
  
  // 连接到服务器
  var rc = libssh.ssh_connect(my_ssh_session);
  if (rc != SSH_OK) {
    print('Error connecting to host: $host\n');
  }

  rc = libssh.ssh_userauth_password(my_ssh_session, stringToNativeInt8(username), stringToNativeInt8(password));
  if (rc != ssh_auth_e.SSH_AUTH_SUCCESS) {
    var error = libssh.ssh_get_error(my_ssh_session.cast());
    print("Error authenticating with password:$error\n");
    libssh.ssh_disconnect(my_ssh_session);
    libssh.ssh_free(my_ssh_session);
  }

  // 下载文件
  await libssh.sftpDownloadFileTo(my_ssh_session, '/home/isaque.neves/teste.mp4', path.join(Directory.current.path, 'teste.mp4'));

  // 断开连接
  libssh.ssh_disconnect(my_ssh_session);
  libssh.ssh_free(my_ssh_session);

  exit(0);
}

高级示例

import 'package:libssh_binding/libssh_binding.dart';

void main() {
  final libssh = LibsshWrapper('localhost', username: 'root', password: 'pass', port: 22);
  libssh.connect();
  final start = DateTime.now();

  // 下载文件
  /*await libssh.scpDownloadFileTo('/home/isaque.neves/go1.11.4.linux-amd64.tar.gz',
      path.join(Directory.current.path, 'go1.11.4.linux-amd64.tar.gz'), callbackStats: (total, loaded) {
    var progress = ((loaded / total) * 100).round();
    stdout.write('\r');
    stdout.write('\r[${List.filled(((progress / 10) * 4).round(), '=').join()}] $progress%');
  });*/

  // 执行命令
  var re = libssh.execCommandSync('cd /var/www; ls -l');
  print(re);

  // 执行多个命令
  //var re = libssh.execCommandsInShell(['cd /var/www', 'ls -l']);
  //print(re.join(''));

  // 下载目录
  await libssh.scpDownloadDirectory('/var/www',
      path.join(Directory.current.path, 'download'));

  print('${DateTime.now().difference(start)}');
  libssh.dispose();
}

更多关于Flutter SSH连接插件libssh_binding的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter SSH连接插件libssh_binding的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,关于Flutter中使用libssh_binding库来实现SSH连接,以下是一个基本的代码示例。这个示例展示了如何使用libssh_binding库在Flutter应用中建立SSH连接并执行远程命令。请注意,libssh_binding是一个Dart库,用于与libssh库进行交互,提供SSH功能。

首先,你需要在你的pubspec.yaml文件中添加libssh_binding依赖:

dependencies:
  flutter:
    sdk: flutter
  libssh_binding: ^x.y.z  # 请替换为最新版本号

然后运行flutter pub get来安装依赖。

以下是一个使用libssh_binding库的简单示例代码:

import 'dart:typed_data';
import 'package:flutter/material.dart';
import 'package:libssh_binding/libssh_binding.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  String result = '';

  @override
  void initState() {
    super.initState();
    _connectAndExecuteCommand();
  }

  Future<void> _connectAndExecuteCommand() async {
    try {
      // 初始化libssh
      final ssh = await SSH.init();

      // 创建SSH会话
      final session = await ssh.session();
      await session.open();

      // 设置SSH选项
      await session.setOption(SSH_OPTIONS_HOST, Uint8List.fromList('your.ssh.server'.codeUnits));
      await session.setOption(SSH_OPTIONS_USER, Uint8List.fromList('your_username'.codeUnits));

      // 尝试连接
      await session.connect();

      // 认证(这里使用密码认证,你也可以使用公钥认证)
      await session.authPassword(Uint8List.fromList('your_password'.codeUnits));

      // 打开一个通道
      final channel = await session.openChannelExec(Uint8List.fromList('your_command'.codeUnits));

      // 读取通道输出
      List<int> buffer = Uint8List(1024);
      int bytesRead;
      while ((bytesRead = await channel.read(buffer)) > 0) {
        result += String.fromCharCodes(buffer.sublist(0, bytesRead));
      }

      // 关闭通道和会话
      await channel.close();
      await session.disconnect();
      await ssh.finalize();

      // 更新UI
      setState(() {});

    } catch (e) {
      result = 'Error: $e';
      setState(() {});
    }
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('SSH Connection Example'),
        ),
        body: Center(
          child: Text(result),
        ),
      ),
    );
  }
}

注意事项

  1. libssh_binding是一个相对底层的库,它直接与libssh C库交互。这意味着你可能需要处理一些低级细节,比如内存管理和错误处理。
  2. 在实际应用中,硬编码用户名、密码和服务器地址是不安全的。你应该考虑使用更安全的方法来存储和检索这些敏感信息。
  3. 上述代码示例假设你已经正确配置了libssh库,并且你的Flutter环境可以访问它。这可能需要一些额外的设置,具体取决于你的开发环境。
  4. 示例中的错误处理非常简单。在实际应用中,你可能需要更详细的错误处理和日志记录。
  5. 由于libssh_binding库的API可能会随着版本的更新而变化,因此请务必查阅最新的文档和示例代码。

希望这个示例能帮助你理解如何在Flutter中使用libssh_binding库来实现SSH连接。如果你有任何进一步的问题,请随时提问。

回到顶部