with script password example automatizado unix terminal sftp scp

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}''