Introducción
FTP (File Transfer Protocol), o “Protocolo de transferencia de archivos” es un método popular para transferir archivos entre dos sistemas remotos.
SFTP, que significa SSH File Transfer Protocol, o Secure File Transfer Protocol, es un protocolo separado empaquetado con SSH que funciona de manera similar a través de una conexión segura. La ventaja es la capacidad de aprovechar una conexión segura para transferir archivos y atravesar el sistema de archivos tanto en el sistema local como en el remoto.
En casi todos los casos, SFTP es preferible a FTP debido a sus características de seguridad subyacentes y su capacidad para conectarse a una conexión SSH. FTP es un protocolo inseguro que solo debe usarse en casos limitados o en redes de confianza.
Aunque SFTP está integrado en muchas herramientas gráficas, esta guía mostrará cómo usarla a través de su interfaz de línea de comandos interactiva.
Cómo conectarse con SFTP
De forma predeterminada, SFTP utiliza el protocolo SSH para autenticar y establecer una conexión segura. Debido a esto, están disponibles los mismos métodos de autenticación que están presentes en SSH.
Si bien las contraseñas son fáciles de usar y configurar de forma predeterminada, te recomendamos que crees claves SSH y transferir tu clave pública a cualquier sistema al que necesites acceder. Esto es mucho más seguro y puede ahorrarte tiempo a largo plazo.
Consulta esta guía para configurar las claves SSH para acceder a tu servidor si aún no lo has hecho.
Si puedes conectarte a la máquina utilizando SSH, entonces has completado todos los requisitos necesarios para usar SFTP para administrar archivos. Prueba el acceso SSH con el siguiente comando:
1 |
ssh sammy@your_server_ip_or_remote_hostname |
Si eso funciona, sal de nuevo escribiendo:
1 |
exit |
Podemos establecer una conexión SSH y luego abrir una sesión SFTP usando esa conexión emitiendo el siguiente comando:
1 |
sftp sammy@your_server_ip_or_remote_hostname |
Conectarás al sistema remoto y tu solicitud cambiará a una solicitud SFTP.
Si estás trabajando en un puerto SSH personalizado (no en el puerto predeterminado 22), puedes abrir una sesión de SFTP de la siguiente manera:
1 |
sftp -oPort=custom_port sammy@your_server_ip_or_remote_hostname |
Esto te conectará con el sistema remoto a través de tu puerto especificado.
Obtener ayuda en SFTP
El comando más útil para aprender primero es el comando de ayuda (help). Esto te da acceso a un resumen de la ayuda de SFTP. Puedes invocarlo escribiendo cualquiera de estos comandos en el indicador:
1 |
help |
1 |
? |
Esto mostrará una lista de los comandos disponibles:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
Available commands: bye Quit sftp cd path Change remote directory to 'path' chgrp grp path Change group of file 'path' to 'grp' chmod mode path Change permissions of file 'path' to 'mode' chown own path Change owner of file 'path' to 'own' df [-hi] [path] Display statistics for current directory or filesystem containing 'path' exit Quit sftp get [-Ppr] remote [local] Download file help Display this help text lcd path Change local directory to 'path' . . . |
Exploraremos algunos de los comandos que ves en las siguientes secciones.
Navegando con SFTP
Podemos navegar a través de la jerarquía de archivos del sistema remoto usando una serie de comandos que funcionan de manera similar a sus contrapartes de shell.
Primero, orientémonos al descubrir en qué directorio estamos actualmente en el sistema remoto. Al igual que en una sesión de shell típica, podemos escribir lo siguiente para obtener el directorio actual:
1 |
pwd |
1 |
Remote working directory: /home/demouser |
Podemos ver los contenidos del directorio actual del sistema remoto con otro comando familiar:
1 2 |
ls |
1 |
Summary.txt info.html temp.txt testDirectory |
Ten en cuenta que los comandos dentro de la interfaz SFTP no son los comandos de shell normales y no son tan ricos en características, pero implementan algunos de los indicadores opcionales más importantes:
1 2 |
ls -la |
1 2 3 4 5 6 7 8 |
drwxr-xr-x 5 demouser demouser 4096 Aug 13 15:11 . drwxr-xr-x 3 root root 4096 Aug 13 15:02 .. -rw------- 1 demouser demouser 5 Aug 13 15:04 .bash_history -rw-r--r-- 1 demouser demouser 220 Aug 13 15:02 .bash_logout -rw-r--r-- 1 demouser demouser 3486 Aug 13 15:02 .bashrc drwx------ 2 demouser demouser 4096 Aug 13 15:04 .cache -rw-r--r-- 1 demouser demouser 675 Aug 13 15:02 .profile . . . |
Para llegar a otro directorio, podemos emitir este comando:
1 |
cd testDirectory |
Ahora podemos atravesar el sistema de archivos remoto, pero ¿qué pasa si necesitamos acceder a nuestro sistema de archivos local? Podemos dirigir los comandos hacia el sistema de archivos local precediéndolos con una “l” para local.
Todos los comandos discutidos hasta ahora tienen equivalentes locales. Podemos mostrar el directorio de trabajo local:
1 2 |
lpwd |
1 |
Local working directory: /Users/demouser |
Podemos listar los contenidos del directorio actual en la máquina local:
1 2 |
lls |
1 2 |
Desktop local.txt test.html Documents analysis.rtf zebra.html |
También podemos cambiar el directorio con el que deseamos interactuar en el sistema local:
1 |
lcd Desktop |
Transfiriendo archivos con SFTP
Navegar por los sistemas de archivos locales y remotos es de utilidad limitada sin poder transferir archivos entre los dos.
Transferencia de archivos remotos al sistema local
Si nos gustaría descargar archivos de nuestro host remoto, podemos hacerlo emitiendo el siguiente comando:
1 2 |
get remoteFile |
1 2 |
Fetching /home/demouser/remoteFile to remoteFile /home/demouser/remoteFile 100% 37KB 36.8KB/s 00:01 |
Como puedes ver, de forma predeterminada, el comando “get” descarga un archivo remoto a un archivo con el mismo nombre en el sistema de archivos local.
Podemos copiar el archivo remoto a un nombre diferente especificando el nombre después:
1 |
get remoteFile localFile |
El comando “get” también tiene algunos indicadores de opción. Por ejemplo, podemos copiar un directorio y todos sus contenidos especificando la opción recursiva:
1 |
get -r someDirectory |
Podemos decirle a SFTP que mantenga los permisos adecuados y los tiempos de acceso utilizando el indicador “-P” o “-p”:
1 |
get -Pr someDirectory |
Transferencia de archivos locales al sistema remoto
La transferencia de archivos al sistema remoto se realiza con la misma facilidad utilizando el comando “put” con el nombre apropiado:
1 2 |
put localFile |
1 2 |
Uploading localFile to /home/demouser/localFile localFile 100% 7607 7.4KB/s 00:00 |
Los mismos indicadores que funcionan con “get” se aplican a “put“. Así que, para copiar un directorio local completo, puedes emitir:
1 |
put -r localDirectory |
Nota:
Actualmente hay un error en las versiones de OpenSSH incluidas con las versiones actuales de Ubuntu (al menos 14.04 a 15.10) que impiden que el comando anterior funcione correctamente. Tras emitir el comando anterior para transferir el contenido a un servidor utilizando la versión con errores de OpenSSH, se dará el error siguiente: Couldn’t canonicalise: No such file or directory.
Para solucionar este problema, crea primero el directorio de destino en el extremo remoto escribiendo mkdir localDirectory. Después, el comando anterior debe completarse sin error.
Una herramienta familiar que es útil al descargar y cargar archivos es el comando “df“, que funciona de manera similar a la versión de la línea de comandos. Usando esto, puedes verificar que tienes suficiente espacio para completar las transferencias que te interesan:
1 2 |
df -h |
1 2 |
Size Used Avail (root) %Capacity 19.9GB 1016MB 17.9GB 18.9GB 4% |
Ten en cuenta que no existe una variación local de este comando, pero podemos solucionarlo emitiendo el comando “!”.
El comando “!” nos deja en un shell local, donde podemos ejecutar cualquier comando disponible en nuestro sistema local. Podemos verificar el uso del disco escribiendo:
1 2 3 |
! df -h |
1 2 3 4 5 |
Filesystem Size Used Avail Capacity Mounted on /dev/disk0s2 595Gi 52Gi 544Gi 9% / devfs 181Ki 181Ki 0Bi 100% /dev map -hosts 0Bi 0Bi 0Bi 100% /net map auto_home 0Bi 0Bi 0Bi 100% /home |
Cualquier otro comando local funcionará como se espera. Para volver a tu sesión de SFTP, escribe:
1 |
exit |
Ahora deberías ver el retorno de solicitud de SFTP.
Manipulaciones de archivos simples con SFTP
SFTP te permite realizar el tipo de mantenimiento de archivos básico que es útil cuando se trabaja con jerarquías de archivos.
Por ejemplo, puedes cambiar el propietario de un archivo en el sistema remoto con:
1 |
chown userID file |
Observa cómo, a diferencia del comando “chmod” del sistema, el comando SFTP no acepta nombres de usuario, sino que utiliza los UID. Desafortunadamente, no hay una manera fácil de conocer el UID apropiado desde la interfaz SFTP.
Una manera en que podrías lograrlo es la siguiente:
1 2 3 4 |
get /etc/passwd !less passwd |
1 2 3 4 5 6 7 8 |
root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/bin/sh bin:x:2:2:bin:/bin:/bin/sh sys:x:3:3:sys:/dev:/bin/sh sync:x:4:65534:sync:/bin:/bin/sync games:x:5:60:games:/usr/games:/bin/sh man:x:6:12:man:/var/cache/man:/bin/sh . . . |
Observa cómo en lugar de dar el comando “!” por sí mismo, lo hemos usado como un prefijo para un comando de shell local. Esto funciona para ejecutar cualquier comando disponible en nuestra máquina local y podría haber sido utilizado con el comando local “df” anteriormente.
El UID estará en la tercera columna del archivo, como se delimita con caracteres de dos puntos.
Cambiar propietario de grupo
Del mismo modo, podemos cambiar el propietario del grupo de un archivo con:
1 |
chgrp groupID file |
Nuevamente, no hay una manera fácil de obtener una lista de los grupos del sistema remoto. Podemos solucionarlo con el siguiente comando:
1 2 3 |
get /etc/group !less group |
1 2 3 4 5 6 7 8 9 |
root:x:0: daemon:x:1: bin:x:2: sys:x:3: adm:x:4: tty:x:5: disk:x:6: lp:x:7: . . . |
La tercera columna contiene el ID del grupo asociado con el nombre en la primera columna. Esto es lo que estamos buscando.
Afortunadamente, el comando “chmod” funciona como se esperaba en el sistema de archivos remoto:
1 2 |
chmod 777 publicFile |
1 |
Changing mode on /home/demouser/publicFile |
No hay ningún comando para manipular los permisos de archivos locales, pero puede establecer la umask local, de modo que cualquier archivo copiado en el sistema local tenga los permisos adecuados.
Eso se puede hacer con el comando “lumask”:
1 2 |
lumask 022 |
1 |
Local umask: 022 |
Ahora todos los archivos normales descargados (siempre que no se use el indicador “-p”) tendrán permisos 644.
SFTP te permite crear directorios en sistemas locales y remotos con “lmkdir” y “mkdir” respectivamente. Estos funcionan como te imaginas.
El resto de los comandos de archivo solo se dirigen al sistema de archivos remoto:
1 2 3 |
ln rm rmdir |
Estos comandos replican el comportamiento básico de las versiones de shell. Si necesitas realizar estas acciones en el sistema de archivos local, recuerda que puedes ingresar a una shell emitiendo este comando:
1 |
! |
O ejecuta un solo comando en el sistema local precediendo el comando con “!” al igual que:
1 |
!chmod 644 somefile |
Cuando hayas terminado con tu sesión de SFTP, usa “exit” o “bye” para cerrar la conexión.
1 |
bye |
Conclusión
Aunque SFTP es una herramienta simple, es muy útil para administrar servidores y transferir archivos entre ellos.
Por ejemplo, puedes usar SFTP para permitir que usuarios particulares transfieran archivos sin acceso SSH.
Si estás acostumbrado a usar FTP o SCP para realizar tus transferencias, SFTP es una buena manera de aprovechar los puntos fuertes de ambos. Si bien no es apropiado para cada situación, es una herramienta flexible para tener en tu repertorio.