Estou tentando recuperar um arquivo de um servidor usando SFTP (em oposição ao FTPS) usando Java. Como posso fazer isso?
228
Outra opção é considerar a consulta à biblioteca JSch . JSch parece ser a biblioteca preferida para alguns grandes projetos de código aberto, incluindo Eclipse, Ant e Apache Commons HttpClient, entre outros.
Ele suporta logins baseados em certificado / usuário e certificado, bem como todo um host inteiro de outros recursos SSH2 saborosos.
Aqui está um simples arquivo remoto recuperado por SFTP. O tratamento de erros é deixado como um exercício para o leitor :-)
JSch jsch = new JSch();
String knownHostsFilename = "/home/username/.ssh/known_hosts";
jsch.setKnownHosts( knownHostsFilename );
Session session = jsch.getSession( "remote-username", "remote-host" );
{
// "interactive" version
// can selectively update specified known_hosts file
// need to implement UserInfo interface
// MyUserInfo is a swing implementation provided in
// examples/Sftp.java in the JSch dist
UserInfo ui = new MyUserInfo();
session.setUserInfo(ui);
// OR non-interactive version. Relies in host key being in known-hosts file
session.setPassword( "remote-password" );
}
session.connect();
Channel channel = session.openChannel( "sftp" );
channel.connect();
ChannelSftp sftpChannel = (ChannelSftp) channel;
sftpChannel.get("remote-file", "local-file" );
// OR
InputStream in = sftpChannel.get( "remote-file" );
// process inputstream as needed
sftpChannel.exit();
session.disconnect();
Aqui está o código fonte completo de um exemplo usando JSch sem ter que se preocupar com a verificação da chave ssh.
fonte
finally
bloco deve ser usado para incluir o código de limpeza do canal, para garantir que ele sempre seja executado.com.jcraft.jsch.JSchException: Session.connect: java.security.InvalidAlgorithmParameterException: Prime size must be multiple of 64, and can only range from 512 to 2048 (inclusive)
Abaixo está um exemplo usando o Apache Common VFS:
fonte
Esta foi a solução que eu vim com http://sourceforge.net/projects/sshtools/ (a maioria dos erros omitidos por questões de clareza). Este é um trecho do meu blog
fonte
Uma boa abstração sobre o Jsch é o Apache commons-vfs, que oferece uma API de sistema de arquivos virtual que torna quase transparente o acesso e a gravação de arquivos SFTP. Funcionou bem para nós.
fonte
Há uma boa comparação das três bibliotecas Java maduras para SFTP: Commons VFS, SSHJ e JSch
Para resumir, o SSHJ tem a API mais clara e é a melhor delas, se você não precisar de outros apoios de armazenamento fornecidos pelo Commons VFS.
Aqui está o exemplo SSHJ editado no github :
fonte
Arquivo de propriedades Java comum para todos os exemplos
serverAddress = 111.222.333.444
userId = myUserId
password = myPassword
remoteDirectory = produtos /
localDirectory = import /
fonte
hierynomus / sshj possui uma implementação completa do SFTP versão 3 (o que o OpenSSH implementa)
Código de exemplo de SFTPUpload.java
fonte
A biblioteca JSch é a biblioteca poderosa que pode ser usada para ler arquivos do servidor SFTP. Abaixo está o código testado para ler o arquivo do local SFTP linha por linha
Por favor, consulte o blog para todo o programa.
fonte
Andy, para excluir o arquivo no sistema remoto, você precisa usar o
(channelExec)
JSch e passar os comandos unix / linux para excluí-lo.fonte
Experimente o edtFTPj / PRO , uma biblioteca de clientes SFTP robusta e madura que suporta pools de conexões e operações assíncronas. Também suporta FTP e FTPS, para que todas as bases para transferência segura de arquivos sejam cobertas.
fonte
Encontrei um exemplo de trabalho completo para SFTP em java usando a API JSCH http://kodehelp.com/java-program-for-uploading-file-to-sftp-server/
fonte
Embora as respostas acima tenham sido muito úteis, passei um dia para fazê-las funcionar, enfrentando várias exceções como "canal quebrado", "chave rsa desconhecida" e "pacote corrompido".
Abaixo está uma classe reutilizável de trabalho para SFTP FILE UPLOAD / DOWNLOAD usando a biblioteca JSch.
Uso de upload:
Uso do download:
O código da classe:
fonte
Você também possui o JFileUpload com complemento SFTP (Java também): http://www.jfileupload.com/products/sftp/index.html
fonte
Eu uso essa API SFTP chamada Zehon, é ótima, muito fácil de usar com muito código de exemplo. Aqui está o site http://www.zehon.com
fonte
A melhor solução que encontrei é a Paramiko . Existe uma versão Java.
fonte