scp из удаленного Linux в локальный Windows с пробелами в локальном пути

scp из удаленного Linux в локальный Windows с пробелами в локальном пути

Чтобы перенести файл из терминала Linux в систему Windows, вполне подойдут следующие два примера.

scp /home/user.name/file.html [email protected]:/C:/Users/user.name/test_folder/file.html

scp /home/user.name/file.html [email protected]:"/C:/Users/user.name/test_folder/file.html"

Мне нужно сделать это там, где в локальной папке есть пробелы, и я не могу изменить имя, скажем/C:/Users/user.name/test folder/

Все нижеперечисленное не приводит к сообщениюscp: ambiguous target

scp /home/user.name/file.html [email protected]:"/C:/Users/user.name/test folder/file.html"

scp /home/user.name/file.html [email protected]:"/C:/Users/user.name/test\ folder/file.html"

scp /home/user.name/file.html [email protected]:"'/C:/Users/user.name/test\ folder/file.html'"

scp /home/user.name/file.html [email protected]:"/C:/Users/user.name/test\\ folder/file.html"

scp /home/user.name/file.html [email protected]:"'/C:/Users/user.name/test\\ folder/file.html'"

scp /home/user.name/file.html [email protected]:"/C:/Users/user.name/test\\\ folder/file.html"

scp /home/user.name/file.html [email protected]:"'/C:/Users/user.name/test\\\ folder/file.html'"

Как мне это сделать?

решение1

  • Попробуйте использоватьquotes 'илиDouble quotes "вокруг полного аргумента.

    Как предложил @dirkt в комментариях, цитирование полного аргумента пути для хоста ssh должно сработать. Это делает вашу команду такой:

    scp /home/user.name/file.html '[email protected]:/C:/Users/user.name/test folder/'
    
  • Использоватьescape sequence for spaceмежду именем папки.

    Вы можете использовать \(обратный слеш с пробелом), который является escape-последовательностью для пробела. Это делает вашу команду такой:

    scp /home/user.name/file.html '[email protected]:/C:/Users/user.name/test\ folder/'
    

    Обратите внимание на \пробел между test& folder, который делает егоtest\ folder.

  • Может быть, это тот случай, когда выneed to escape twiceкак он экранируется сначала локально, а затем на удаленном конце. В этом случае вы можете написать так:

    1. "'complete argument'"внутри кавычек внутри двойных кавычек, например:

      "'[email protected]:/C:/Users/user.name/test folder/'"
      

      ИЛИ

    2. Экранируйте пробелы и процитируйте полный аргумент следующим образом:

      '[email protected]:/C:/Users/user.name/test\ folder/'
      

      ИЛИ

    3. Побег дважды напрямую, используя последовательность выхода, как эта

      [email protected]:/C:/Users/user.name/test\\ folder/
      

Не стесняйтесь добавлять больше подробностей.

решение2

Пробовал все вышеперечисленные варианты для scp с клиента CentOS на Windows 7 (SP1), но безуспешно.

А вот это мне помогло:

$ scp /tmp/lala 'win7@<IP>:"/Users/win7/Documents/TestComplete 14 Projects"'

решение3

Не знаю, актуально ли это еще, но одно из решений (которое может иметь неприятные последствия в некоторых ситуациях) — использовать «?» вместо пробела:

scp "user@ip:/home/user/file?with?spaces.txt" .

решение4

The"символ интерпретируется самим bash. Bash декапсулирует все, что находится между interbretes, если может, и просто представляет вывод вызываемой команде как строку, которая может содержать некоторые специальные символы. Попробуйте использовать апостроф (') символ для него заставляет bash вообще не смотреть на строку и просто передать ее команде, которая была вызвана первой. Эти строки с'должно быть отформатировано следующим образом: Если вы хотите увидеть

не

echo $'dont\'t'

Связанный контент