Sftp à une seule ligne depuis le terminal

91

Plusieurs fois au cours de la journée, je suis peut-être en train d'exécuter un test où j'ai besoin de parcourir un fichier journal sur un serveur distant. Je me suis habitué à utiliser mon terminal pour sftpaccéder au serveur distant et à extraire le fichier journal souhaité /tmpsur ma machine locale.

J'étais en train de parcourir les options utilisées aujourd'hui man sftppour tenter de trouver un moyen d'exécuter les commandes suivantes essentiellement sur une seule ligne afin de ne pas avoir à taper une commande, appuyez sur Entrée, tapez une commande, appuyez sur Entrée, etc.

(ce que je fais maintenant)

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

J'ai trouvé en regardant à travers man sftpune référence scpque je n'avais jamais utilisée 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'accéder /dir/fileà un serveur distant et de le télécharger /tmp/file_plus-my-description?

J'espérais pouvoir exécuter une commande sftp ou scp similaire à une copie UNIX standard comme:

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

J'utilise la version intégrée Terminalde Mac OS X 10.8. Merci.

Kyle
la source

Réponses:

201

Mise à jour de septembre 2017 - tl; dr

Téléchargez un seul fichier depuis un serveur ftp distant sur votre machine:

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

Téléchargez 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 stupide. 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 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[/]]]

La réponse simple est donc de ne faire :qu'après votre utilisateur et votre hôte, puis le fichier distant et le nom de fichier local. Incroyablement simple!

Une seule ligne, copie du fichier distant sftp

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 de sftp commande, l'utilisateur @Thariama ci-dessous a publié la solution pour y parvenir. Pointe du chapeau à eux pour le code supplémentaire.

sftp {user}@{host}:{remote_dir} <<< $'put {local_file_path}'
Kyle
la source
20
je demandais l'inverse (copie sur le serveur distant), mais je l'ai trouvé moi-même: sftp {utilisateur} @ {hôte}: {dir} <<< $ 'put {chemin vers le fichier}'
Thariama
2
Mes excuses, incompris. Je vais copier votre réponse dans la réponse au cas où cela pourrait aider quelqu'un à l'avenir. Merci @Thariama
Kyle
1
Pour nous TL: DR -types, il est un peu déroutant d'avoir la solution incorrecte comme première ligne en surbrillance :-)
skoll
1
@Kyle, beaucoup mieux!
skoll du
1
Je trouve bizarre que sftp n'inclue pas d'option pour télécharger un fichier en une seule commande. Cela fonctionne bien, mais c'est beaucoup trop piraté pour une opération aussi simple. C'est toujours la seule chose que je peux trouver qui fonctionne réellement hors de la boîte, alors merci. :)
Teekin
7

Pour TÉLÉCHARGER un seul fichier, vous devrez créer un script bash. Quelque chose comme ce qui suit devrait fonctionner sur OS X si vous avez sshpassinstallé.

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
sstur
la source
Merci pour la réponse, cependant, la réponse que j'ai indiquée ci-dessus utilisera une commande à une seule ligne avec sftp pour obtenir un fichier à partir d'un serveur distant et enregistrer le fichier à un emplacement spécifique sur votre machine locale. J'ai vérifié qu'il fonctionnera sur OS X avec uniquement sftp.
Kyle
2
Oui, c'est certainement la meilleure réponse pour le transfert de distant vers local. Cependant, je pensais que j'ajouterais une solution pour faire le contraire: local à distant. Juste au cas où cela serait utile à quiconque. Merci!
sstur
3

sftp prend en charge les fichiers batch.

Depuis 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*).
synthétiseurpatel
la source
Comme il s'agit d'un processus que je fais plusieurs fois par jour pour différents fichiers à différents endroits, ce serait bien de pouvoir simplement mémoriser une commande que je pourrais taper sur une seule ligne dans mon terminal (qui est toujours ouvert) et appuyez sur Entrée. L'utilisation --batchme demanderait de mettre mes commandes dans un fichier puis de passer ce fichier en tant que paramètre. Je joue toujours avec scp, je sens que ça peut contenir ma solution.
Kyle
Peut-être que «s'attendre» est ce que vous recherchez alors. linuxjournal.com/article/3065
synthesizerpatel
3

Ou echo 'put {path to file}' | sftp {user}@{host}:{dir}, qui fonctionnerait à la fois sous Unix et PowerShell.

js2010
la source
Cette syntaxe fonctionne également avec puttyftp (psftp). Je pensais juste que je partagerais puisque c'est la raison pour laquelle je me suis retrouvé ici
9 Guy
1

Une modification mineure comme ci-dessous a fonctionné pour moi lors de son utilisation à partir de perl et de l'appel system ():

sftp {user}@{host} <<< $'put {local_file_path} {remote_file_path}'
user2443447
la source
1

Réponse SCP

Le PO a mentionné SCP, alors voici ça.

Comme d'autres l'ont souligné, SFTP est déroutant car la syntaxe de téléchargement est complètement différente de la syntaxe de téléchargement . Il devient un peu plus facile à retenir si vous utilisez le même formulaire:

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

En réalité, c'est toujours un gâchis, et c'est pourquoi les gens utilisent encore des commandes "obsolètes" telles que SCP:

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

SCP est sécurisé mais daté. Il a quelques bogues qui ne seront jamais corrigés, à savoir planter si le serveur .bash_profileémet un message. Cependant, en termes de convivialité, les développeurs avaient des années d'avance.

cz
la source