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 scp
scheitern. 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 scp
sagt das scp
ist remote file copy program
. Warum scheitert es also lautlos und verhält sich so cp
?
Wie kann man das beheben?
Meine Version von openssh-client
ist1:6.0p1-4+deb7u6
scp
"eine Sache" ist das Kopieren zwischen Hosts in einem Netzwerk. Der aktuelle Computer ist Teil des Netzwerks. Würden Sie auch in Betracht ziehenscp
, 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?Antworten:
In Bash könnten Sie eine Wrapper-Funktion wie diese schreiben.
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 derscp
Befehl 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 verwendencommand "${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.
quelle
kurze Antwort ist, dass Sie nicht können.
Beachten Sie, dass
man scp
Remote-Host als optional angegeben wird:Jetzt, wenn Sie den Befehl ausgeben
scp
wird darüber entscheiden , wo mit der Suche nach Remote - Host ist:
inarg1
oderarg2
(und zwei Remote - Host kann permited (solaris, ubuntu) altough , dass nicht immer der Fall war).Wenn weder Doppelpunkt
arg1
nocharg2
Doppelpunkt vorhanden sind,scp
verhalten Sie sich einfach socp
.quelle
Zusätzlich zu anderen Antworten zu beachten , dass
scp
kein separates Protokoll ist per se , sondern ist einfach die älterercp
Verwendungssh
für den Transport nicht unverschlüsseltTCP
. Es war als Drop-In-Ersatz gedacht, bei dem geskriptete oder nicht geskriptetercp
Elementescp
ohne Änderungen durch sicherere ersetzt werden konnten. Undrcp
erlaubt entweder Remote- oder lokales Kopieren durch Parsen der:
.quelle
Warum nicht versuchen, sftp ? Sie können dann
cd
auf dem Remote-Server undlcd
im lokalen Dateisystemput
eine lokale Datei auf Remote hochladen.quelle
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.
quelle
cp
, "unsere lokalen Kopieranforderungen zu erfüllen"?