Как скопировать файлы с помощью scp с удаленного хоста, когда в файле есть пробелы

Строка выполняет:

. ./meteorapp

, что не эквивалентно ] cp текущий каталог (. ).

Здесь . ( source ) - это встроенная оболочка, которая используется для запуска команд из файла (ов) (а именно его аргумента (ов)) в текущем сеансе оболочки.

В вашем случае файл meteorapp из текущего каталога ( ./ ) является источником -ed.

2
17.05.2017, 11:08
2 ответа

SSH вызывает оболочку на сервере (, это невозможно обойти ). Scp вызывает эту оболочку и сообщает ей имена файлов, которые необходимо записать. Способ, которым разработан scp, заключается в интерполяции всего, что вы передаете в качестве имени файла, непосредственно в команду удаленной оболочки. Это означает, что если у вас есть какие-либо специальные символы оболочки в именах файлов, которые для типичных оболочек Unix означают пробелы и!"#$&'()*-;<=>?@[\]^`{|}~(некоторые из них зависят от оболочки и позиции в имени ), вам нужно заключить их в двойные кавычки :один раз для локальной оболочки и один раз для удаленной оболочки.

Это имеет свои преимущества, в частности позволяет указывать подстановочные знаки. Это также то, что позволяет вам использовать ~для удаленного домашнего каталога (, но имена файлов относятся к удаленному домашнему каталогу, поэтому вы можете просто использовать kuba@192.168.100.8:download/…вместоkuba@192.168.100.8:~/download/…). Но недостатком является то, что вам нужно быть осторожным, когда имена файлов содержат специальные символы. Вам также необходимо соблюдать осторожность, если вы хотите отфильтровать разрешенные имена файлов на сервере (, особенно для учетной записи с ограниченным доступом, которая не имеет привилегий командной оболочки ).

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

scp 'kuba@192.168.100.8:download/file\ that\ have\ spaces.txt' ~/download/

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

scp kuba@192.168.100.8:download/file\\\ that\\\ have\\\ spaces.txt ~/download/

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

mkdir remote
sshfs kuba@192.168.100.8: remote
cp remote/download/file\ that\ have\ spaces.txt ~/download/
fusermount -u remote
rmdir remote
4
27.01.2020, 21:53

Решение состоит в использовании как кавычек, так и экранированного пробела:

scp "kuba@192.168.100.8:~/download/file\ that\ have\ spaces.txt" ~/download/
2
27.01.2020, 21:53

Теги

Похожие вопросы