ส่งและรับ SFTP บน .NET

วันที่สร้างเพจ :

สภาพแวดล้อม

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

* มันสามารถใช้ได้กับรุ่นอื่น ๆ แต่ยังไม่ได้ยืนยัน

เริ่มต้นใช้งาน

สร้างโปรแกรมไคลเอ็นต์เพื่อส่งและรับไฟล์ SFTP ใน .NET Framework (.NET Core) โปรแกรมที่เกี่ยวข้องกับ SFTP ไม่ใช่โปรแกรมมาตรฐาน .NET ที่นี่เราใช้ห้องสมุดของบุคคลที่สามSSH.NET

SSH.NET ไม่ได้รับการปรับปรุงเมื่อเร็ว ๆ นี้ แต่โปรแกรมสามารถดําเนินการค่อนข้างง่าย เนื่องจากยังสนับสนุนมาตรฐาน .NET ผมคิดว่าไม่มีข้อเสียมากในการใช้งาน

เวลานี้ คุณจะส่งและรับแฟ้มโดยใช้ SFTP ในโครงการคอนโซลหลัก .NET SSH.NET สนับสนุนกรอบงานจํานวนมากเพื่อให้สามารถดําเนินการในโครงการนอกคอนโซล

เตรียมตัวให้พร้อม

  • สตูดิโอภาพได้รับการติดตั้ง
  • คุณมีเซิร์ฟเวอร์ SFTP เพื่อตรวจสอบวิธีการทํางานของ SFTP
  • พร้อมที่จะใช้บัญชีที่เชื่อมต่อด้วย SFTP
  • เปิดใช้งานการรับรองความถูกต้องของรหัสผ่านบนเซิร์ฟเวอร์ SFTP เพื่อดําเนินการรับรองความถูกต้องของรหัสผ่าน
  • เมื่อดําเนินการรับรองความถูกต้องคีย์สาธารณะ ให้วางคีย์สาธารณะบนเซิร์ฟเวอร์ SFTP และเตรียมคีย์ส่วนตัวที่จะโหลดลงในไคลเอ็นต์ (รูปแบบ OpenSSH)

ติดตั้ง SSH.NET

สร้างโครงการคอนโซลหลัก .NET ใน Visual Studio ตั้งชื่อโครงการว่า "SshNetBasic"

รับ SSH.NET จาก NuGet

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 โดยทางโปรแกรม ขอแนะนําให้ใช้ไลบรารี