在 .NET 上发送和接收 SFTP

页面创建日期 :

环境

Visual Studio
  • Visual Studio Community 2017
  • Visual Studio Community 2019
.NET Core
  • 3.1
.NET Framework
  • 4
  • 4.8
SSH.NET
  • 2016.1.0

* 它适用于其他版本,但尚未确认

入门

创建客户端程序,以便在 .NET 框架 (.NET Core) 中发送和接收 SFTP 文件。 与 SFTP 相关的程序不是 .NET 的标准程序。 在这里,我们使用第三方库SSH.NET

SSH.NET 最近未更新,但可以相对轻松地实现程序 因为它也支持 .NET 标准,我认为使用没有太大的缺点。

这一次,您将在 .NET 核心控制台项目中使用 SFTP 发送和接收文件。 SSH.NET 支持许多框架,因此可以在控制台以外的项目中实现。

提前准备

  • 已安装视觉工作室
  • 您有一个 SFTP 服务器来检查 SFTP 的工作原理
  • 准备好使用 SFTP 连接的帐户
  • 在 SFTP 服务器上启用密码身份验证以执行密码身份验证
  • 执行公钥身份验证时,请将公钥放在 SFTP 服务器上,并准备要加载到客户端的私钥(OpenSSH 格式)

安装 SSH.NET

在视觉工作室中创建 .NET 核心控制台项目。 将项目名称命名为"SshNetBasic"。

从 NuGet 获取 SSH.NET。

image

image

image

image

已添加包。

image

密码身份验证

对于密码身份验证,请使用密码身份验证方法类设置用户名和密码。

在"连接信息"类中设置主机名(如 sorceryforce.net 和 192.168.0.1),以及刚刚生成的身份验证方法。 传递给"Sftp客户端"类。

使用 SftpClient.Connect 方法实际连接,如果成功,则向下一步操作,如果失败,则引发异常。 使用"发现"方法断开连接。

// 必要な情報を設定する
var host = "";
var userName = "";
var password = "";

// 認証メソッドを作成
var authMethod = new Renci.SshNet.PasswordAuthenticationMethod(userName, password);

// 接続情報を作成
var connectionInfo = new Renci.SshNet.ConnectionInfo(host, userName, authMethod);

// SFTP クライアントを作成
var client = new Renci.SshNet.SftpClient(connectionInfo);

// 接続。失敗した場合は例外が発生
client.Connect();

// 切断
client.Disconnect();

公钥身份验证

将私钥放在客户端的任何文件夹中。 正如您在设置提示中提到的,如果将私钥放在可以访问其他帐户的文件夹中, SFTP 操作可能会失败。 请确保只有您运行的帐户或管理员才能访问它。

image

与密码身份验证不同,身份验证方法已更改为"私有密钥身份验证方法"。

第二个参数是"私钥文件",并指定私钥所在的文件路径和密码(如果已设置)。

// 必要な情報を設定する
var host = "";
var userName = "";
var passPhrase = "";
var keyFilePath = @"C:\xxxxxxxxxx\id_rsa";

// 認証メソッドを作成
var authMethod = new Renci.SshNet.PrivateKeyAuthenticationMethod(userName,
                      new Renci.SshNet.PrivateKeyFile(keyFilePath, passPhrase));

// 接続情報を作成
var connectionInfo = new Renci.SshNet.ConnectionInfo(host, userName, authMethod);

// SFTP クライアントを作成
var client = new Renci.SshNet.SftpClient(connectionInfo);

// 接続。失敗した場合は例外が発生
client.Connect();

// 切断
client.Disconnect();

使用 SFTP 发送和接收文件

使用 SftpClient.Connect 方法连接到服务器后,编写发送和接收代码以发送和接收文件。 我所做的是"读取本地文件并将其发送到 SFTP 服务器"和"从 SFTP 服务器下载文件并将其保存到本地"。 无需编写特别困难的处理即可实现它。

您可以发送和接收日语文件名,没有任何问题。

/* ---------------- 中略 ------------------- */

var sendFilePath = @"C:\xxxxxxxxxxxx\テスト.txt";
var reseiveFilePath = @"C:\xxxxxxxxxxxx\テスト2.txt";

/* ---------------- 中略 ------------------- */

// 接続。失敗した場合は例外が発生
client.Connect();

// ファイルのアップロード(上書き)
using var sendStream = File.OpenRead(sendFilePath);
client.UploadFile(sendStream, Path.GetFileName(sendFilePath), true);

// ファイルのダウンロード(上書き)
using var reseiveStream = File.OpenWrite(reseiveFilePath);
client.DownloadFile(Path.GetFileName(sendFilePath), reseiveStream);

// 切断
client.Disconnect();

总结

SSH.NET 使发送和接收 SFTP 变得更加容易。 设置测试环境所需的时间可能比实现程序的时间长。

SFTP 处理基本上与 FTP 相同,SSH.NET 但大多数操作都已实现。 如果要以编程方式使用 SFTP,建议使用库。