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


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

scp /home/user.name/file.html user.name@local.ip.num:/C:/Users/user.name/test_folder/file.html

scp /home/user.name/file.html user.name@local.ip.num:"/C:/Users/user.name/test_folder/file.html"

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

Все следующие ошибки с сообщением scp: ambiguous target

scp /home/user.name/file.html user.name@local.ip.num:"/C:/Users/user.name/test folder/file.html"

scp /home/user.name/file.html user.name@local.ip.num:"/C:/Users/user.name/test\ folder/file.html"

scp /home/user.name/file.html user.name@local.ip.num:"'/C:/Users/user.name/test\ folder/file.html'"

scp /home/user.name/file.html user.name@local.ip.num:"/C:/Users/user.name/test\\ folder/file.html"

scp /home/user.name/file.html user.name@local.ip.num:"'/C:/Users/user.name/test\\ folder/file.html'"

scp /home/user.name/file.html user.name@local.ip.num:"/C:/Users/user.name/test\\\ folder/file.html"

scp /home/user.name/file.html user.name@local.ip.num:"'/C:/Users/user.name/test\\\ folder/file.html'"

Как мне заставить это работать?


1
2018-04-04 15:12


Источник


Первое, что я попробую, - процитировать полный аргумент (потому что это единственный аргумент): scp /home/user.name/file.html 'user.name@local.ip.num:/C:/Users/user.name/test folder/', Если это не сработает, следующая вещь - прочитать scp исходный код, чтобы узнать, как он анализирует этот аргумент. - dirkt
Отлично! - Clay


Ответы:


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

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

    scp /home/user.name/file.html 'user.name@local.ip.num:/C:/Users/user.name/test folder/'
    
  • использование escape sequence for space между именем папки.

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

    scp /home/user.name/file.html 'user.name@local.ip.num:/C:/Users/user.name/test\ folder/'
    

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

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

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

      "'user.name@local.ip.num:/C:/Users/user.name/test folder/'"
      

      ИЛИ

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

      'user.name@local.ip.num:/C:/Users/user.name/test\ folder/'
      

      ИЛИ

    3. Выйдите дважды, используя escape-последовательность, как это

      user.name@local.ip.num:/C:/Users/user.name/test\\ folder/
      

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


2
2018-04-04 19:10



Первый ответ работал как шарм. Благодаря! - Clay


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

не

echo $'dont\'t'

0
2018-04-04 17:53