111 votes

Sftp en ligne simple à partir du terminal

Plusieurs fois dans la journée, je peux être amené à effectuer un test au cours duquel je dois consulter un fichier journal sur un serveur distant. J'ai pris l'habitude d'utiliser mon terminal pour sftp dans le serveur distant et tirer le fichier journal souhaité vers le bas pour /tmp sur ma machine locale.

Je regardais les options aujourd'hui en utilisant man sftp pour essayer de trouver un moyen d'exécuter les commandes suivantes sur une seule ligne, afin de ne pas avoir à taper une commande, appuyer sur la touche Entrée, taper une commande, appuyer sur la touche Entrée, etc.

(ce que je fais maintenant)

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

Je l'ai trouvé en regardant man sftp une référence à scp que je n'ai jamais utilisé auparavant. Je pense que c'est peut-être ce que je recherche, mais je n'ai pas vu 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 à partir d'un serveur distant et de le télécharger vers /tmp/file_plus-my-description ?

J'espérais pouvoir exécuter une commande sftp ou scp similaire à une copie UNIX normale, par exemple :

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

J'utilise la fonction intégrée Terminal dans Mac OS X 10.8. Merci.

246voto

Kyle Points 1657

Mise à jour Sep 2017 - tl;dr

Télécharger un seul fichier depuis un serveur ftp distant vers votre machine :

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

Télécharger un seul fichier de votre machine vers un serveur ftp distant :

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

Réponse originale :

Ok, donc je me sens un peu bête. Mais j'ai compris. Je l'avais presque en haut 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 sous 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 faites juste : après votre utilisateur et votre hôte, puis le fichier distant et le nom du fichier local. C'est incroyablement simple !

Ligne unique, sftp copy remote file :

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

Mise à jour février 2016

Au cas où quelqu'un chercherait la commande pour faire l'inverse et pousser un fichier de votre ordinateur local vers un serveur distant en une seule ligne sftp L'utilisateur @Thariama a posté la solution pour y parvenir. Chapeau bas à eux pour le code supplémentaire.

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

11voto

c z Points 1188

Réponse du SCP

L'OP a mentionné SCP, alors voilà.

Comme d'autres l'ont souligné, le SFTP est une source de confusion puisque la télécharger est complètement différente de la syntaxe télécharger la syntaxe. Il obtient marginalement Il est plus facile de s'en souvenir si l'on utilise la même forme :

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

En réalité, c'est toujours un désordre, et c'est pourquoi les gens utilisent encore des commandes "dépassées" comme SCP :

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

Le SCP est sûr, mais il date. Il a quelques bogues qui ne seront jamais corrigés, notamment le plantage si le serveur .bash_profile émet un message. Cependant, en termes de convivialité, les développeurs avaient des années d'avance.

7voto

sstur Points 366

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

Uso:

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

4voto

js2010 Points 823

Ou echo 'put {path to file}' | sftp {user}@{host}:{dir} qui fonctionnerait aussi bien sous unix que sous powershell.

3voto

synthesizerpatel Points 9762

Sftp prend en charge les fichiers batch.

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X