Проблема в безопасном копировании (scp) имен файлов с пробелами


9

Я пытаюсь скопировать файлы, используя безопасное копирование (scp). Я пытаюсь выполнить следующую команду, но я получаю сообщение об ошибке из-за пробела в абсолютном пути расположения каталога.

scp -r -P 8484 root@172.31.72.103:/media/New Volume/lj /home/pratheep

Я получаю следующую ошибку:

scp: /media/New: No such file or directory  
scp: Volume/lj: No such file or directory

Я попытался использовать ту же команду, добавив дополнительный слеш, как

scp -r -P 8484 root@172.31.72.103:/media/New\ Volume/lj /home/pratheep

но я все еще получаю ту же ошибку.

Может кто-нибудь сказать мне, как это исправить?

Ответы:


18

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

scp -r -P 8484 root@172.31.72.103:"'/media/New Volume/lj'" /home/pratheep
scp -r -P 8484 root@172.31.72.103:'"/media/New Volume/lj"' /home/pratheep

или с помощью вкладки завершения

scp -r -P 8484 root@172.31.72.103:/media/New\\\ Volume/lj /home/pratheep

3
Полезно отметить, что scpиспользуется в sshкачестве своего транспорта, который объясняет, почему происходит два прохода интерпретации оболочки.
мсв

1

scpи rsyncпередать имена удаленных файлов в удаленную оболочку. Это позволяет вам передавать шаблоны, как в

scp remotehost:'*.txt' .

но это имеет неприятное следствие, что вам нужно дополнительное цитирование при указании имени удаленного файла.

Вы можете передать -sопцию, чтобы rsyncона защищала имена файлов от расширения удаленной оболочкой. Но это включает встроенное расширение rsync, поэтому вам все равно нужно заключать в кавычки \[?*.

Обходной путь - передать архив:

ssh -P 8484 root@172.31.72.103 'cd "/media/New Volume" && tar cf - lj' |
tar xf - -C /home/pratheep

Другой способ - смонтировать удаленную файловую систему, а затем использовать обычные инструменты для выполнения копирования.

mkdir mnt
sshfs -p 8484 root@172.31.72.103:/ mnt
cp -Rp 'mnt/media/New Volume/lj' /home/pratheep
fusermount -u mnt
rmdir mnt
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.