Código Java para copiar arquivos de uma máquina linux para outra máquina linux

6

Eu estou procurando código java para copiar arquivos para um sistema Linux remoto. Eu tentei a função Runtime.getRuntime().exec() passando um comando scp , mas toda vez que executo o programa, ele está solicitando a senha do sistema remoto. Eu gostaria de evitar isso.

Eu olhei para a biblioteca Jsch - usando isso eu consigo acessar um sistema remoto - mas não consigo copiar os arquivos para o sistema remoto. Depois que eu fizer o login, posso fazer scp no meu host, mas novamente ele exige o nome de usuário e a senha do sistema host. No entanto, só tenho informações do sistema remoto.

    
por Thushi 09.06.2014 / 08:40

2 respostas

2

Copiar um arquivo de um host para outro requer um daemon no host remoto, implementando algum protocolo de transmissão de arquivos em nível de aplicativo. Esta é uma exigência, não importa de qual idioma você vai falar com esse daemon remoto.

Suas opções para sistemas Linux são:

  • SSH. Isso requer um daemon SSH (digamos, openssh-server) no lado remoto. Como o ssh é projetado para segurança, você terá que configurar o host remoto para autenticá-lo com uma senha ou uma chave privada. Na verdade, copiar o arquivo pode ser feito através do utilitário scp ou da biblioteca do cliente ssh (jsch seria um exemplo disso).
  • NFS. O host remoto instala um daemon (por exemplo, samba) e compartilha alguns arquivos. Seu computador local (o pacote cifs-utils é capaz disso) pode montar um local remoto no sistema de arquivos local. Dessa forma, você pode copiar um arquivo para o host remoto apenas copiando o arquivo localmente. A autenticação é opcional, os arquivos são enviados em linha pela rede.
  • FTP. Um servidor ftp é instalado no lado remoto e configurado para permitir o acesso a determinados locais para determinados usuários. Você pode então usar qualquer cliente ftp ou alguma biblioteca cliente ftp (biblioteca commons-net do projeto Apache, por exemplo) para conectar-se ao servidor ftp remoto e copiar os arquivos. A autenticação é opcional, os arquivos são enviados em linha pela rede.

Tudo isso parece ser muito trabalhoso, e de fato é, porque não há um único protocolo amplamente adotado e padronizado que seria implementado e configurado de maneira imediata na maioria dos sistemas.

    
por 09.06.2014 / 13:00
5

Você pode usar este snippet de código para copiar arquivos para outra máquina linux .

JSch jsch = new JSch();
Session session = null;
session = jsch.getSession("username","hostname",22);
session.setPassword("password");
session.setConfig("StrictHostKeyChecking", "no");
    session.connect();
ChannelSftp channel = null;
channel = (ChannelSftp)session.openChannel("sftp");
channel.connect();
    File localFile = new File("localfilepath");
    //If you want you can change the directory using the following line.
    channel.cd(RemoteDirectoryPath)
channel.put(new FileInputStream(localFile),localFile.getName());
    channel.disconnect();
session.disconnect();

com isso eu adicionei minha chave pública ao sistema remoto, gerada usando ssh-keygen .Então, ele não pedirá senha toda vez que você executar o programa.

    
por 10.06.2014 / 06:42