web-dev-qa-db-fra.com

Simple ligne sftp du terminal

Plusieurs fois par jour, il se peut que je lance un test pour lequel je dois consulter un fichier journal sur un serveur distant. Je me suis habitué à utiliser mon terminal pour sftp sur le serveur distant et extraire le fichier journal souhaité jusqu'à /tmp Sur ma machine locale.

Aujourd'hui, je parcourais les options en utilisant man sftp Pour tenter de trouver un moyen d'exécuter les commandes suivantes essentiellement sur une seule ligne afin d'éviter de devoir taper une commande, d'appuyer sur entrée, de taper une commande appuyez sur enter, etc.

(ce que je fais maintenant)

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

En cherchant dans man sftp, J'ai trouvé une référence à scp que je n'avais pas utilisée auparavant. Je pense que c'est peut-être ce que je recherche, mais je n'ai pas trouvé de moyen de spécifier où je voulais que le fichier copié en toute sécurité aille.

Quelqu'un pourrait-il me fournir un moyen d'obtenir /dir/file D'un serveur distant et de le télécharger sur /tmp/file_plus-my-description?

J'espérais pouvoir exécuter une commande sftp ou scp similaire à une copie UNIX classique telle que:

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

J'utilise le Terminal intégré dans Mac OS X 10.8. Merci.

66
Kyle

Mise à jour septembre 2017 - tl; dr

Télécharger un seul fichier d'un serveur FTP distant sur votre machine:

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

Upload un seul fichier de votre machine vers un serveur ftp distant:

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

Réponse originale:

Ok, alors je me sens un peu bête. Mais je l'ai compris. Je l'ai presque eu au sommet avec:

sftp user@Host remoteFile localFile

La seule documentation affichée dans le terminal est la suivante:

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

Cependant, je suis tombé sur ce site qui montre ce qui suit dans le synopsis:

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[/]]]

Donc, la réponse simple est que vous ne faites que : après votre utilisateur et votre hôte, le fichier distant et le nom de fichier local. Incroyablement simple!

Une seule ligne, fichier distant de copie sftp:

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

Mise à jour février 2016

Si quelqu'un cherche la commande pour faire l'inverse de ceci et Push un fichier de votre ordinateur local à un serveur distant en une seule ligne sftp commande, utilisateur @Thariama ci-dessous affiché la solution pour y parvenir. Chapeau pointe pour eux pour le code supplémentaire.

sftp {user}@{Host}:{remote_dir} <<< $'put {local_file_path}'
156
Kyle

Pour charger un seul fichier, vous devez créer un script bash. Quelque chose comme ce qui suit devrait fonctionner sous OS X si vous avez installé sshpass.

Usage:

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

Mettez ce script quelque part dans votre chemin et appelez-le 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
6
sstur

sftp prend en charge les fichiers de commandes.

De la page de manuel:

-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*).
3
synthesizerpatel