Pregunta

¿Cuál es el mejor método para realizar una transferencia scp a través del lenguaje de programación Java? Parece que puedo realizar esto a través de JSSE, JSch o las bibliotecas java del castillo hinchable. Ninguna de estas soluciones parece tener una respuesta fácil.

¿Fue útil?

Solución

Terminé usando Jsch : era bastante sencillo y parecía aumentar bastante bien ( Estaba agarrando unos pocos miles de archivos cada pocos minutos).

Otros consejos

plug: ¡sshj es la única opción sensata! Consulte estos ejemplos para comenzar: descargar , subir .

Eche un vistazo aquí

Ese es el código fuente de la tarea SCP de las hormigas. El código en el " ejecutar " El método es donde están las tuercas y tornillos. Esto debería darle una idea justa de lo que se requiere. Utiliza JSch, creo.

Alternativamente, también podría ejecutar directamente esta tarea Ant desde su código Java.

Envolví Jsch con algunos métodos de utilidad para hacerlo un poco más amigable y lo llamé

Jscp

Disponible aquí: https://github.com/willwarren/jscp

Utilidad SCP para tar una carpeta, comprimirla y scp en alguna parte, luego descomprimirla.

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

También incluye clases útiles: Scp y Exec, y un TarAndGzip, que funcionan prácticamente de la misma manera.

Esta es la solución de alto nivel , no es necesario reinventar. ¡Rápido y sucio!

1) Primero, vaya a http: //ant.apache. org / bindownload.cgi y descargue el último binario de Apache Ant. (hoy en día, apache-ant-1.9.4-bin.zip).

2) Extraiga el archivo descargado y busque el JAR ant-jsch.jar (" apache-ant-1.9.4 / lib / ant-jsch.jar " ;). Agregue este JAR en su proyecto . También ant-launcher.jar y ant.jar.

3) Vaya a Jcraft jsch SouceForge Project y descarga el jar. Hoy en día, jsch-0.1. 52.jar . También Agregue este JAR en su proyecto .

Ahora, ¿puede usar fácilmente en código java las Ant Classes Scp para copiar archivos a través de la red o SSHExec para comandos en servidores SSH.

4) Código de ejemplo 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();

El proyecto openssh enumera varias alternativas de Java, Trilead SSH para Java parece ajustarse a lo que está pidiendo.

Utilizo esta API SFTP que tiene SCP llamado Zehon, es genial, muy fácil de usar con una gran cantidad de código de muestra. Aquí está el sitio http://www.zehon.com

Miré muchas de estas soluciones y no me gustaron muchas. Principalmente porque el paso molesto de tener que identificar sus hosts conocidos. Eso y JSCH está en un nivel ridículamente bajo en relación con el comando scp.

Encontré una biblioteca que no requiere esto, pero está empaquetada y se usa como herramienta de línea de comandos. https://code.google.com/p/scp-java-client/

Miré a través del código fuente y descubrí cómo usarlo sin la línea de comando. Aquí hay un ejemplo de carga:

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

El mayor inconveniente es que no está en un repositorio Maven (que pude encontrar). Pero, la facilidad de uso lo vale para mí.

Como algunos aquí, terminé escribiendo un contenedor alrededor de la biblioteca JSch.

Se llama way-secshell y está alojado en 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();

Escribí un servidor scp que es mucho más fácil que otros. Utilizo el proyecto Apache MINA (Apache SSHD) para desarrollarlo. Puede echar un vistazo aquí: https://github.com/boomz/JSCP También puede descargar el archivo jar del directorio / jar . ¿Cómo utilizar? Echa un vistazo a: https://github.com/boomz/JSCP/ blob / master / src / Main.java

jsCH ha funcionado muy bien para mí. A continuación se muestra un ejemplo de un método que se conectará al servidor sftp y descargará archivos al directorio especificado. Se recomienda evitar la desactivación de StrictHostKeyChecking. Aunque es un poco más difícil de configurar, por razones de seguridad, la especificación de los hosts conocidos debería ser la norma.

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

JSch.setConfig (" StrictHostKeyChecking " ;, " no "); - no 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 es una buena biblioteca para trabajar. Tiene una respuesta bastante fácil para su pregunta.

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

Puede encontrar el código completo en

http: //faisalbhagat.blogspot. com / 2013/09 / java-uploading-file-remotely-via-scp.html

Necesito copiar la carpeta de forma recursiva, después de probar diferentes soluciones, finalmente terminé en ProcessBuilder + expect / spawn

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 bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top