Kirim dan terima SFTP di .NET

Tanggal pembuatan halaman :

lingkungan

Visual Studio
  • Komunitas Visual Studio 2017
  • Komunitas Visual Studio 2019
Inti .NET
  • 3.1
.NET Framework
  • 4
  • 4.8
SSH.NET
  • 2016.1.0

※ Ini bekerja dalam versi lain, tetapi belum dikonfirmasi

Pada awalnya

Buat program klien untuk SFTP untuk mengirim dan menerima file di .NET Framework (.NET Core). Program terkait SFTP tidak standar dalam .NET. Kami akan menggunakan perpustakaanpihak ketigaSSH.NET.

SSH.NET belum diperbarui baru-baru ini, tetapi relatif mudah untuk menerapkan program ini. Saya tidak berpikir ada banyak kerugian menggunakannya karena juga mendukung .NET Standard.

Kali ini, kami akan mengirim dan menerima file oleh SFTP dalam proyek konsol .NET Core. SSH.NET mendukung banyak kerangka kerja, sehingga dapat diimplementasikan dalam proyek selain konsol.

Persiapan sebelumnya

  • Visual Studio harus diinstal
  • Anda memiliki server SFTP untuk memverifikasi perilaku sftp
  • Memiliki akun yang dapat Anda sambungkan dengan SFTP
  • Mengaktifkan autentikasi kata sandi di server sftp saat melakukan autentikasi kata sandi
  • Saat melakukan autentikasi kunci publik, letakkan kunci publik di server SFTP dan miliki kunci pribadi (format OpenSSH) untuk dimuat ke klien.

Instal SSH.NET

Buat proyek konsol .NET Core di Visual Studio. Nama proyeknya adalah SshNetBasic.

Mendapatkan "SSH.NET" dari NuGet.

image

image

image

image

Paket tersebut sudah ditambahkan.

image

Autentikasi kata sandi

Untuk autentikasi kata sandi, gunakan kelas PasswordAuthenticationMethod untuk mengatur nama pengguna dan kata sandi.

Atur kelas ConnectionInfo dengan nama host (seperti sorceryforce.net atau 192.168.0.1) dan autentikasi yang baru saja Anda hasilkan. Sampaikan ke kelas "SftpClient".

Metode SftpClient.Connect benar-benar membuat koneksi, dan jika berhasil, itu melemparkan pengecualian untuk operasi berikutnya dan, jika terjadi kegagalan. Putuskan sambungan dengan metode Disconnect.

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

Autentikasi kunci publik

Tempatkan kunci pribadi di folder apa pun pada klien. Seperti yang dapat Anda lihat dalam tips penyetelan, jika Anda menempatkan kunci pribadi Anda di folder yang dapat mengakses akun lain, Pemrosesan SFTP mungkin gagal. Pastikan untuk memastikan bahwa Anda memiliki akses ke akun yang Anda jalankan atau hanya Administrator.

image

Apa yang berbeda dari otentikasi kata sandi adalah bahwa metode otentikasi telah berubah menjadi PrivateKeyAuthenticationMethod.

Tentukan "PrivateKeyFile" sebagai argumen kedua dan tentukan jalur file dan frasa sandi (jika diatur) di mana kunci pribadi ditempatkan.

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

Mengirim dan menerima file dengan SFTP

Kirim dan terima file dengan menulis kode kirim dan terima setelah terhubung ke server dengan metode SftpClient.Connect. Apa yang kami lakukan adalah "membaca file lokal dan mengirimnya ke server SFTP" dan "mengunduh file dari server SFTP dan menyimpannya secara lokal". Hal ini dapat dilaksanakan tanpa menulis tugas-tugas yang sangat sulit.

Anda dapat mengirim dan menerima nama file Jepang 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 membuatnya lebih mudah untuk mengirim dan menerima SFTP. Mungkin butuh waktu lebih lama untuk mempersiapkan lingkungan uji daripada menerapkan program.

Sftp pada dasarnya melakukan hal yang sama seperti FTP, dan sebagian besar pekerjaan diimplementasikan dalam SSH.NET. Pustaka ini direkomendasikan jika Anda ingin menggunakan program SFTP.