在 .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。
已添加包。
密码身份验证
对于密码身份验证,请使用密码身份验证方法类设置用户名和密码。
在"连接信息"类中设置主机名(如 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 操作可能会失败。 请确保只有您运行的帐户或管理员才能访问它。
与密码身份验证不同,身份验证方法已更改为"私有密钥身份验证方法"。
第二个参数是"私钥文件",并指定私钥所在的文件路径和密码(如果已设置)。
// 必要な情報を設定する
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,建议使用库。