Enviar e receber SFTP em .NET

Data de criação de página :

ambiente

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

◗ Funciona em outras versões, mas não é confirmado

Inicialmente

Crie um programa de cliente para o SFTP enviar e receber arquivos no .NET Framework (.NET Core). Os programas relacionados ao SFTP não são padrão em .NET. Usaremos a bibliotecade terceirosSSH.NET.

SSH.NET não foi atualizado recentemente, mas é relativamente fácil implementar o programa. Não acho que existam muitas desvantagens em usá-lo porque ele também suporta o .NET Standard.

Desta vez, enviaremos e receberemos arquivos do SFTP no projeto do console .NET Core. SSH.NET suporta muitas estruturas, para que possa ser implementado em projetos diferentes do console.

Preparação com antecedência

  • Visual Studio deve ser instalado
  • Você tem um servidor SFTP para verificar o comportamento do SFTP
  • Tenha uma conta para a sua caixa com o SFTP
  • Habilite a autenticação de senha em servidores sftp ao realizar a autenticação de senha
  • Ao realizar a autenticação de chaves públicas, coloque a chave pública no servidor SFTP e tenha uma chave privada (formato OpenSSH) para ser carregada no cliente.

Instale SSH.NET

Crie um projeto de console .NET Core no Visual Studio. O nome do projeto é SshNetBasic.

Recebe o "SSH.NET" da NuGet.

image

image

image

image

O pacote foi adicionado.

image

Autenticação de senha

Para autenticação de senha, use a classe PasswordAuthenticationMethod para definir um nome de usuário e senha.

Defina a classe ConnectionInfo com um nome de host (como sorceryforce.net ou 192.168.0.1) e o método de autenticação que você acabou de gerar. Passe para a aula "SftpClient".

O método SftpClient.Connect realmente faz a conexão, e se ele tiver sucesso, ele lança uma exceção para a próxima operação e, em caso de falha. Desconecte-se com o método Desconectar.

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

Autenticação de chaves públicas

Coloque a chave privada em qualquer pasta no cliente. Como você pode ver nas dicas de configuração, se você colocar sua chave privada em uma pasta que pode acessar outras contas, O processamento do SFTP pode falhar. Certifique-se de ter acesso à conta que executa ou apenas aos administradores.

image

O que é diferente da autenticação de senha é que o método de autenticação mudou para PrivateKeyAuthenticationMethod.

Especifique "PrivateKeyFile" como o segundo argumento e especifique o caminho do arquivo e a senha (se definido) onde a chave privada está colocada.

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

Enviar e receber arquivos com SFTP

Enviar e receber arquivos escrevendo o código de envio e recebimento após a conexão ao servidor com o método SftpClient.Connect. O que estamos fazendo é "ler arquivos locais e enviá-los para servidores SFTP" e "baixar arquivos de servidores SFTP e salvá-los localmente". Pode ser implementado sem escrever tarefas particularmente difíceis.

Você pode enviar e receber nomes de arquivos japoneses sem problemas.

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

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

Resumo

SSH.NET facilita o envio e o recebimento de SFTP. Pode levar mais tempo para preparar um ambiente de teste do que implementar um programa.

Sftp faz essencialmente a mesma coisa que FTP, e a maior parte do trabalho é implementado em SSH.NET. Esta biblioteca é recomendada se você quiser usar o SFTP de forma programável.