在 .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,建議使用庫。