Làm cách nào để sử dụng PSCP để sao chép tệp từ máy Unix sang máy Windows nơi đường dẫn đích có khoảng trắng?


13

Tôi gặp sự cố khi sử dụng PSCP trong chương trình C # để sao chép tệp từ máy Unix sang máy Windows. Vấn đề chỉ xảy ra khi thư mục đích trên máy Windows có khoảng trống trong đó. Ví dụ: các hoạt động sau đây hoạt động tốt: (LƯU Ý: địa chỉ IP và mật khẩu đã được thay đổi cho ví dụ này)

pscp.exe -pw MyPassword root@127.0.0.1:/etc/myfolder/myfile.opt C:\download

Nhưng khi tôi thay đổi nó thành thế này:

pscp.exe -pw MyPassword root@127.0.0.1:/etc/myfolder/myfile.opt C:\download files

Tôi nhận được lỗi sau: Nhiều hơn một nguồn từ xa không được hỗ trợ.

Tôi nhận ra rằng đó là vì PSCP coi không gian là mục tiêu khác. Nhưng làm thế nào tôi có thể làm điều đó? Tôi đã thử tất cả mọi thứ như đặt nó trong dấu ngoặc kép và thoát khỏi không gian. Tôi đã thử tất cả những điều sau đây và không có gì hoạt động:

pscp.exe -pw MyPassword root@127.0.0.1:/etc/myfolder/myfile.opt "C:\download files"
pscp.exe -pw MyPassword root@127.0.0.1:/etc/myfolder/myfile.opt C:\"download files"
pscp.exe -pw MyPassword root@127.0.0.1:/etc/myfolder/myfile.opt C:\download\\ files

Có ý kiến ​​gì không?

Câu trả lời:


18

Mặc dù câu trả lời thích hợp có lẽ là sử dụng WinSCP và thư viện C # của họ, tôi đã tìm cách để PSCP hoạt động khi thư mục đích có khoảng trống trong đó.

Câu trả lời đúng là làm điều này:

pscp.exe -pw MyPassword root@127.0.0.1:/etc/myfolder/myfile.opt "C:\download files"

Hóa ra tôi đã gặp một vấn đề khác khiến tôi nghĩ rằng những điều trên không hoạt động. Ban đầu tôi đang sử dụng đường dẫn đầy đủ để thực thi PSCP.EXE. Đường dẫn đầy đủ bao gồm không gian. Vì vậy, tôi đã cố gắng làm như sau:

"C:\My PSCP Folder\pscp.exe" -pw MyPassword root@127.0.0.1:/etc/myfolder/myfile.opt "C:\download files"

Và tôi đã cố gắng gọi nó từ C # bằng Process.Start () và nó đã thất bại. Có vẻ như nó có thể xử lý nó nếu có một khoảng trống trong đường dẫn PSCP hoặc đường dẫn đích, nhưng không phải cả hai. Tôi đã sửa nó bằng cách đưa đường dẫn đến tệp thực thi PSCP trong các biến Môi trường Windows của tôi. Bây giờ tôi có thể chỉ cần gọi PSCP.EXE và nó hoạt động với các trích dẫn xung quanh thư mục đích.


10

Đừng sử dụng pscp.

Ứng dụng khách WinSCP (được xây dựng trên đỉnh PuTTY) cung cấp một cụm .NET . Đây là một ví dụ .


Vâng, tôi đã nhìn vào đó và tôi gặp phải một vấn đề khác. Rõ ràng WinSCP yêu cầu Khóa máy chủ SSH (mà tôi không có). Khi tôi đang sử dụng PSCP, có một cách để tự động hóa việc chấp nhận Khóa máy chủ. Nhưng từ những gì tôi có thể nói khi đọc tài liệu WinSCP C #, dường như không có cách nào để tự động chấp nhận Khóa máy chủ. Có ý kiến ​​gì không?
Corey Burnett

1
@CoreyBurnett: Bạn có luôn kết nối với cùng một máy chủ không?
dùng1686

Tôi đang xây dựng một ứng dụng sẽ được cài đặt trên máy Windows và có khả năng sẽ kết nối với một số máy chủ Linux khác nhau. Khi tôi đang sử dụng PSCP, tôi đã tìm thấy một cách để nói dòng lệnh tự động chấp nhận Khóa máy chủ. Bằng cách đó, tôi không cần biết Khóa chủ trước thời hạn là gì. Tuy nhiên tôi dường như không thể tìm thấy tùy chọn đó bằng C # và WinSCP.
Corey Burnett

Cá nhân, tôi sẽ coi đó là một vấn đề bảo mật nghiêm trọng nếu máy khách SSH chấp nhận khóa máy chủ mà không cần xác minh hoặc xác nhận của người dùng.
dùng1686

Tôi đồng ý. Tuy nhiên đây là một tình huống rất cụ thể khi chúng tôi đang xây dựng một ứng dụng sẽ được cài đặt trên máy tính xách tay và sau đó máy tính xách tay đó sẽ được kết nối với hộp Unix trong môi trường được kiểm soát. Thiết lập này sẽ được bán cho khách hàng. Nó thậm chí không được kết nối với Internet. Tôi chỉ cố gắng làm cho nó đơn giản để cài đặt và sử dụng để người vận hành ứng dụng không phải biết hoặc lo lắng về công cụ Khóa máy chủ. Nó chỉ nên làm việc.
Corey Burnett

1

Nối một khoảng thời gian vào thư mục đích. Sau đây nên làm việc với các phụ lục . về ví dụ của bạn:

"C:\My PSCP Folder\pscp.exe" -pw MyPassword root@127.0.0.1:/etc/myfolder/myfile.opt "C:\download files\."

0
pscp.exe -pw MyPassword root@127.0.0.1:/etc/myfolder/myfile.opt "C:\download files"

đầu tiên, như bạn đã đề cập, bạn có không gian trên con đường của mình. Vì vậy, sẽ là khôn ngoan khi sử dụng dấu ngoặc kép "C: \ download tệp". Thứ hai như bạn đã chỉ ra, bạn cần thêm ứng dụng của mình vào PATH để gọi pscp mà không có bất kỳ đường dẫn lạ nào. và thứ ba. Sử dụng các quy ước đặt tên để ngăn chặn sự lộn xộn này gây ra bằng cách trích dẫn mọi thứ.

camelCaseNaming
underscore_naming

Cả hai đều giải quyết vấn đề, và bạn trông ngầu hơn 100500 lần.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.