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

1643
Clay

Чтобы передать файл из терминала 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
Первое, что я бы попробовал, это процитировать полный аргумент (потому что это единственный аргумент): `scp /home/user.name/file.html 'user.name@local.ip.num: / C: / Users / папка user.name/test / '`. Если это не сработает, тогда нужно прочитать исходный код `scp`, чтобы узнать, как он анализирует этот аргумент. dirkt 6 лет назад 1
Работал отлично! Clay 6 лет назад 0

2 ответа на вопрос

2
C0deDaedalus
  • Попробуйте использовать 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/ 

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

Первый ответ работал как шарм. Спасибо! Clay 6 лет назад 0
0
someoneelse

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

не

echo $'dont\'t'