Single Line SFTP vom Terminal


92

Im Laufe des Tages führe ich möglicherweise mehrmals einen Test durch, bei dem ich eine Protokolldatei auf einem Remote-Server durchsuchen muss. Ich habe mich daran gewöhnt, mit meinem Terminal auf sftpden Remote-Server zuzugreifen und die gewünschte Protokolldatei /tmpauf meinem lokalen Computer abzurufen.

Ich habe heute die Optionen durchgesehen, man sftpum herauszufinden, wie die folgenden Befehle im Grunde genommen in einer einzigen Zeile ausgeführt werden können, damit ich keinen Befehl eingeben, die Eingabetaste drücken, einen Befehl eingeben, die Eingabetaste drücken usw.

(was mache ich nun)

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

Ich habe beim Durchsuchen man sftpeines Verweises gefunden, auf scpden ich vorher noch nicht Bezug genommen habe. Ich habe das Gefühl, dass es das ist, wonach ich suche, aber ich habe keine Möglichkeit gefunden, anzugeben, wohin die sicher kopierte Datei gehen soll.

Könnte mir jemand eine Möglichkeit bieten, /dir/filevon einem Remote-Server zu gelangen und ihn herunterladen zu lassen /tmp/file_plus-my-description?

Ich hatte gehofft, einen sftp- oder scp-Befehl ausführen zu können, der einer regulären UNIX-Kopie ähnelt, wie:

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

Ich verwende das Terminalin Mac OS X 10.8 integrierte. Vielen Dank.

Antworten:


203

Update Sep 2017 - tl; dr

Laden Sie eine einzelne Datei von einem Remote-FTP-Server auf Ihren Computer herunter :

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

Laden Sie eine einzelne Datei von Ihrem Computer auf einen Remote-FTP-Server hoch:

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

Ursprüngliche Antwort:

Ok, ich fühle mich ein bisschen dumm. Aber ich habe es herausgefunden. Ich hatte es fast oben mit:

sftp user@host remoteFile localFile

Die einzige Dokumentation, die im Terminal angezeigt wird, ist folgende:

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

Ich bin jedoch auf diese Seite gestoßen, die unter der Zusammenfassung Folgendes zeigt:

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

Die einfache Antwort lautet also, dass Sie nur :nach Ihrem Benutzer und Host die Remote-Datei und den lokalen Dateinamen suchen. Unglaublich einfach!

Einzeilige SFTP-Kopierdatei:

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

Update Februar 2016

Für den Fall , für den Befehl sucht jemand das Gegenteil davon zu tun und drücken Sie eine Datei von Ihrem lokalen Computer zu einem Remote - Server in einer einzigen Zeile sftp Befehl, Benutzer @Thariama unten bekannt gegeben , die Lösung zu erreichen , dass. Hutspitze zu ihnen für den zusätzlichen Code.

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

20
Ich habe umgekehrt gefragt (Kopie auf Remote-Server), aber ich habe es selbst gefunden: sftp {user} @ {host}: {dir} <<< $ 'put {Pfad zur Datei}'
Thariama

2
Ich entschuldige mich, missverstanden. Ich werde Ihre Antwort in die Antwort kopieren, falls sie in Zukunft jemandem helfen kann. Danke @Thariama
Kyle

1
Für uns TL: DR-Typen ist es etwas verwirrend, die falsche Lösung als erste hervorgehobene Zeile zu haben :-)
Skoll

1
@ Kyle, viel besser!
Skoll

1
Ich finde es bizarr, dass sftp keine Option zum Hochladen einer Datei in einem einzigen Befehl enthält. Das funktioniert gut, ist aber für eine so einfache Operation viel zu hackig. Es ist immer noch das einzige, was ich finden kann, das tatsächlich sofort funktioniert, also danke. :)
Teekin

7

Um eine einzelne Datei hochzuladen, müssen Sie ein Bash-Skript erstellen. So etwas wie das Folgende sollte unter OS X funktionieren, wenn Sie sshpassinstalliert haben.

Verwendung:

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

Fügen Sie dieses Skript irgendwo in Ihren Pfad ein und nennen Sie es 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

Vielen Dank für die Antwort. Die oben angegebene Antwort verwendet jedoch einen einzeiligen Befehl mit sftp, um eine Datei von einem Remote-Server abzurufen und die Datei an einem bestimmten Speicherort auf Ihrem lokalen Computer zu speichern. Ich habe überprüft, dass es unter OS X nur mit SFTP funktioniert.
Kyle

2
Ja, das ist sicherlich die beste Antwort für die Übertragung von Remote zu Local. Ich dachte jedoch, ich würde eine Lösung für das Gegenteil hinzufügen: lokal zu remote. Nur für den Fall, dass es für jemanden hilfreich ist. Vielen Dank!
sstur

3

SFTP unterstützt Batch-Dateien.

Von der Manpage:

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

Da dies ein Vorgang ist, den ich mehrmals täglich für verschiedene Dateien an verschiedenen Orten durchführe, wäre es schön, wenn ich mir nur einen Befehl merken könnte, den ich in eine einzelne Zeile in meinem Terminal eingeben könnte (der immer geöffnet ist) und die Eingabetaste drücken könnte. Für die Verwendung --batchmüsste ich meine Befehle in eine Datei einfügen und diese Datei dann als Parameter übergeben. Ich spiele immer noch mit scp, ich glaube, es könnte meine Lösung enthalten.
Kyle

Vielleicht ist 'erwarten' das, wonach Sie dann suchen. linuxjournal.com/article/3065
Synthesizerpatel

3

Oder echo 'put {path to file}' | sftp {user}@{host}:{dir}was sowohl in Unix als auch in Powershell funktionieren würde.


Diese Syntax funktioniert auch mit Puttyftp (psftp). Ich dachte nur, ich würde teilen, da das der Grund ist, warum ich hier
9 Guy

1

Eine geringfügige Änderung wie unten hat bei mir funktioniert, wenn ich sie innerhalb von perl und system () aufrufe:

sftp {user}@{host} <<< $'put {local_file_path} {remote_file_path}'

1

SCP-Antwort

Das OP erwähnte SCP, also hier ist das.

Wie andere bereits betont haben, ist SFTP verwirrend, da sich die Upload- Syntax vollständig von der Download- Syntax unterscheidet. Es wird geringfügig leichter zu merken , wenn Sie das gleiche Formular verwenden:

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

In Wirklichkeit ist dies immer noch ein Chaos, und deshalb verwenden die Leute immer noch "veraltete" Befehle wie SCP:

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

SCP ist sicher, aber veraltet. Es gibt einige Fehler, die niemals behoben werden können, nämlich Abstürze, wenn der Server .bash_profileeine Nachricht ausgibt. In Bezug auf die Benutzerfreundlichkeit waren die Entwickler jedoch Jahre voraus.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.