SSH y SFTP con Java

Uso de JSCH para SFTP y SSH

1. Descargue la librería de su sitio en http://www.jcraft.com/jsch/. Hay dos opciones de descarga: una que contiene el código fuente y los ejemplos, otra que es el archivo binario con la librería compilada. Mi recomendación es descargar ambas, la librería binaria para incluirla en los proyectos y el código fuente para estudiar los ejemplos ya que básicamente esta es la única documentación oficial que existe.

2. Incluya el archivo binario en sus proyectos.

3. Ejemplo de SFTP:

package com.heinsohn.pruebas;
 
import com.jcraft.jsch.ChannelSftp;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;
import com.jcraft.jsch.UserInfo;
 
public class PruebaSFTP {
    private static final String user = "czuluaga";
    private static final String host = "remoto123";
    private static final Integer port = 22;
    private static final String pass = "Clave123";
 
    public static void main(String[] args) throws Exception{
        System.out.println("------------------- INICIO");
 
        JSch jsch = new JSch();
        Session session = jsch.getSession(user, host, port);
        UserInfo ui = new SUserInfo(pass, null);
 
        session.setUserInfo(ui);
        session.setPassword(pass);
        session.connect();
 
        ChannelSftp sftp = (ChannelSftp)session.openChannel("sftp");
        sftp.connect();
 
        sftp.cd("/home/czuluaga/pruebasftp");
        System.out.println("Subiendo c:/ejemplo.txt ...");
        sftp.put("c:/ejemplo.txt", "ejemplo.txt");
 
        System.out.println("Archivos subidos.");
 
        sftp.exit();
        sftp.disconnect();
        session.disconnect();
 
        System.out.println("----------------- FIN");
    }
}

4. Ejemplo de SSH:

package com.heinsohn.pruebas;
 
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
 
import com.jcraft.jsch.ChannelExec;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;
import com.jcraft.jsch.UserInfo;
 
public class PruebaSSH {
    private static final String user = "czuluaga";
    private static final String host = "remoto123";
    private static final Integer port = 22;
    private static final String pass = "clave321";
 
    public static void main(String[] args) throws Exception{
        System.out.println("----- INICIO");
 
        JSch jsch = new JSch();
        Session session = jsch.getSession(user, host, port);
        UserInfo ui = new SUserInfo(pass, null);
        session.setUserInfo(ui);
        session.setPassword(pass);
        session.connect();
        ChannelExec channelExec = (ChannelExec)session.openChannel("exec");
 
        InputStream in = channelExec.getInputStream();
 
        channelExec.setCommand("ls -l");
        channelExec.connect();
 
        BufferedReader reader = new BufferedReader(new InputStreamReader(in));
        String linea = null;
        int index = 0;
 
        while ((linea = reader.readLine()) != null) {
            System.out.println(++index + " : " + linea);
        }
 
        channelExec.disconnect();
        session.disconnect();
 
        System.out.println("------ FIN");
    }
}

5. Clase auxiliar SUserInfo:

package com.heinsohn.pruebas;
 
import com.jcraft.jsch.UserInfo;
 
public class SUserInfo implements UserInfo {
 
    private String password;
    private String passPhrase;
 
    public SUserInfo (String password, String passPhrase) {
        this.password = password;
        this.passPhrase = passPhrase;
    }
 
    public String getPassphrase() {
        return passPhrase;
    }
 
    public String getPassword() {
        return password;
    }
 
    public boolean promptPassphrase(String arg0) {
        return true;
    }
 
    public boolean promptPassword(String arg0) {
        return false;
    }
 
    public boolean promptYesNo(String arg0) {
        return true;
    }
 
    public void showMessage(String arg0) {
        System.out.println("SUserInfo.showMessage()");
    }
}

Errores Comunes
Exception in thread "main" com.jcraft.jsch.JSchException: Auth cancel
Este error puede suceder por dos razones:
- Contraseña errónea. Esto es que al objeto de tipo UserInfo se le pasó un password errado en el constructor o en el método setPassword.
- No asignó la contraseña usando el método setPassword. Aunque la contraseña se le pasa al objeto UserInfo en el constructor también es necesario hacerlo con el método setPassword. Aún no me queda claro porque hay que hacerlo ni se si hay condiciones especiales para que el error ocurra.

Referencias
- http://www.mail-archive.com/commons-dev@jakarta.apache.org/msg29832.html
- http://www.forodejava.com/showthread.php?t=1757




  1. Evaluación de librerías.
  2. Conexión a través de SFTP.
    1. Ejecutar comandos.
    2. Enviar archivos.
    3. Recibir archivos.
    4. Ejemplo.
  3. Conexión a través de SSH.
    1. Ejecución de comandos.
    2. Interpretación de la salida.
    3. Ejemplo.
  4. Un ejemplo completo.
  5. Buenas prácticas.

Si no se indica lo contrario, el contenido de esta página se ofrece bajo Creative Commons Attribution-ShareAlike 3.0 License