Sftp de línea única desde la terminal

91

Varias veces durante el día, es posible que esté ejecutando una prueba en la que necesito buscar en un archivo de registro en un servidor remoto. Me he acostumbrado a usar mi terminal sftpen el servidor remoto y descargar el archivo de registro deseado /tmpen mi máquina local.

Estaba revisando las opciones que usaba hoy man sftpen un intento de encontrar una manera de ejecutar los siguientes comandos básicamente en una sola línea para que no tenga que escribir un comando, presionar enter, escribir un comando, presionar enter, etc.

(Qué hago ahora)

sftp myuser@myserver
--mypassword at prompt
lcd /tmp
get /dir/dir/dir/dir/file
quit

Encontré mientras buscaba man sftpuna referencia scpque no había usado antes. Siento que puede ser lo que estoy buscando, pero no vi una forma de especificar dónde quería que fuera el archivo copiado de forma segura.

¿Alguien podría proporcionarme una forma de acceder /dir/filedesde un servidor remoto y descargarlo /tmp/file_plus-my-description?

Esperaba poder ejecutar un comando sftp o scp similar a una copia normal de UNIX como:

scp myuser@myserver /dir/file /tmp/file_plus-my-description

Estoy usando el integrado Terminalen Mac OS X 10.8. Gracias.

Kyle
fuente

Respuestas:

201

Actualización de septiembre de 2017 - tl; dr

Descargue un solo archivo desde un servidor ftp remoto a su máquina:

sftp {user}@{host}:{remoteFileName} {localFileName}

Cargue un solo archivo desde su máquina a un servidor ftp remoto:

sftp {user}@{host}:{remote_dir} <<< $'put {local_file_path}'

Respuesta original:

Ok, me siento un poco tonto. Pero lo descubrí. Casi lo tengo en la parte superior con:

sftp user@host remoteFile localFile

La única documentación que se muestra en la terminal es esta:

sftp [user@]host[:file ...]
sftp [user@]host[:dir[/]]

Sin embargo, encontré este sitio que muestra lo siguiente debajo de la sinopsis:

sftp [-vC1 ] [-b batchfile ] [-o ssh_option ] [-s subsystem | sftp_server ] [-B buffer_size ] [-F ssh_config ] [-P sftp_server path ] [-R num_requests ] [-S program ] host 
sftp [[user@]host[:file [file]]] 
sftp [[user@]host[:dir[/]]]

Entonces, la respuesta simple es simplemente hacer :después de su usuario y host, luego el archivo remoto y el nombre del archivo local. ¡Increíblemente simple!

Archivo remoto de copia sftp de una sola línea:

sftp username@hostname:remoteFileName localFileName
sftp kyle@kylesserver:/tmp/myLogFile.log /tmp/fileNameToUseLocally.log

Actualización de febrero de 2016

En caso de que alguien esté buscando el comando para hacer lo contrario de esto y enviar un archivo desde su computadora local a un servidor remoto en un sftp comando de una sola línea , el usuario @Thariama a continuación publicó la solución para lograrlo. Gorra para ellos por el código extra.

sftp {user}@{host}:{remote_dir} <<< $'put {local_file_path}'
Kyle
fuente
20
Estaba preguntando al revés (copiar al servidor remoto), pero lo encontré yo mismo: sftp {usuario} @ {host}: {dir} <<< $ 'poner {ruta al archivo}'
Thariama
2
Mis disculpas, incomprendido. Copiaré su respuesta en la respuesta en caso de que pueda ayudar a alguien en el futuro. Gracias @Thariama
Kyle
1
Para nosotros TL: DR -types, es un poco confuso tener la solución incorrecta como la primera fila resaltada :-)
skoll
1
@Kyle, ¡mucho mejor!
skoll
1
Me parece extraño que sftp no incluya una opción para cargar un archivo en un solo comando. Esto funciona bien, pero es demasiado complicado para una operación tan simple. Sigue siendo lo único que puedo encontrar que funciona de forma inmediata, así que gracias. :)
Teekin
7

Para CARGAR un solo archivo, necesitará crear un script bash. Algo como lo siguiente debería funcionar en OS X si lo ha sshpassinstalado.

Uso:

sftpx <password> <user@hostname> <localfile> <remotefile>

Pon este script en algún lugar de tu camino y llámalo sftpx:

#!/bin/bash

export RND=`cat /dev/urandom | env LC_CTYPE=C tr -cd 'a-f0-9' | head -c 32`
export TMPDIR=/tmp/$RND
export FILENAME=$(basename "$4")
export DSTDIR=$(dirname "$4")

mkdir $TMPDIR
cp "$3" $TMPDIR/$FILENAME

export SSHPASS=$1
sshpass -e sftp -oBatchMode=no -b - $2 << !
   lcd $TMPDIR
   cd $DSTDIR
   put $FILENAME
   bye
!

rm $TMPDIR/$FILENAME
rmdir $TMPDIR
sstur
fuente
Gracias por la respuesta, sin embargo, la respuesta que denoté anteriormente utilizará un comando de una sola línea con sftp para obtener un archivo de un servidor remoto y guardarlo en una ubicación específica en su máquina local. He verificado que funcionará en OS X solo con sftp.
Kyle
2
Sí, esa es sin duda la mejor respuesta para transferir de un lugar a otro de forma remota. Sin embargo, pensé que agregaría una solución para hacer lo contrario: local a remoto. Por si acaso es útil para alguien. ¡Gracias!
sstur
3

sftp admite archivos por lotes.

Desde la página del manual:

-b batchfile

Batch mode reads a series of commands from an input batchfile instead of stdin.  
Since it lacks user interaction it should be used in conjunction with non-interactive
authentication.  A batchfile of `-' may be used to indicate standard input.  sftp 
will abort if any of the following commands fail: get, put, rename, ln, rm, mkdir, 
chdir, ls, lchdir, chmod, chown, chgrp, lpwd, df, symlink, and lmkdir.  Termination 
on error can be suppressed on a command by command basis by prefixing the command 
with a `-' character (for example, -rm /tmp/blah*).
sintetizador
fuente
Como este es un proceso que hago varias veces al día para diferentes archivos en diferentes lugares, sería bueno poder simplemente memorizar un comando que podría escribir en una sola línea en mi terminal (que siempre está abierta) y presionar Enter. El uso --batchme obligaría a poner mis comandos en un archivo y luego pasar ese archivo como parámetro. Todavía estoy jugando scp, siento que puede contener mi solución.
Kyle
Quizás 'esperar' es lo que estás buscando entonces. linuxjournal.com/article/3065
synthesizerpatel
3

O echo 'put {path to file}' | sftp {user}@{host}:{dir}, que funcionaría tanto en Unix como en PowerShell.

js2010
fuente
Esta sintaxis también funciona con puttyftp (psftp). Solo pensé en compartir, ya que esa es la razón por la que terminé aquí
9 Guy
1

Una pequeña modificación como la que se muestra a continuación funcionó para mí cuando la usé desde perl y system () call:

sftp {user}@{host} <<< $'put {local_file_path} {remote_file_path}'
usuario2443447
fuente
1

Respuesta de SCP

El OP mencionó a SCP, así que aquí está eso.

Como han señalado otros, SFTP es confuso ya que la sintaxis de carga es completamente diferente de la sintaxis de descarga . Se vuelve un poco más fácil de recordar si usa el mismo formulario:

echo 'put LOCALPATH REMOTEPATH' | sftp USER@HOST
echo 'get REMOTEPATH LOCALPATH' | sftp USER@HOST

En realidad, esto sigue siendo un desastre, y es por eso que la gente todavía usa comandos "obsoletos" como SCP:

scp USER@HOST:REMOTEPATH LOCALPATH
scp LOCALPATH USER@HOST:REMOTEPATH

SCP es seguro pero anticuado. Tiene algunos errores que nunca se solucionarán, es decir, fallar si el servidor .bash_profileemite un mensaje. Sin embargo, en términos de usabilidad, los desarrolladores estaban años por delante.

cz
fuente