Pergunta

O que é o melhor método de realizar uma transferência scp através da linguagem de programação Java? Parece que pode ser capaz de executar esta via JSSE, JSch ou as bibliotecas Java Castelo Insuflável. Nenhuma dessas soluções parecem ter uma resposta fácil.

Foi útil?

Solução

Acabei usando jsch - era bastante simples, e parecia escalar muito bem ( Eu estava pegando alguns milhares de arquivos a cada poucos minutos).

Outras dicas

plugue: sshj é a única escolha sã! Veja estes exemplos para começar: download , Upload .

Dê uma olhada aqui

Este é o código-fonte para a tarefa SCP Formigas. O código no método "executar" é onde as porcas e os parafusos de que são. Isso deve lhe dar uma boa idéia do que é necessário. Ele usa JSch eu acredito.

Como alternativa, você também pode executar diretamente essa tarefa Ant do seu código Java.

Eu envolvi jsch com alguns métodos utilitários para torná-lo um amigável pouco e chamou-lhe

JSCP

Disponível aqui: https://github.com/willwarren/jscp

utilidade SCP tar uma pasta, fechá-lo, e SCP-lo em algum lugar, em seguida, descompactá-lo.

Uso:

// create secure context
SecureContext context = new SecureContext("userName", "localhost");

// set optional security configurations.
context.setTrustAllHosts(true);
context.setPrivateKeyFile(new File("private/key"));

// Console requires JDK 1.7
// System.out.println("enter password:");
// context.setPassword(System.console().readPassword());

Jscp.exec(context, 
           "src/dir",
           "destination/path",
           // regex ignore list 
           Arrays.asList("logs/log[0-9]*.txt",
           "backups") 
           );

Também inclui classes úteis - Scp e Exec, e uma TarAndGzip, que funcionam praticamente da mesma maneira

.

Esta é solução de alto nível , há necessidade de reinventar. Rápido e sujo!

1) Primeiro, vá para http: //ant.apache. org / bindownload.cgi e baixar mais recente binário do Apache Ant. (Hoje em dia, apache-ant-1.9.4-bin.zip).

2) Extraia o arquivo baixado e encontrar o JAR ant-jsch.jar ( "apache-ant-1.9.4 / lib / ant-jsch.jar" ). Adicione esta JAR no seu projeto . Também ant-launcher.jar e ant.jar.

3) Ir para Jcraft jsch SouceForge projeto e baixar o jar. Hoje em dia, jsch-0,1. 52.jar . Também Adicione esta JAR no seu projeto .

Agora, você pode easyly usar em código java as Classes Ant Scp para copiar arquivos através da rede ou SSHExec para comandos em servidores SSH.

4) Exemplo de código Scp:

// This make scp copy of 
// one local file to remote dir

org.apache.tools.ant.taskdefs.optional.ssh.Scp scp = new Scp();
int portSSH = 22;
String srvrSSH = "ssh.your.domain";
String userSSH = "anyuser"; 
String pswdSSH = new String ( jPasswordField1.getPassword() );
String localFile = "C:\\localfile.txt";
String remoteDir = "/uploads/";

scp.setPort( portSSH );
scp.setLocalFile( localFile );
scp.setTodir( userSSH + ":" + pswdSSH + "@" + srvrSSH + ":" + remoteDir );
scp.setProject( new Project() );
scp.setTrust( true );
scp.execute();

listas O href="http://www.openssh.com/java.html" rel="nofollow noreferrer"> projeto openssh várias alternativas de Java, trilead SSH para Java parece ajustar-se o que você está pedindo.

Eu uso essa API SFTP que tem SCP chamado Zehon, é grande, tão fácil de usar com um monte de código de exemplo. Aqui é o local http://www.zehon.com

Eu olhei para um monte de essas soluções e não gostava de muitos deles. Principalmente porque a etapa irritante de ter de identificar suas máquinas conhecidas. Isso e jsch está em um nível ridiculamente baixo em relação ao comando scp.

Eu encontrei uma biblioteca que não requer isso, mas é empacotado e usado como uma ferramenta de linha de comando. https://code.google.com/p/scp-java-client/

Eu olhei através do código-fonte e descobriu como usá-lo sem a linha de comando. Aqui está um exemplo de upload:

    uk.co.marcoratto.scp.SCP scp = new uk.co.marcoratto.scp.SCP(new uk.co.marcoratto.scp.listeners.SCPListenerPrintStream());
    scp.setUsername("root");
    scp.setPassword("blah");
    scp.setTrust(true);
    scp.setFromUri(file.getAbsolutePath());
    scp.setToUri("root@host:/path/on/remote");
    scp.execute();

A maior desvantagem é que ele não está em um repo maven (que eu poderia encontrar). Mas, a facilidade de uso vale a pena para mim.

Como alguns aqui, acabei escrevendo um invólucro em torno da biblioteca JSch.

É chamado caminho-secshell e ele está hospedado no GitHub:

https://github.com/objectos/way-secshell

// scp myfile.txt localhost:/tmp
File file = new File("myfile.txt");
Scp res = WaySSH.scp()
  .file(file)
  .toHost("localhost")
  .at("/tmp")
  .send();

Eu escrevi um servidor scp que é muito mais fácil do que outros. Eu uso projeto Apache MINA (Apache SSHD) para desenvolvê-lo. Você pode dar uma olhada aqui: https://github.com/boomz/JSCP Além disso, você pode baixar o arquivo jar do diretório /jar. Como usar? Dê uma olhada em: https://github.com/boomz/JSCP/ blob / master / src / Main.java

jsch tem funcionado muito bem para mim. Abaixo está um exemplo de um método que vai ligar para sftp arquivos do servidor e fazer o download para o diretório especificado. Recomenda-se a ficar longe de desativação StrictHostKeyChecking. Embora um pouco mais difícil de configurar, por razões de segurança especificando as máquinas conhecidas deve ser a norma.

jsch.setKnownHosts ( "C: \ Users \ Test \ known_hosts"); recomendado

JSch.setConfig ( "StrictHostKeyChecking", "não"); - não é recomendado

import com.jcraft.jsch.*;
 public void downloadFtp(String userName, String password, String host, int port, String path) {


        Session session = null;
        Channel channel = null;
        try {
            JSch ssh = new JSch();
            JSch.setConfig("StrictHostKeyChecking", "no");
            session = ssh.getSession(userName, host, port);
            session.setPassword(password);
            session.connect();
            channel = session.openChannel("sftp");
            channel.connect();
            ChannelSftp sftp = (ChannelSftp) channel;
            sftp.get(path, "specify path to where you want the files to be output");
        } catch (JSchException e) {
            System.out.println(userName);
            e.printStackTrace();


        } catch (SftpException e) {
            System.out.println(userName);
            e.printStackTrace();
        } finally {
            if (channel != null) {
                channel.disconnect();
            }
            if (session != null) {
                session.disconnect();
            }
        }

    }

JSch é uma biblioteca agradável para trabalhar. Tem bastante uma resposta fácil para a sua pergunta.

JSch jsch=new JSch();
  Session session=jsch.getSession(user, host, 22);
  session.setPassword("password");


  Properties config = new Properties();
  config.put("StrictHostKeyChecking","no");
  session.setConfig(config);
  session.connect();

  boolean ptimestamp = true;

  // exec 'scp -t rfile' remotely
  String command="scp " + (ptimestamp ? "-p" :"") +" -t "+rfile;
  Channel channel=session.openChannel("exec");
  ((ChannelExec)channel).setCommand(command);

  // get I/O streams for remote scp
  OutputStream out=channel.getOutputStream();
  InputStream in=channel.getInputStream();

  channel.connect();

  if(checkAck(in)!=0){
    System.exit(0);
  }

  File _lfile = new File(lfile);

  if(ptimestamp){
    command="T "+(_lfile.lastModified()/1000)+" 0";
    // The access time should be sent here,
    // but it is not accessible with JavaAPI ;-<
    command+=(" "+(_lfile.lastModified()/1000)+" 0\n");
    out.write(command.getBytes()); out.flush();
    if(checkAck(in)!=0){
      System.exit(0);
    }
  }

Você pode encontrar o código completo em

http: //faisalbhagat.blogspot. com / 2013/09 / java-upload-file-remotamente via-scp.html

Eu preciso copiar a pasta de forma recursiva, depois de tentar soluções diferentes, finalmente, acabam por ProcessBuilder + esperar / desova

scpFile("192.168.1.1", "root","password","/tmp/1","/tmp");

public void scpFile(String host, String username, String password, String src, String dest) throws Exception {

    String[] scpCmd = new String[]{"expect", "-c", String.format("spawn scp -r %s %s@%s:%s\n", src, username, host, dest)  +
            "expect \"?assword:\"\n" +
            String.format("send \"%s\\r\"\n", password) +
            "expect eof"};

    ProcessBuilder pb = new ProcessBuilder(scpCmd);
    System.out.println("Run shell command: " + Arrays.toString(scpCmd));
    Process process = pb.start();
    int errCode = process.waitFor();
    System.out.println("Echo command executed, any errors? " + (errCode == 0 ? "No" : "Yes"));
    System.out.println("Echo Output:\n" + output(process.getInputStream()));
    if(errCode != 0) throw new Exception();
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top