Dateien vom SFTP-Server abrufen und im Speicher bearbeiten

Dateien vom SFTP-Server abrufen und im Speicher bearbeiten

Gibt es einBASHMöglichkeit, auf einen SFTP-Server zuzugreifen, auf eine Datei zuzugreifen und sie ohne Herunterladen in einemPuffer, den Inhalt bearbeiten und ihn dann lokal speichern.

Ich weiß, dass dies mit einem Perl-Skript möglich ist.

@file=$sftp->get($file);

Ich suche nach einem ähnlichen Ansatz in Bash.

Die Absicht besteht darin, vom Perl-Skript wegzukommen und die Funktionalität in Bash zu implementieren.

Danke

Antwort1

Mitlibcurl mit sftpUnterstützung:

 curl sftp://sftp.example.com -o - | do_some_magic > filename


Ich habe curl auf diesen Linux-Distributionen/Unix getestet:

libcurl mit integrierter SFTP-Unterstützung: RHEL6, RHEL7

Ohne: RHEL5, Ubuntu 11.04, Ubuntu 14.04, Solaris 11

Antwort2

Sie können nicht auf eine Remote-Datei zugreifen, ohne sie herunterzuladen. Sie können jedoch eine Remote-Datei herunterladen, ohne sie im lokalen Dateisystem zu speichern. Nicht mit Bash selbst, das keine Unterstützung für SFTP bietet, sondern mit Befehlszeilenprogrammen.

Der sftpClient von OpenSSH scheint dazu nicht in der Lage zu sein: Er besteht darauf, einen suchbaren Ausgabeort zu erhalten, was eine Weiterleitung in eine Befehlsersetzung ausschließt.

Curl kann eine Datei in die Standardausgabe herunterladen, aber es wird nicht immer mit SFTP-Unterstützung erstellt (es begann als HTTP-Downloader).

Da Sie bereits wissen, wie es in Perl geht, können Sie einfach Perl ausführen.

Alternativ mounten Sie das Remote-Dateisystem überSSHFSund greifen Sie dann mit einem beliebigen Befehl wie darauf zu cat.

mkdir foo
sshfs example.com:/path/to/directory foo
content=$(cat foo/somefile)
fusermount -u foo
rmdir foo

Alternativ können Sie die Dinge auch auf die „normale“ Shell-Art erledigen. Shells sind nicht dafür gedacht, ausgefallene Datenmanipulationen im Speicher durchzuführen, sie eignen sich hauptsächlich zum Ausführen anderer Befehle und zum Arbeiten mit Dateien. Das Arbeiten mit Dateiinhalten umfasst normalerweise Pipelines und manchmal temporäre Dateien.

my_tmp_dir=
trap 'rm -rf "$my_tmp_dir"' EXIT INT HUP
my_tmp_dir=$(mktemp -d)
echo 'get remotefile localfile' | { cd "$my_tmp_dir" && sftp -q; }
content=$(cat "$my_tmp_dir/localfile")

verwandte Informationen