2009-08-27 5 views
51

Ich bin mir nicht sicher, ob das möglich ist oder nicht. Im Grunde schreibe ich ein Skript, das mir erlaubt, eine Datei zu meinem Hosting scp. Das ist es soweit. Argument 1 ist die Datei, und das Argument 2 ist der Ordner, ich will es auf dem Remote-Server platziert werden:Wie erstelle ich ein Verzeichnis auf dem Remote-Host, wenn es nicht existiert, ohne dass ein ssh-in eingeht?

function upload { 
    scp $1 [email protected]:$2 
} 

Wie Sie können/kann nicht wissen, ob das Verzeichnis ich angeben, wenn ich die Funktion doesn nennen‘ t existieren, schlägt die Übertragung fehl. Gibt es eine Möglichkeit zu überprüfen, ob das Verzeichnis in der Funktion vorhanden ist, und wenn dies nicht der Fall ist, erstellen Sie es.

Ich würde es vorziehen nicht in jeder Zeit ssh in und erstellen Sie das Verzeichnis, aber wenn ich keine Wahl habe, dann habe ich keine Wahl.

Antwort

31

Sie können rsync verwenden.

Zum Beispiel

rsync -ave ssh fileToCopy ssh.myhost.net:/some/nonExisting/dirToCopyTO 

Hinweis über rsync:

rsync ist Utility-Software und Netzwerkprotokoll für Unix, die unter Verwendung Delta-Codierung von Dateien und Verzeichnisse von einem Ort zu einer anderen bei gleichzeitiger Minimierung der Datenübertragung synchronisiert, wenn geeignet mit dem rsync-Algorithmus, der schneller als andere Tools ist.

+3

Dies funktioniert nicht für mich (es beschwert sich einfach, dass das Zielverzeichnis nicht existiert) - benötigt es eine ungewöhnlich aktuelle Version von rsync? "Rsync -R" kann jedoch verwendet werden, um den gewünschten Effekt zu erzielen, wenn sich die lokale Datei in einem entsprechend benannten Verzeichnis befindet, z. B .: 'rsync -Rave ssh einige/nonExisting/dirToCopyTo/fileToCopy ssh.myhost.net: /' –

+1

@MartinKleppmann Ich bekomme nur einen Fehler beim meckern über das Verzeichnis das nicht existiert. Haben Sie diese Arbeit tatsächlich miterlebt? Wenn ja, wäre ich daran interessiert, herauszufinden, was sich an unseren rsync-Programmen unterscheidet. – DougW

+2

Ah, sieht so aus, als ob es nur eine Ebene des Verzeichnisses erstellen muss, in das kopiert werden soll. Ich habe versucht, die Bereitstellung unter/var/www/myapp/test/durchzuführen. Wenn der Server nur/var/www/hatte, ist er fehlgeschlagen. Als ich/var/www/myapp/erstellt habe, habe ich den Testordner erstellt und alles darin kopiert. Wenn Sie mehr als eine Ebene der Verzeichnisstruktur erstellen müssen, benötigen Sie eine Lösung wie @ire_and_curses. – DougW

18

Wenn Sie einen rekursiven scp (-r) ausführen, werden auch Verzeichnisse kopiert. Wenn Sie also lokal auf dem Remote-Host ein Verzeichnis mit dem gewünschten Namen erstellen, kopieren Sie die Datei in dieses Verzeichnis und kopieren es dann rekursiv. Das Verzeichnis wird mit der Datei erstellt.

Art von peinlich, aber es würde den Job machen.

+0

Was ist, wenn das Remote-Verzeichnis bereits existiert (und nicht leer ist)? – mouviciel

+0

Der neue Inhalt wird dem vorhandenen Verzeichnis hinzugefügt. – bejota

23

Ich nehme an, Sie meinen, dass Sie sich nicht interaktiv anmelden und Verzeichnisse manuell erstellen möchten, anstatt dass Sie ssh insgesamt verwenden möchten, da Sie noch ein Kennwort oder einen öffentlichen Schlüssel mit scp benötigen.

Wenn ssh mit nicht-interaktiv akzeptabel ist, dann können Sie Ihre Datei mit cat über ssh streamen:

cat $1 | ssh $2 "mkdir $3;cat >> $3/$1" 

wo

$1 = filename 
$2 = [email protected] 
$3 = dir_on_server 

Wenn das Verzeichnis bereits existiert, mkdir beklagt aber die Datei wird immer noch kopiert. Das vorhandene Verzeichnis wird nicht überschrieben. Wenn das Verzeichnis nicht existiert, wird mkdir es erstellen.

+14

'mkdir -p $ 3' vermeiden Sie mkdir, sich über das bereits existierende Verzeichnis zu beschweren. Darüber hinaus können Sie mehrere Ebenenverzeichnisse erstellen. – FabienAndre

6

Wie wäre es zum Beispiel
ssh [email protected] '[ -d /tmp/nonexist/dir ] || mkdir -p /tmp/nonexist/dir ]'; scp test.txt [email protected]:/tmp/nonexist/dir

+0

Ich sehe auf jeden Fall 'SSH', sowie' scp', was laut Wikipedia '... auf dem Secure Shell (SSH) Protokoll basiert. Dies ist nicht das, wonach das OP gefragt hat. – Bojangles

+0

Nichts ist falsch mit ssh oder scp und es gibt keine Notwendigkeit, sie zu vermeiden. Es liegt an dem Benutzerskript, das sich daran erinnern sollte, was auf dem entfernten Host erstellt wurde, damit die Überprüfungen nicht immer wieder durchgeführt werden. Ich habe kürzlich ein Protokoll-Backup-Skript geschrieben, das diese Methode verwendet. Ich würde gerne wissen, ob es andere Optionen gibt, die neue Ordner auf dem entfernten Host überprüfen und machen, wenn es keine Möglichkeiten wie CIFS, NFS, FTP oder rsync (diese läuft eigentlich über ssh) für den Remote-Dateizugriff bietet. –

+0

Tut mir leid, wenn ich in die falsche Richtung gerannt bin. Rico, ich meinte damit, dass die OP nicht SSH benutzen will, aber ich hätte die Frage besser lesen sollen; scp geht es gut. – Bojangles

Verwandte Themen