Wie verwende ich PSCP, um Dateien von einem Unix-Computer auf einen Windows-Computer zu kopieren, auf dem der Zielpfad Leerzeichen enthält?

14

Ich habe ein Problem mit PSCP in einem C # -Programm zum Kopieren einer Datei von einem Unix-Computer auf einen Windows-Computer. Das Problem tritt nur auf, wenn der Zielordner auf dem Windows-Computer ein Leerzeichen enthält. Zum Beispiel funktioniert Folgendes einwandfrei: (HINWEIS: Die IP-Adresse und das Kennwort wurden für dieses Beispiel geändert.)

pscp.exe -pw MyPassword [email protected]:/etc/myfolder/myfile.opt C:\download

Aber wenn ich es so ändere:

pscp.exe -pw MyPassword [email protected]:/etc/myfolder/myfile.opt C:\download files

Ich erhalte die folgende Fehlermeldung: Mehr als eine Remote-Quelle wird nicht unterstützt.

Mir ist klar, dass PSCP den Raum als ein anderes Ziel interpretiert. Aber wie kann ich das machen? Ich habe alle möglichen Dinge ausprobiert, wie es in Anführungszeichen zu setzen und dem Raum zu entkommen. Ich habe alles Folgende ausprobiert und nichts funktioniert:

pscp.exe -pw MyPassword [email protected]:/etc/myfolder/myfile.opt "C:\download files"
pscp.exe -pw MyPassword [email protected]:/etc/myfolder/myfile.opt C:\"download files"
pscp.exe -pw MyPassword [email protected]:/etc/myfolder/myfile.opt C:\download\\ files

Irgendwelche Ideen?

Corey Burnett
quelle

Antworten:

18

Obwohl die richtige Antwort wahrscheinlich darin besteht, WinSCP und seine C # -Bibliothek zu verwenden, habe ich einen Weg gefunden, PSCP zum Laufen zu bringen, wenn der Zielordner einen Speicherplatz enthält.

Die richtige Antwort lautet:

pscp.exe -pw MyPassword [email protected]:/etc/myfolder/myfile.opt "C:\download files"

Es stellte sich heraus, dass ich ein anderes Problem hatte, das mich glauben ließ, dass das oben genannte nicht funktionierte. Ursprünglich habe ich den vollständigen Pfad zur ausführbaren Datei PSCP.EXE verwendet. Der vollständige Pfad enthielt Leerzeichen. Also habe ich versucht, Folgendes zu tun:

"C:\My PSCP Folder\pscp.exe" -pw MyPassword [email protected]:/etc/myfolder/myfile.opt "C:\download files"

Und ich habe versucht, das von C # mit Process.Start () aufzurufen, und es ist fehlgeschlagen. Es schien, als könnte es damit umgehen, wenn entweder im PSCP-Pfad oder im Zielpfad ein Leerzeichen vorhanden wäre, aber nicht in beiden. Ich habe das behoben, indem ich den Pfad zur ausführbaren PSCP-Datei in meine Windows-Umgebungsvariablen aufgenommen habe. Jetzt kann ich einfach PSCP.EXE aufrufen und es funktioniert mit den Anführungszeichen um den Zielordner.

Corey Burnett
quelle
10

Nicht benutzen pscp.

Der WinSCP- Client (der auf PuTTY basiert) bietet eine .NET-Assembly . Hier ist ein Beispiel .

user1686
quelle
Nun, ich habe mir das angeschaut und bin auf ein anderes Problem gestoßen. Anscheinend benötigt WinSCP den SSH-Hostschlüssel (den ich nicht habe). Als ich PSCP verwendete, gab es eine Möglichkeit, die Akzeptanz des Host-Schlüssels zu automatisieren. Nach dem, was ich beim Lesen der WinSCP C # -Dokumentation sagen kann, scheint es jedoch keine Möglichkeit zu geben, den Host-Schlüssel automatisch zu akzeptieren. Irgendwelche Ideen?
Corey Burnett
1
@CoreyBurnett: Stellen Sie immer eine Verbindung zum selben Server her?
user1686
Ich erstelle eine Anwendung, die auf einem Windows-Computer installiert wird und möglicherweise eine Verbindung zu einer Reihe verschiedener Linux-Server herstellt. Als ich PSCP verwendete, fand ich eine Möglichkeit, die Befehlszeile anzuweisen, den Hostschlüssel automatisch zu akzeptieren. Auf diese Weise musste ich nicht vorher wissen, was der Host-Schlüssel war. Ich kann diese Option jedoch mit C # und WinSCP nicht finden.
Corey Burnett
Persönlich würde ich es als ernstes Sicherheitsproblem betrachten, wenn ein SSH-Client Hostschlüssel ohne Überprüfung oder Benutzerbestätigung akzeptiert.
Benutzer1686
Genau. Dies ist jedoch eine sehr spezielle Situation, in der wir eine Anwendung erstellen, die auf einem Laptop installiert wird und dann in einer kontrollierten Umgebung mit einer Unix-Box verbunden wird. Dieses Setup wird an Kunden verkauft. Es ist nicht einmal mit dem Internet verbunden. Ich versuche nur, die Installation und Verwendung zu vereinfachen, damit der Bediener der Anwendung nichts über die Host-Schlüssel wissen oder sich darum kümmern muss. Es sollte einfach funktionieren.
Corey Burnett
1

Fügen Sie dem Zielordner einen Punkt hinzu. Folgendes sollte mit dem angehängten funktionieren . zu Ihrem Beispiel:

"C:\My PSCP Folder\pscp.exe" -pw MyPassword [email protected]:/etc/myfolder/myfile.opt "C:\download files\."
Matt
quelle
0
pscp.exe -pw MyPassword [email protected]:/etc/myfolder/myfile.opt "C:\download files"

Nun, zuerst haben Sie, wie Sie bereits erwähnt haben, Leerzeichen auf Ihrem Weg. Es ist daher ratsam, Anführungszeichen "C: \ Dateien herunterladen" zu verwenden. Zweitens müssen Sie, wie Sie bereits betont haben, Ihre Anwendung zu Ihrem PATH hinzufügen, um pscp ohne seltsamen Pfad aufzurufen. und drittens. Verwenden Sie Namenskonventionen, die dieses Durcheinander verhindern, indem Sie alles zitieren.

camelCaseNaming
underscore_naming

Beide lösen das Problem und Sie sehen 100500 mal cooler aus.

Anton Stafeyev
quelle