Hantar dan terima SFTP dalam .NET

Tarikh penciptaan halaman :

Persekitaran

Visual Studio
  • Komuniti Studio Visual 2017
  • Komuniti Studio Visual 2019
.NET Core
  • 3.1
Rangka Kerja .NET
  • 4
  • 4.8
SSH.NET
  • 2016.1.0

※ Ia berfungsi dalam versi lain, tetapi ia tidak disahkan

Pada mulanya

Cipta program klien untuk SFTP hantar dan terima fail dalam Rangka Kerja .NET (.NET Core). Program berkaitan SFTP tidak standard dalam .NET. Kami akan menggunakan perpustakaanpihak ketigaSSH.NET .

SSH.NET belum dikemaskini baru-baru ini, tetapi agak mudah untuk melaksanakan program ini. Saya tidak fikir terdapat banyak kelemahan menggunakannya kerana ia juga menyokong .NET Standard.

Kali ini, kami akan menghantar dan menerima fail oleh SFTP dalam projek konsol Teras .NET. SSH.NET menyokong banyak rangka kerja, jadi ia boleh dilaksanakan dalam projek selain daripada konsol.

Persediaan terlebih dahulu

  • Visual Studio mesti dipasang
  • Anda mempunyai pelayan SFTP untuk mengesahkan kelakuan sftp
  • Mempunyai akaun yang anda boleh berhubung dengan SFTP
  • Mendayakan pengesahan kata laluan pada pelayan sftp apabila melaksanakan pengesahan kata laluan
  • Semasa melaksanakan pengesahan kunci awam, letakkan kunci awam pada pelayan SFTP dan mempunyai kunci peribadi (format OpenSSH) untuk dimuatkan ke dalam klien.

Pasang SSH.NET

Cipta projek konsol Teras .NET dalam Visual Studio. Nama projek ialah SshNetBasic.

Dapatkan "SSH.NET" dari NuGet.

image

image

image

image

Pakej telah ditambah.

image

Pengesahan kata laluan

Untuk pengesahan kata laluan, gunakan kelas PasswordAuthenticationMethod untuk menetapkan nama pengguna dan kata laluan.

Setkan kelas ConnectionInfo dengan nama hos (seperti sorceryforce.net atau 192.168.0.1) dan pengesahan yang baru sahaja anda hasilkan. Hantar ke kelas "SftpClient".

Kaedah SftpClient.Connect sebenarnya membuat sambungan, dan jika ia berjaya, ia melemparkan pengecualian kepada operasi seterusnya dan, sekiranya gagal. Putuskan sambungan dengan kaedah Putus.

// 必要な情報を設定する
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();

Pengesahan kekunci awam

Letakkan kunci peribadi dalam sebarang folder pada klien. Seperti yang anda lihat dalam petua persediaan, jika anda meletakkan kunci peribadi anda dalam folder yang boleh mengakses akaun lain, Pemprosesan SFTP mungkin gagal. Pastikan anda mempunyai akses kepada akaun yang anda jalankan atau hanya Pentadbir.

image

Apa yang berbeza daripada pengesahan kata laluan ialah kaedah pengesahan telah berubah kepada PrivateKeyAuthenticationMethod.

Tentukan "PrivateKeyFile" sebagai argumen kedua dan tentukan laluan fail dan frasa laluan (jika ditetapkan) di mana kunci peribadi diletakkan.

// 必要な情報を設定する
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();

Hantar dan terima fail dengan SFTP

Hantar dan terima fail dengan menulis hantar dan terima kod selepas menyambung ke pelayan dengan kaedah SftpClient.Connect. Apa yang kami lakukan adalah "membaca fail tempatan dan menghantarnya ke pelayan SFTP" dan "muat turun fail dari pelayan SFTP dan menyimpannya secara tempatan". Ia boleh dilaksanakan tanpa menulis tugas yang amat sukar.

Anda boleh menghantar dan menerima nama fail Jepun tanpa masalah.

/* ---------------- 中略 ------------------- */

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();

Ringkasan

SSH.NET memudahkan untuk menghantar dan menerima SFTP. Ia mungkin mengambil masa yang lebih lama untuk menyediakan persekitaran ujian daripada melaksanakan program.

Sftp pada dasarnya melakukan perkara yang sama seperti FTP, dan kebanyakan kerja dilaksanakan dalam SSH.NET. Perpustakaan ini disyorkan jika anda mahu menggunakan program SFTP.