Frage

ich normalerweise scp verwenden Sachen zu kopieren, aber jetzt mit dem leistungsfähigeren rsync Befehl Ich versuche zu gewöhnen. Es hilft mir, weniger Bandbreite zu verwenden, indem nur das Kopieren von Dateien auf, die sich geändert haben. Allerdings hat rsync viel komplexer Parameter, also dachte ich, hey, ich werde nur ein wenig Bash-Skript machen, dass es einfach für mich, und rufen Sie den Befehl ‚RSCP‘ macht. Also ging ich so etwas wie diese zu bauen. Beachten Sie in dem folgende Beispiel, dass mein Web-Host verwendet eine andere Port-Nummer neben 22, so dass deshalb der $ 1 für das verwendet wird.

#!/bin/bash

rsync -avzp --progress --rsh='ssh -p$1' $2 $3 $4 $5 $6 $7

So, ihre Nutzung, hoffte ich, wäre so etwas wie:

rscp 3822 --exclude=tiny_mce /var/www/mysite/* root@webhost.com:~/www/mysite

Das würde es ein wenig näher an meine Verwendung des scp-Befehl, Sie zu sehen.

Allerdings, wenn ich dies laufe ich diesen Fehler:

building file list ... 
4 files to consider
ERROR: destination must be a directory when copying more than 1 file
rsync error: errors selecting input/output files, dirs (code 3) at main.c(494) [receiver=2.6.9]
rsync: connection unexpectedly closed (8 bytes received so far) [sender]
rsync error: error in rsync protocol data stream (code 12) at io.c(454) [sender=2.6.9]

Aber wenn ich zum regulären rsync Befehl zurück, es funktioniert ganz gut.

Kann jemand herausfinden, was ich falsch mache in meinem Bash-Skript?

War es hilfreich?

Lösung

/ var / www / mysite / * wird von der Shell erweitert, so dass Sie viele weitere Argumente übergeben werden, als Sie im Skript sind Handhabung.

Auch Variablen nicht in einfachen Anführungszeichen ersetzt, so müssen Sie doppelte Anführungszeichen verwenden. (Siehe bash Manpage )

Versuchen Sie folgendes:

#!/bin/bash
PORT=$1
shift
rsync -avzp --progress --rsh="ssh -p$PORT" "$@"

Zuerst nehmen wir den Hafen aus der Argumentliste (mit Shift), dann verwenden wir „$ @“, das speziell ist, bezieht er sich auf das Argument (auf das Skript in diesem Fall), und wird auf alle von ihnen umgewandelt, aber jeweils separat in doppelten Anführungszeichen. (Siehe bash Manpage für weitere Details) .

Andere Tipps

Könnten Sie nicht technisch drehen diese in eine Funktion auch:

    rscp() {
rsync -avzp --progress --rsh="ssh -p$PORT" "$@"
}

Und dann, wenn Sie führen Sie es: RSCP 3822

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top