ارسال و دریافت SFTP در .NET

تاریخ ایجاد صفحه :

محیط

ویژوال استودیو
  • ویژوال استودیو جامعه 2017
  • ویژوال استودیو جامعه 2019
.NET Core
  • 3.1
.NET Framework
  • 4
  • 4.8
SSH.NET
  • 2016.1.0

آثار این نسخه ها در نسخه های دیگر، اما آن را تایید نشده است

در ابتدا

ایجاد یک برنامه سرویس گیرنده برای SFTP برای ارسال و دریافت فایل ها در چارچوب .NET (.NET Core). برنامه های مرتبط با SFTP در .NET استاندارد نیستند. ما از کتابخانه شخصثالث استفاده SSH.NET.

SSH.NET به تازگی به روز نشده است، اما اجرای این برنامه نسبتاً آسان است. من فکر نمی کنم بسیاری از معایب استفاده از آن وجود دارد چرا که آن را نیز پشتیبانی از .NET استاندارد.

این بار فایل ها را توسط SFTP در پروژه کنسول .NET Core ارسال و دریافت خواهیم کرد. SSH.NET بسیاری از چارچوب ها را پشتیبانی می کند، بنابراین می توان آن را در پروژه هایی غیر از کنسول پیاده سازی کرد.

آماده سازی در پیش

  • ویژوال استودیو باید نصب شود
  • شما یک سرور SFTP برای بررسی رفتار sftp
  • یک حساب کاربری داشته باشید که می توانید با SFTP به آن متصل شوید
  • فعال کردن احراز هویت رمز عبور در سرورهای sftp هنگام انجام احراز هویت رمز عبور
  • هنگام انجام احراز هویت کلید عمومی، کلید عمومی را روی سرور SFTP قرار داده و یک کلید خصوصی (فرمت OpenSSH) داشته باشید تا در سرویس گیرنده بارگذاری شود.

نصب SSH.NET

ایجاد یک پروژه کنسول .NET Core در Visual Studio. نام پروژه SshNetBasic است.

می شود "SSH.NET" از NuGet.

image

image

image

image

بسته اضافه شده است.

image

احراز هویت رمز عبور

برای احراز هویت رمز عبور، از کلاس PasswordAuthenticationMethod برای تنظیم یک نام کاربری و رمز عبور استفاده کنید.

تنظیم کلاس ConnectionInfo با نام میزبان (مانند sorceryforce.net یا 192.168.0.1) و authenticationmethod که شما به تازگی تولید شده است. آن را به کلاس "SftpClient" منتقل کنید.

روش 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

چیزی که با احراز هویت رمز متفاوت است این است که روش احراز هویت به PrivateKeyAuthenticationMethod تغییر کرده است.

"PrivateKeyFile" را به عنوان آرگوم دوم مشخص کنید و مسیر فایل و عبارت عبور (در صورت تنظیم) را که کلید خصوصی در آن قرار می گیرد مشخص کنید.

// 必要な情報を設定する
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 به صورت برنامه ای استفاده کنید.