📌  相关文章
📜  使用 pem 将本地上传到服务器 ssh - Dart (1)

📅  最后修改于: 2023-12-03 14:49:44.688000             🧑  作者: Mango

在 Dart 项目中使用 PEM 文件将本地文件上传到服务器 via SSH

在 Dart 项目中,我们经常需要将本地文件上传到服务器上,以便在服务器端进行处理或保存。其中,SSH 是一种安全的远程连接协议,在本地和远程主机之间建立加密连接,可以安全地传输文件。

对于使用 SSH 连接服务器的开发者,PEM(Privacy-Enhanced Mail)文件是一个常见的文件格式,用于存储 SSL 和 SSH 密钥。在 Dart 项目中使用 PEM 文件,我们可以通过 SSH 连接远程服务器,并将本地文件上传到服务器上。

安装依赖

在实现本地上传到服务器 SSH 的功能前,我们需要安装 sshcrypto 依赖:

    dependencies:
      ssh: ^0.4.0
      crypto: ^2.1.3
加载 PEM 文件

使用 SSH 连接服务器需要加载 PEM 文件中的私钥。在 Dart 中,我们可以使用 ssh_key_from_pem 函数加载 PEM 文件:

import 'dart:convert';
import 'dart:io';
import 'package:ssh/ssh.dart';
import 'package:crypto/crypto.dart';

Future<SshClient> sshConnect() async {
  var ssh = new SshClient(host: 'server_ip', port: 22, username: 'root');
  var privateKey = await File('path_to_pem_file').readAsString();
  ssh.connectSsh(
      privateKey: ssh_key_from_pem(privateKey),
      connectTimeout: Duration(seconds: 10));
  return ssh;
}

在上面的代码中,我们使用 File 类读取 PEM 文件,并将其加载为 SSH 私钥。然后,我们创建一个 SshClient 客户端对象,将其私钥设置为 PEM 文件的私钥,连接远程服务器。注意,PEM 文件的路径需要根据自己的实际情况进行修改。

上传文件

在加载 PEM 文件后,我们即可使用 SSH 客户端对象上传文件到远程服务器了。以下是一个实现本地文件上传到服务器 SSH 的示例:

Future<void> uploadFile(String localPath, String remotePath) async {
  final ssh = await sshConnect();
  final sftp = new SFTP(ssh);
  final bytes = await File(localPath).readAsBytes();
  final md5 = md5.convert(bytes).toString();
  await sftp.connect();
  await sftp.mkdir(remotePath);
  await sftp.writeFile(remotePath + '/' + md5 + '.png', bytes);
  await sftp.disconnect();
}

在上述代码中,我们首先通过 sshConnect()函数获取 SSH 客户端连接。然后,我们创建一个 SFTP 对象,用于操作远程服务器上的文件。在将本地文件上传到远程服务器前,我们需要先将文件夹创建好。然后,我们读取本地文件的二进制数据,并计算 MD5 哈希值,以便在远程服务器上唯一标识这个文件。最后,我们使用 writeFile 函数将二进制数据写入远程文件。

注意:远程文件夹和文件路径需要根据自己的实际情况进行修改。

至此,我们就完成了在 Dart 项目中使用 PEM 文件将本地文件上传到服务器 via SSH 的功能。

参考