วิธีใช้ PSCP เพื่อคัดลอกไฟล์จากเครื่อง Unix ไปยังเครื่อง Windows ที่มีพา ธ เป้าหมายมีช่องว่าง


14

ฉันมีปัญหาในการใช้ PSCP ในโปรแกรม C # เพื่อคัดลอกไฟล์จากเครื่อง Unix ไปยังเครื่อง Windows ปัญหาจะเกิดขึ้นเฉพาะเมื่อโฟลเดอร์เป้าหมายในเครื่อง Windows มีพื้นที่ว่างอยู่ ตัวอย่างเช่นการทำงานต่อไปนี้ทำงานได้ดี: (หมายเหตุ: ที่อยู่ IP และรหัสผ่านถูกเปลี่ยนสำหรับตัวอย่างนี้)

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

แต่เมื่อฉันเปลี่ยนเป็น:

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

ฉันได้รับข้อผิดพลาดต่อไปนี้: ไม่รองรับแหล่งข้อมูลระยะไกลมากกว่าหนึ่งแหล่ง

ฉันรู้ว่าเป็นเพราะ PSCP inteprets พื้นที่เป็นเป้าหมายอื่น แต่ฉันจะทำอย่างไร ฉันลองทุกสิ่งเช่นใส่ไว้ในเครื่องหมายคำพูดและหนีออกจากพื้นที่ ฉันได้ลองทั้งหมดต่อไปนี้แล้วและไม่มีอะไรทำงาน:

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

ความคิดใด ๆ

คำตอบ:


18

แม้ว่าคำตอบที่ถูกต้องน่าจะใช้ WinSCP และไลบรารี C # ของพวกเขา แต่ฉันหาวิธีที่จะให้ PSCP ทำงานเมื่อโฟลเดอร์เป้าหมายมีพื้นที่ว่างอยู่

คำตอบที่ถูกต้องคือทำสิ่งนี้:

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

ปรากฎว่าฉันมีปัญหาอื่นที่ทำให้ฉันคิดว่าข้างต้นไม่ทำงาน เดิมทีฉันใช้เส้นทางแบบเต็มไปยังไฟล์ปฏิบัติการ PSCP.EXE เส้นทางแบบเต็มรวมช่องว่าง ดังนั้นฉันจึงพยายามทำสิ่งต่อไปนี้:

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

และฉันพยายามโทรหาจาก C # โดยใช้ Process.Start () และมันก็ล้มเหลว ดูเหมือนว่าจะสามารถจัดการได้หากมีช่องว่างในเส้นทาง PSCP หรือเส้นทางเป้าหมาย แต่ไม่ใช่ทั้งสองอย่าง ฉันแก้ไขที่โดยรวมเส้นทางไปยังปฏิบัติการ PSCP ในตัวแปร Windows Environment ของฉัน ตอนนี้ฉันสามารถเรียก PSCP.EXE ได้และมันสามารถทำงานกับเครื่องหมายคำพูดรอบ ๆ โฟลเดอร์เป้าหมายได้


10

pscpอย่าใช้

WinSCPลูกค้า (ซึ่งสร้างขึ้นบนฉาบ) ยังมีการชุมนุม .NET นี่คือตัวอย่าง


ฉันดูแล้วก็เจอปัญหาอื่น เห็นได้ชัดว่า WinSCP ต้องการรหัสโฮสต์ SSH (ซึ่งฉันไม่มี) เมื่อฉันใช้ PSCP มีวิธีหนึ่งที่จะทำให้การยอมรับคีย์โฮสต์โดยอัตโนมัติ แต่จากสิ่งที่ฉันสามารถบอกได้ในการอ่านเอกสาร WinSCP C # ดูเหมือนจะไม่มีทางที่จะยอมรับรหัสโฮสต์โดยอัตโนมัติ ความคิดใด ๆ
คอเรย์เบอร์เน็ตต์

1
@CoreyBurnett: คุณเชื่อมต่อกับเซิร์ฟเวอร์เดียวกันเสมอหรือไม่?
user1686

ฉันกำลังสร้างแอปพลิเคชั่นที่จะติดตั้งบนเครื่อง Windows และอาจเชื่อมต่อกับเซิร์ฟเวอร์ Linux จำนวนมาก เมื่อฉันใช้ PSCP ฉันพบวิธีบอกบรรทัดคำสั่งให้ยอมรับรหัสโฮสต์โดยอัตโนมัติ ด้วยวิธีนี้ฉันไม่จำเป็นต้องรู้ว่าคีย์โฮสต์คืออะไรก่อนเวลา อย่างไรก็ตามฉันไม่พบตัวเลือกนั้นโดยใช้ C # และ WinSCP
คอเรย์เบอร์เน็ตต์

โดยส่วนตัวแล้วฉันจะถือว่าเป็นปัญหาด้านความปลอดภัยที่ร้ายแรงหากลูกค้า SSH ยอมรับรหัสโฮสต์โดยไม่มีการยืนยันหรือการยืนยันจากผู้ใช้
1686

ฉันเห็นด้วย. อย่างไรก็ตามนี่เป็นสถานการณ์ที่เฉพาะเจาะจงมากซึ่งเรากำลังสร้างแอพพลิเคชั่นที่จะติดตั้งบนแล็ปท็อปจากนั้นแล็ปท็อปนั้นจะเชื่อมต่อกับกล่อง Unix ในสภาพแวดล้อมที่มีการควบคุม การตั้งค่านี้จะขายให้กับลูกค้า มันไม่ได้เชื่อมต่อกับอินเทอร์เน็ต ฉันแค่พยายามทำให้ง่ายต่อการติดตั้งและใช้งานเพื่อให้ผู้ดำเนินการของแอปพลิเคชันไม่ต้องกังวลหรือกังวลเกี่ยวกับสิ่งที่โฮสต์คีย์ มันควรจะทำงาน
คอเรย์เบอร์เน็ตต์

1

ผนวกจุดลงในโฟลเดอร์ปลายทาง ต่อไปนี้ควรทำงานร่วมกับท้าย ในตัวอย่างของคุณ:

"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"

ก่อนอื่นดังที่คุณพูดไปแล้วคุณมีช่องว่างในเส้นทางของคุณ ดังนั้นควรใช้เครื่องหมายคำพูด "C: \ download files" ประการที่สองเมื่อคุณชี้ให้เห็นแล้วคุณจำเป็นต้องเพิ่มแอปพลิเคชันของคุณลงใน PATH ของคุณเพื่อที่จะเรียกใช้ pscp โดยไม่มีเส้นทางแปลก ๆ และที่สาม ใช้หลักการตั้งชื่อที่ป้องกันไม่ให้เกิดความยุ่งเหยิงนี้โดยอ้างถึงทุกสิ่ง

camelCaseNaming
underscore_naming

ทั้งแก้ปัญหาและคุณดูเย็นลง 100500 ครั้ง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.