unix - script - Single Line sftp desde la Terminal
unix sftp username password (3)
Varias veces durante el día, puedo estar ejecutando una prueba en la que necesito buscar un archivo de registro en un servidor remoto. Me he acostumbrado a usar mi terminal para sftp
al servidor remoto y bajar el archivo de registro deseado a /tmp
en mi máquina local.
Estaba revisando las opciones hoy usando man sftp
en un intento de encontrar una manera de ejecutar los siguientes comandos básicamente en una sola línea para no tener 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
Mientras buscaba en man sftp
encontré una referencia a scp
que 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.
¿Podría alguien proporcionarme una forma de obtener /dir/file
de un servidor remoto y hacer que se descargue a /tmp/file_plus-my-description
?
Esperaba poder ejecutar un comando sftp o scp similar a una copia regular de UNIX como:
scp myuser@myserver /dir/file /tmp/file_plus-my-description
Estoy usando el Terminal
incorporado en Mac OS X 10.8. Gracias.
Para CARGAR un único archivo, deberá crear un script bash. Algo como lo siguiente debería funcionar en OS X si tiene instalado sshpass
.
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
sftp admite archivos por lotes.
Desde la página man:
-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*).
Actualización Sep 2017 - tl; dr
Descargue un solo archivo desde un servidor ftp remoto a su máquina:
sftp username@hostname: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, entonces 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, me encontré con este sitio que muestra lo siguiente en 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 después de su usuario y host, el archivo remoto y el nombre del archivo local. ¡Increíblemente simple!
Una sola línea, archivo remoto de copia sftp:
sftp username@hostname:remoteFileName localFileName
sftp kyle@kylesserver:/tmp/myLogFile.log /tmp/fileNameToUseLocally.log
Actualización feb 2016
En caso de que alguien esté buscando el comando para hacer lo contrario y enviar un archivo desde su computadora local a un servidor remoto en un solo comando de línea sftp
, el usuario @Thariama a continuación publicó la solución para lograr eso. Punta de sombrero para ellos para el código adicional.
sftp {user}@{host}:{remote_dir} <<< $''put {local_file_path}''