Wie man eine Datei in Remote-Host zusammen mit der Erstellung des Verzeichnisses mit ssh erstellen

StackOverflow https://stackoverflow.com/questions/3143907

Frage

habe ich eine Datei beispiels / a / b / c / Datei in meinem Host. Ich möchte eine Datei auf dem Remote-Host im Verzeichnis sagen dest erstellen. Nun ist die Frage, wie kann ich eine Datei in Remote-Host erstellen, wie / dest / a / b / c / d / Datei Perl-Skript verwenden und mit ssh. Jede Idee, wie erstelle ich Verzeichnisse im Skript.?

Danke.

War es hilfreich?

Lösung

Um die Verzeichnisstruktur zu reproduzieren, zu verwenden catfile und abs2rel aus dem File::Spec Modul: catfile verbindet Stücke einen Weg zu machen, und abs2rel gibt den Pfad relativ zu einem Basisverzeichnis.

Die File::Copy Moduls copy wird an einem Griff kopieren. Dies passt gut mit wie sshopen3 öffnet Griffe zum Standard Eingabe, Ausgabe und Fehler auf der Zielseite.

Der Remote-Befehl besteht aus 3 Teilen:

  • mkdir -p $dst_dir, erstellt alle Verzeichnisse die Datei im Zielpfad vorangehenden
  • cat >$dst_file, verbindet den SEND Griff in die Zieldatei
  • md5sum $dst_file, zeigt, dass die Daten sicher angekommen

Beispielprogramm unter:

#! /usr/bin/perl

use warnings;
use strict;

use File::Basename;
use File::Copy;
use File::Spec::Functions qw/ abs2rel catfile /;
use Net::SSH qw/ sshopen3 /;

my $HOST     = "user\@host.com";
my $SRC_BASE = "/tmp/host";
my $SRC_FILE = "$SRC_BASE/a/b/c/file";
my $DST_BASE = "/tmp/dest";
system("md5sum", $SRC_FILE) == 0 or exit 1;

my $dst_file = catfile $DST_BASE, abs2rel $SRC_FILE, $SRC_BASE;
my $dst_dir  = dirname $dst_file;
sshopen3 $HOST, *SEND, *RECV, *ERRORS,
         "mkdir -p $dst_dir && cat >$dst_file && md5sum $dst_file"
  or die "$0: ssh: $!";

binmode SEND;
copy $SRC_FILE, \*SEND or die  "$0: copy failed: $!";
close SEND             or warn "$0: close: $!";  # later reads hang without this

undef $/;
my $errors = <ERRORS>;
warn $errors if $errors =~ /\S/;
close ERRORS or warn "$0: close: $!";

print <RECV>;
close RECV or warn "$0: close: $!";

Probendurchlauf:

$ ./create-file
746308829575e17c3331bbcb00c0898b  /tmp/host/a/b/c/file
746308829575e17c3331bbcb00c0898b  /tmp/dest/a/b/c/file
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top