.NET에서 SFTP를 보내고 받으십시오.

페이지 생성 날짜 :

환경

비주얼 스튜디오
  • 비주얼 스튜디오 커뮤니티 2017
  • 비주얼 스튜디오 커뮤니티 2019
.NET 코어
  • 3.1
.NET 프레임워크
  • 4
  • 4.8
SSH.NET
  • 2016.1.0

※ 다른 버전에서는 작동하지만 확인되지 않았습니다.

처음에

SFTP에 대한 클라이언트 프로그램을 만들어 .NET Framework(.NET Core)에서 파일을 보내고 수신합니다. SFTP 관련 프로그램은 .NET에서 표준이 아닙니다. 우리는 타사라이브러리SSH.NET 사용합니다.

SSH.NET 최근에 업데이트되지 않았지만 프로그램을 구현하기가 비교적 쉽습니다. 나는 또한 .NET 표준을 지원하기 때문에 그것을 사용하는 많은 단점이 있다고 생각하지 않습니다.

이번에는 .NET 코어 콘솔 프로젝트에서 SFTP에 의해 파일을 보내고 수신합니다. SSH.NET 많은 프레임워크를 지원하므로 콘솔 이외의 프로젝트에서 구현할 수 있습니다.

사전 준비

  • 비주얼 스튜디오를 설치해야 합니다.
  • SFTP 서버가 있어 sftp 동작을 확인합니다.
  • SFTP로 연결할 수 있는 계정
  • 암호 인증을 수행할 때 sftp 서버에서 암호 인증 사용
  • 공개 키 인증을 수행할 때 는 SFTP 서버에 공개 키를 배치하고 클라이언트에 로드할 개인 키(OpenSSH 형식)를 갖습니다.

설치 SSH.NET

비주얼 스튜디오에서 .NET 코어 콘솔 프로젝트를 만듭니다. 프로젝트 이름은 SshNetBasic입니다.

NuGet에서 "SSH.NET"를 가져옵니다.

image

image

image

image

패키지가 추가되었습니다.

image

암호 인증

암호 인증의 경우 PasswordAuthenticationMethod 클래스를 사용하여 사용자 이름과 암호를 설정합니다.

연결 정보 클래스를 호스트 이름(예: sorceryforce.net 또는 192.168.0.1)과 방금 생성한 인증 방법으로 설정합니다. "SftpClient" 클래스에 전달합니다.

SftpClient.Connect 메서드는 실제로 연결을 만들고 성공하면 다음 작업 및 오류가 발생할 경우 예외를 throw합니다. 분리 메서드를 연결 해제합니다.

// 必要な情報を設定する
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를 프로그래밍으로 사용하려는 경우에 권장됩니다.