Lassen Sie scp sich so verhalten, wie es soll (Remote-Dateikopierprogramm) [geschlossen]

7

Ich möchte die lokale Datei mit auf einen Remote-Server kopieren scp.

scp -rp local-file my.server.com:/tmp/

Manchmal vergesse ich anzugeben, wohin auf dem Remote-Server die Datei kopiert werden soll:

scp -rp local-file my.server.com

oder manchmal tippe ich falsch :auf ;:

scp -rp local-file my.server.com;/tmp/

sollte in beiden Fällen scpscheitern. Stattdessen verhält es sich völlig idiotisch und kopiert die lokale Datei wie gewohnt lokal cp.

cp local-file my.server.com

Sogar man scpsagt das scpist remote file copy program. Warum scheitert es also lautlos und verhält sich so cp?

Wie kann man das beheben?

Meine Version von openssh-clientist1:6.0p1-4+deb7u6

Martin Vegter
quelle
7
Es gibt nichts zu "beheben", das Verhalten ist wie erwartet und kann beim Erstellen von Skripten hilfreich sein.
Mat
7
Sie würden nicht manuell. Sie würden beim Schreiben generischer Skripte (z. B. Bereitstellung auf Clustern, bei denen das, was wohin geht (oder von wo entnommen wird) je nach "Umgebung" variiert - einfache Testkonfiguration mit einem einzelnen System im Vergleich zur Produktbereitstellung mit vielen verschiedenen Computern). Nur weil Sie eine Funktion nicht nützlich finden, heißt das nicht, dass alle anderen zustimmen.
Mat
12
Es gibt keinen Fehler. Es entspricht nicht Ihren Erwartungen, das ist ein anderes Thema. SCP macht eine Sache: Kopieren Sie eine Quelle zum Ziel.
Mat
1
@MartinVegters scp"eine Sache" ist das Kopieren zwischen Hosts in einem Netzwerk. Der aktuelle Computer ist Teil des Netzwerks. Würden Sie auch in Betracht ziehen scp, lokale-> Remote- , Remote-> lokale und Remote-> Remote- Kopien durchzuführen (anstatt dass für jedes Programm ein separates Programm erforderlich ist), um gegen die Philosophie "Eine Sache tun" zu verstoßen?
Chris H
1
@ MartinVegter warum kann scp auch cp? Aus dem gleichen Grund kann rsync von lokal zu lokal, lokal zu remote, remote zu lokal und remote zu remote synchronisieren. rsync ist ein generisches Tool, das Daten von einem Ort zum anderen synchronisiert. scp ist ein generisches Tool, das Daten von einem Ort an einen anderen kopiert. Beide können sowohl mit lokalen als auch mit entfernten Quellen und Zielen arbeiten.
Cas

Antworten:

7

In Bash könnten Sie eine Wrapper-Funktion wie diese schreiben.

function scp { 
  if grep -q ':[^ $]' <<< "$*" ; then
    command "${FUNCNAME[0]}" "$@"
  else
    echo "missing or invalid hostname:path in scp command"
    return 1
  fi
}

Dies ist ein sehr grobes Beispiel. Es wird lediglich überprüft, ob :in der Befehlszeile mindestens ein Leerzeichen gefolgt ist (das ist gut genug für ein Proof-of-Concept-Beispiel, aber für die Verwendung in der Praxis nicht geeignet). Wenn dies der Fall ist, wird der scpBefehl ausgeführt. Wenn nicht, wird eine Fehlermeldung ausgegeben und mit dem Exit-Code 1 zurückgegeben.

Oder Sie könnten es als Skript schreiben - es macht in beiden Fällen kaum einen Unterschied.

Übrigens habe ich oben "In Bash" gesagt, weil ich die obige Funktion nur in Bash getestet habe. Es soll nicht bedeuten, dass nur Bash dies kann. Bei den meisten anderen sh-Implementierungen können Sie das Gleiche oder Ähnliches tun. Die Syntax kann geringfügig variieren, und Sie müssen möglicherweise command scp ...eher Hardcode als die allgemeinere verwenden command "${FUNCNAME[0]} ...".

PS: Ich kann nicht beurteilen, ob sich scp so verhalten soll oder nicht. Sie können sich für Ihr eigenes System entscheiden. Wenn Sie jedoch von solchen Dingen abhängig werden, haben Sie einen schwerwiegenden Nachteil, wenn Sie ohne all Ihre benutzerdefinierten Hacks / Krücken am System arbeiten müssen.

cas
quelle
7

kurze Antwort ist, dass Sie nicht können.

Beachten Sie, dass man scpRemote-Host als optional angegeben wird:

scp (scp-Optionen entfernt) [[user @] host1:] file1 ... [[user @] host2:] file2

Jetzt, wenn Sie den Befehl ausgeben

scp arg1 arg2

scpwird darüber entscheiden , wo mit der Suche nach Remote - Host ist :in arg1oder arg2(und zwei Remote - Host kann permited (solaris, ubuntu) altough , dass nicht immer der Fall war).

Wenn weder Doppelpunkt arg1noch arg2Doppelpunkt vorhanden sind, scpverhalten Sie sich einfach so cp.

Archemar
quelle
3

Zusätzlich zu anderen Antworten zu beachten , dass scpkein separates Protokoll ist per se , sondern ist einfach die ältere rcpVerwendung sshfür den Transport nicht unverschlüsselt TCP. Es war als Drop-In-Ersatz gedacht, bei dem geskriptete oder nicht geskriptete rcpElemente scpohne Änderungen durch sicherere ersetzt werden konnten. Und rcperlaubt entweder Remote- oder lokales Kopieren durch Parsen der :.

user4556274
quelle
0

Warum nicht versuchen, sftp ? Sie können dann cdauf dem Remote-Server und lcdim lokalen Dateisystem puteine lokale Datei auf Remote hochladen.

Thema
quelle
0

Obwohl es als Remote-Dateikopierprogramm bezeichnet wird, ist es meiner Meinung nach so konzipiert, dass es neben Remote-Anforderungen auch lokale Kopieranforderungen erfüllen kann. Dieses Verhalten wurde beim Testen in meiner Umgebung gespiegelt.

Beachten Sie auch, dass beim Abrufen des Werts aus der Umgebungsvariablen $? Nach dem lokalen Ausführen wurde ein Rückkehrcode von 0 beobachtet. Dies zeigt an, dass es sich wie erwartet verhalten hat und keinen Fehlercode ausgegeben hat.

Ich bin mir nicht sicher, ob es leider einen Weg gibt, um dieses Standardverhalten zu umgehen. Die Verwendung eines anderen Tools ist möglicherweise die einzige andere Option.

Hugh
quelle
Was ist falsch daran cp, "unsere lokalen Kopieranforderungen zu erfüllen"?
Martin Vegter
2
@MartinVegter: Dann müssen Sie viel Code schreiben, der im Grunde sagt: "Wenn sich <Ziel> auf dem lokalen Computer befindet <Kopie mit CP ausführen> sonst <Kopie mit SCP ausführen>". Viel einfacher, wenn Sie einfach alles mit scp machen können. Und es macht scp auch einfacher - es muss nicht nach einem Sonderfall suchen.
Psmears
@ MartinVegter Nichts. Ich persönlich benutze cp auch für lokale Kopien. Ich würde mir vorstellen, dass es wahrscheinlich existiert, um beide Funktionen in einem Tool zu haben.
Hugh