Как использовать 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 . Вот пример .

user1686
источник
Ну, я посмотрел на это и столкнулся с другой проблемой. Видимо WinSCP требует SSH Host Key (которого у меня нет). Когда я использовал PSCP, был способ автоматизировать принятие ключа хоста. Но из того, что я могу сказать, читая документацию по WinSCP C #, похоже, нет никакого способа автоматически принять ключ хоста. Есть идеи?
Кори Бернетт
1
@CoreyBurnett: Вы всегда подключаетесь к одному и тому же серверу?
user1686
Я создаю приложение, которое будет установлено на компьютере с Windows и, возможно, будет подключаться к ряду различных серверов Linux. Когда я использовал PSCP, я нашел способ заставить командную строку автоматически принять ключ хоста. Таким образом, мне не нужно было заранее знать, какой ключ у хоста. Однако я не могу найти эту возможность, используя C # и WinSCP.
Кори Бернетт
Лично я считаю это серьезной проблемой безопасности, если SSH-клиент принимает ключи хоста без проверки или подтверждения пользователя.
user1686
Я согласен. Однако это очень специфическая ситуация, когда мы создаем приложение, которое будет установлено на ноутбуке, а затем этот ноутбук будет подключен к Unix-боксу в контролируемой среде. Эта установка будет продана клиентам. Он даже не подключен к Интернету. Я просто пытаюсь упростить установку и использование, чтобы оператор приложения не знал и не беспокоился о компонентах Host Key. Это должно просто работать.
Кори Бернетт
1

Добавить точку в папку назначения. Следующее должно работать с приложением . на вашем примере:

"C:\My PSCP Folder\pscp.exe" -pw MyPassword root@127.0.0.1:/etc/myfolder/myfile.opt "C:\download files\."
Matt
источник
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 раз круче.

Антон Стафеев
источник