Как использовать PSCP для копирования файла с компьютера Unix на компьютер с Windows, где целевой путь имеет пробелы?

У меня проблема с использованием 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

Есть идеи?

3 ответа

Решение

Хотя правильным ответом, вероятно, является использование 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, и он работает с кавычками вокруг целевой папки.

Не использовать pscp,

Клиент WinSCP (который построен поверх PuTTY) обеспечивает сборку.NET. Вот пример.

У меня была такая же проблема, я добавил pscp.exe каталог в качестве переменной PATH для сеанса в cmd.exe:

set PATH="C:\Program Files\PuTTY;%PATH"

У меня был старый нетбук с Windows, который я разобрал на запчасти. Я подключил жесткий диск к своему рабочему столу Ubuntu, поскольку моя единственная текущая машина с Windows - это ноутбук, и я не хотел получать адаптер SATA-USB. Я правильно смонтировал жесткий диск и мог перемещаться по файлам, но при попытке переноса с Ubuntu на Windows 10 с помощью:

pscp user@192.168.0.222:/media/path/to/file.zip "D:\backups

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

Мне удалось без проблем передать файл, используя [OPTION] предоставленный pscp называется -load sessname где sessnameэто имя сохраненного сеанса. Полная команда была следующей:

pscp -load ubuntu@local user@192.168.0.222:/media/path/to/file.zip "D:\backups

Это решило проблему, и с помощью -load sessname вариант работал для всех файлов и каталогов, которые я пытался передать, независимо от того, использую ли я user@ipaddress формат, или user@hostname формат для исходной машины.

Надеюсь, это поможет кому-то, кто пытается использовать машину Ubuntu для восстановления файлов с жесткого диска Windows.

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

"C:\My PSCP Folder\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:\download files". Во-вторых, как вы уже указали, вам нужно добавить ваше приложение в PATH, чтобы вызывать pscp без какого-либо странного пути. и третье. Используйте соглашения об именах, которые предотвращают этот беспорядок, вызванный цитированием всего.

camelCaseNaming
underscore_naming

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

Другие вопросы по тегам