example java ssh sftp scp jsch

java - example - Explicación para la implementación del protocolo SCP en la biblioteca JSch



jsch sftp example (1)

  1. ¿Hay alguna razón para preferir SCP sobre SFTP, que se puede ejecutar utilizando la misma biblioteca?

No, el protocolo SCP está obsoleto. Siempre deberías usar SFTP hoy en día.

Aunque las implementaciones triviales del protocolo SFTP tienden a tener transferencias más lentas que SCP (no es fácil implementar la transferencia SFTP de manera eficiente debido a su naturaleza de paquete).

  1. ¿Por qué ejecutamos scp -f <remote file> en el host remoto en lugar de ejecutar simplemente scp source_file_path destination_file_path ? ¿Por qué la ejecución en el host remoto es mejor?

Así es como funciona el protocolo SCP. El binario OpenSSH scp funciona como servidor y como cliente. Entonces, cuando ejecuta scp localmente, se conecta a través de SSH y ejecuta scp en el servidor. Entonces las dos instancias se comunican entre sí. El JSch reemplaza la instancia local del scp . Pero aún necesita la instancia remota para completar la transferencia.

Si estuvieras ejecutando scp localmente, tendrías que tener OpenSSH instalado en la máquina. Lo que es tal vez común en Unix, pero definitivamente no en Windows. Además, no existe una manera fácil / estandarizada para capturar los resultados del programa scp , para traducirlos a la interfaz JSch Java. Es la misma razón por la que JSch (o cualquier otra biblioteca de SFTP) implementa el protocolo SFTP por sí mismo, en lugar de usar el programa sftp .

  1. ¿Cuál es el significado de esta mágica letra C? Por qué C?

Cada comando del protocolo SCP se identifica con un solo carácter. La C significa "transferencia de archivos", D significa "transferencia de directorio", T antes de la transferencia de archivos indica la hora de modificación del siguiente archivo transferido, etc. No sé por qué es C y no por ejemplo F

  1. ¿Por qué enviar esta señal todo el tiempo?

El comando de caracteres NULL ( /0 ) es la confirmación / respuesta al otro sitio donde se completó el comando recibido.

  1. cómo esto puede leer el tamaño del archivo?

El comando C tiene sintaxis (es una cadena legible para el ser humano):

C permissions size filename

Por ejemplo:

C 0644 153634 index.php

El ciclo en el código traduce la cadena "153634" a un número 153634. Parece una implementación demasiado complicada, pero funciona.

Estoy contemplando un ejemplo del uso de la biblioteca JSch que se puede encontrar aquí:
http://www.jcraft.com/jsch/examples/ScpFrom.java.html

No puedo entender varios patrones de código de este ejemplo. Aquí están:

  1. ¿Hay alguna razón para preferir SCP sobre SFTP, que se puede ejecutar utilizando la misma biblioteca?

  2. ¿Por qué ejecutamos scp -f <remote file> en el host remoto en lugar de ejecutar simplemente scp source_file_path destination_file_path ? ¿Por qué la ejecución en el host remoto es mejor?

  3. Al comienzo de la transferencia hay una línea

    while(true){ int c=checkAck(in); if(c!=''C''){ break; } ...

    ¿Cuál es el significado de esta mágica letra C ? Por qué C ?

  4. ¿Por qué enviar esta señal todo el tiempo?

    // send ''/0'' buf[0]=0; out.write(buf, 0, 1); out.flush();

  5. cómo esto puede leer el tamaño del archivo?

    long filesize=0L; while(true){ if(in.read(buf, 0, 1)<0){ // error break; } if(buf[0]=='' '')break; filesize=filesize*10L+(long)(buf[0]-''0''); //What is this?? }