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