Transferindo um arquivo por meio de SFTP em Java
1. Visão geral
Neste tutorial,we’ll discuss how to upload and download files from a remote server using SFTP in Java.
Usaremos três bibliotecas diferentes: JSch, SSHJ e Apache Commons VFS.
2. Usando JSch
Primeiro, vamos ver como fazer upload e download de arquivos de um servidor remoto usando a biblioteca JSch.
2.1. Configuração do Maven
Precisamos adicionar a dependênciajsch ao nossopom.xml:
com.jcraft
jsch
0.1.55
A versão mais recente dejsch pode ser encontrada emMaven Central.
2.2. Configurando JSch
Agora, vamos configurar JSch.
JSch permite usar autenticação de senha ou autenticação de chave pública para acessar um servidor remoto. Neste exemplo,we’ll use password authentication:
private ChannelSftp setupJsch() throws JSchException {
JSch jsch = new JSch();
jsch.setKnownHosts("/Users/john/.ssh/known_hosts");
Session jschSession = jsch.getSession(username, remoteHost);
jschSession.setPassword(password);
jschSession.connect();
return (ChannelSftp) jschSession.openChannel("sftp");
}
No exemplo acima,remoteHost representa o nome ou endereço IP do servidor remoto (ou seja, example.com). Podemos definir as variáveis usadas no teste como:
private String remoteHost = "HOST_NAME_HERE";
private String username = "USERNAME_HERE";
private String password = "PASSWORD_HERE";
Além disso, podemos gerar o arquivoknown_hosts usando o seguinte comando:
ssh-keyscan -H -t rsa REMOTE_HOSTNAME >> known_hosts
2.3. Upload de um arquivo com JSch
Agora,to upload a file to the remote server, we’ll use the method ChannelSftp.put():
@Test
public void whenUploadFileUsingJsch_thenSuccess() throws JSchException, SftpException {
ChannelSftp channelSftp = setupJsch();
channelSftp.connect();
String localFile = "src/main/resources/sample.txt";
String remoteDir = "remote_sftp_test/";
channelSftp.put(localFile, remoteDir + "jschFile.txt");
channelSftp.exit();
}
Neste exemplo, o primeiro parâmetro do método representa o arquivo local a ser transferido, por exemplo,src/main/resources/sample.txt, enquantoremoteDir é o caminho do diretório de destino no servidor remoto.
2.4. Baixando um arquivo com JSch
Também podemosdownload a file from the remote server using ChannelSftp.get():
@Test
public void whenDownloadFileUsingJsch_thenSuccess() throws JSchException, SftpException {
ChannelSftp channelSftp = setupJsch();
channelSftp.connect();
String remoteFile = "welcome.txt";
String localDir = "src/main/resources/";
channelSftp.get(remoteFile, localDir + "jschFile.txt");
channelSftp.exit();
}
OremoteFile é o caminho do arquivo a ser baixado, elocalDir representa o caminho do diretório local de destino:
3. Usando SSHJ
A seguir, usaremos a biblioteca SSHJ para fazer upload e download de arquivos de um servidor remoto.
3.1. Configuração do Maven
Primeiro, vamos adicionar a dependência ao nossopom.xml:
com.hierynomus
sshj
0.27.0
A versão mais recente desshj pode ser encontrada emMaven Central.
3.2. Configurando SSHJ
A seguir,we’ll set up the SSHClient.
O SSHJ também nos permite usar a autenticação por senha ou chave pública para acessar o servidor remoto.
Usaremos a autenticação de senha em nosso exemplo:
private SSHClient setupSshj() throws IOException {
SSHClient client = new SSHClient();
client.addHostKeyVerifier(new PromiscuousVerifier());
client.connect(remoteHost);
client.authPassword(username, password);
return client;
}
3.3. Carregando um arquivo com SSHJ
Semelhante a JSch,we’ll use the SFTPClient.put() method to upload a file to the remote server:
@Test
public void whenUploadFileUsingSshj_thenSuccess() throws IOException {
SSHClient sshClient = setupSshj();
SFTPClient sftpClient = sshClient.newSFTPClient();
sftpClient.put(localFile, remoteDir + "sshjFile.txt");
sftpClient.close();
sshClient.disconnect();
}
Temos duas novas variáveis aqui para definir:
private String localFile = "src/main/resources/input.txt";
private String remoteDir = "remote_sftp_test/";
3.4. Baixando um arquivo com SSHJ
O mesmo vale para baixar um arquivo do servidor remoto - usaremosSFTPClient.get():
@Test
public void whenDownloadFileUsingSshj_thenSuccess() throws IOException {
SSHClient sshClient = setupSshj();
SFTPClient sftpClient = sshClient.newSFTPClient();
sftpClient.get(remoteFile, localDir + "sshjFile.txt");
sftpClient.close();
sshClient.disconnect();
}
E vamos adicionar as duas variáveis usadas acima:
private String remoteFile = "welcome.txt";
private String localDir = "src/main/resources/";
4. Usando Apache Commons VFS
Por fim, usaremos o Apache Commons VFS para transferir arquivos para um servidor remoto.
Na verdade,Apache Commons VFS uses JSch library internally.
4.1. Configuração do Maven
Precisamos adicionar a dependênciacommons-vfs2 ao nossopom.xml:
org.apache.commons
commons-vfs2
2.4
A versão mais recente decommons-vfs2 pode ser encontrada emMaven Central.
4.2. Carregando um arquivo com o Apache Commons VFS
O Apache Commons VFS é um pouco diferente.
UsaremosFileSystemManager para criarFileObjects de nossos arquivos de destino e, em seguida, usaremosFileObjects para transferir nossos arquivos.
Neste exemplo, faremos upload de um arquivo usando o métodoFileObject.copyFrom():
@Test
public void whenUploadFileUsingVfs_thenSuccess() throws IOException {
FileSystemManager manager = VFS.getManager();
FileObject local = manager.resolveFile(
System.getProperty("user.dir") + "/" + localFile);
FileObject remote = manager.resolveFile(
"sftp://" + username + ":" + password + "@" + remoteHost + "/" + remoteDir + "vfsFile.txt");
remote.copyFrom(local, Selectors.SELECT_SELF);
local.close();
remote.close();
}
Observe que o caminho do arquivo local deve ser absoluto e o caminho do arquivo remoto deve começar comsftp://username:[email protected]
4.3. Baixando um arquivo com Apache Commons VFS
Baixar um arquivo de um servidor remoto é muito semelhante -we’ll also use FileObject.copyFrom() to copy localFile from remoteFile:
@Test
public void whenDownloadFileUsingVfs_thenSuccess() throws IOException {
FileSystemManager manager = VFS.getManager();
FileObject local = manager.resolveFile(
System.getProperty("user.dir") + "/" + localDir + "vfsFile.txt");
FileObject remote = manager.resolveFile(
"sftp://" + username + ":" + password + "@" + remoteHost + "/" + remoteFile);
local.copyFrom(remote, Selectors.SELECT_SELF);
local.close();
remote.close();
}
5. Conclusão
Neste artigo, aprendemos como carregar e baixar arquivos de um servidor SFTP remoto em Java. Para isso, usamos várias bibliotecas: JSch, SSHJ e Apache Commons VFS.
O código-fonte completo pode ser encontradoover on GitHub.