Jak używać PSCP do kopiowania pliku z komputera z systemem Unix na komputer z systemem Windows, na którym ścieżka docelowa ma spacje?

14

Mam problem z użyciem PSCP w programie C # do skopiowania pliku z komputera z systemem Unix na komputer z systemem Windows. Problem występuje tylko wtedy, gdy w folderze docelowym na komputerze z systemem Windows jest miejsce. Na przykład następujące działa dobrze: (UWAGA: adres IP i hasło zostały zmienione w tym przykładzie)

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

Ale kiedy zmienię to na:

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

Pojawia się następujący błąd: Więcej niż jedno zdalne źródło nie jest obsługiwane.

Zdaję sobie sprawę, że to dlatego, że PSCP interpretuje przestrzeń jako kolejny cel. Ale jak mogę to zrobić? Próbowałem różnych rzeczy, takich jak wstawianie cytatów i ucieczka w przestrzeń. Wypróbowałem wszystkie poniższe i nic nie działa:

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

Jakieś pomysły?

Corey Burnett
źródło

Odpowiedzi:

18

Chociaż poprawną odpowiedzią jest prawdopodobnie użycie WinSCP i ich biblioteki C #, znalazłem sposób na uruchomienie PSCP, gdy folder docelowy ma w nim miejsce.

Prawidłowa odpowiedź to zrobić:

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

Okazuje się, że miałem inny problem, który kazał mi myśleć, że powyższe nie działa. Pierwotnie korzystałem z pełnej ścieżki do pliku wykonywalnego PSCP.EXE. Pełna ścieżka zawierała spacje. Próbowałem więc wykonać następujące czynności:

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

I próbowałem wywołać to z C # za pomocą Process.Start () i to się nie udało. Wyglądało na to, że poradzi sobie z tym, jeśli na ścieżce PSCP lub ścieżce docelowej będzie spacja, ale nie jedno i drugie. Naprawiłem to, dołączając ścieżkę do pliku wykonywalnego PSCP w moich zmiennych środowiska Windows. Teraz mogę po prostu wywołać PSCP.EXE i działa on z cytatami wokół folderu docelowego.

Corey Burnett
źródło
10

Nie używać pscp.

WinSCP klient (który jest zbudowany na szczycie PuTTY) dostarcza zestawu .NET . Oto przykład .

użytkownik1686
źródło
Cóż, spojrzałem na to i wpadłem na inny problem. Najwyraźniej WinSCP wymaga klucza hosta SSH (którego nie mam). Kiedy korzystałem z PSCP, istniał sposób na zautomatyzowanie akceptacji klucza hosta. Ale z tego, co mogę powiedzieć po przeczytaniu dokumentacji WinSCP C #, wydaje się, że nie ma sposobu na automatyczne zaakceptowanie klucza hosta. Jakieś pomysły?
Corey Burnett,
1
@CoreyBurnett: Czy zawsze łączysz się z tym samym serwerem?
user1686,
Tworzę aplikację, która zostanie zainstalowana na komputerze z systemem Windows i potencjalnie połączy się z wieloma różnymi serwerami Linux. Kiedy korzystałem z PSCP, znalazłem sposób, aby powiedzieć linii poleceń, aby automatycznie akceptowała klucz hosta. W ten sposób nie musiałem wiedzieć, co jest kluczem hosta przed czasem. Jednak nie mogę znaleźć tej opcji przy użyciu C # i WinSCP.
Corey Burnett,
Osobiście uważam to za poważny problem bezpieczeństwa, jeśli klient SSH akceptuje klucze hosta bez weryfikacji lub potwierdzenia użytkownika.
user1686,
Zgadzam się. Jest to jednak bardzo specyficzna sytuacja, w której budujemy aplikację, która zostanie zainstalowana na laptopie, a następnie ten laptop zostanie podłączony do kontrolowanego środowiska Unix. Ta konfiguracja zostanie sprzedana klientom. Nie jest nawet podłączony do Internetu. Staram się tylko ułatwić instalację i użytkowanie, aby operator aplikacji nie musiał wiedzieć ani martwić się o klucz hosta. To powinno po prostu działać.
Corey Burnett,
1

Dodaj kropkę do folderu docelowego. Następujące powinny działać z dołączonym . na twoim przykładzie:

"C:\My PSCP Folder\pscp.exe" -pw MyPassword [email protected]:/etc/myfolder/myfile.opt "C:\download files\."
Matt
źródło
0
pscp.exe -pw MyPassword [email protected]:/etc/myfolder/myfile.opt "C:\download files"

po pierwsze, jak już wspomniałeś, masz spacje na swojej drodze. Dlatego rozsądnie byłoby użyć cytatów „C: \ download files”. Po drugie, jak już wskazałeś, musisz dodać swoją aplikację do PATH, aby wywołać pscp bez jakiejkolwiek dziwnej ścieżki. i po trzecie. Stosuj konwencje nazewnictwa, które zapobiegają bałaganowi spowodowanemu cytowaniem wszystkiego.

camelCaseNaming
underscore_naming

Oba rozwiązują problem i wyglądasz 100500 razy chłodniej.

Anton Stafiejew
źródło