Як використовувати 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 інтерпретує простір як іншу ціль. Але як я можу це зробити? Я спробував усілякі речі, такі як введення цитат і втеча з космосу. Я спробував усе наступне, і нічого не працює:

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. Тепер я можу просто зателефонувати PSCP.EXE, і він працює з цитатами навколо цільової папки.


10

Не використовуйте pscp.

WinSCP клієнт (який побудований на вершині PuTTY) забезпечує складання .NET . Ось приклад .


Добре я поглянув на це і зіткнувся з іншою проблемою. Мабуть, WinSCP вимагає ключ хоста SSH (якого у мене немає). Коли я використовував PSCP, був спосіб автоматизувати прийняття ключа хоста. Але з того, що я можу сказати, читаючи документацію WinSCP C #, схоже, немає ніякого способу автоматичного прийняття ключа хоста. Будь-які ідеї?
Корі Бернетт

1
@CoreyBurnett: Ви завжди підключаєтесь до одного і того ж сервера?
користувач1686

Я будую додаток, який буде встановлено на машині Windows і потенційно підключиться до декількох різних серверів Linux. Коли я використовував PSCP, я знайшов спосіб сказати командному рядку автоматично приймати ключ хоста. Таким чином мені не потрібно було знати, що ключ господаря випередив час. Однак я не можу знайти цю опцію за допомогою C # та WinSCP.
Corey Burnett

Особисто я вважаю це серйозним питанням безпеки, якщо клієнт SSH приймав ключі хоста без підтвердження чи підтвердження користувача.
користувач1686

Я згоден. Однак це дуже специфічна ситуація, коли ми створюємо додаток, який буде встановлено на ноутбуці, а потім цей ноутбук буде підключений до коробки Unix у контрольованому середовищі. Ця установка буде продаватися клієнтам. Він навіть не підключений до Інтернету. Я просто намагаюся зробити його простим в установці та використанні, щоб оператору програми не потрібно було знати або турбуватися про речі з ключем хоста. Це має просто працювати.
Corey Burnett

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 файли". По-друге, як ви вже вказували, вам потрібно додати свою заявку до програми PATH, щоб викликати pscp без будь-якого дивного шляху. і третє. Використовуйте умови іменування, які запобігають цьому безладу, викликаному цитуванням усього.

camelCaseNaming
underscore_naming

Обидва вирішують проблему, і ви виглядаєте в 100500 разів крутіше.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.