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

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

Мне нужно скопировать файл с удаленного хоста в мой локальный каталог с помощью scm, где файл имеет пробелы, для этого я исправил проблему с помощью ssh на этом хосте и scp файла обратно. Но я хочу знать, как скопировать этот файл, например, может быть случай, когда на локальном хосте не установлен sshd.

Я попробовал это:

scp [email protected]:~/download/file\ that\ have\ spaces.txt ~/download/

но получил ошибку:

scp: /home/kuba/Pobrane/file: No such file or directory
scp: that: No such file or directory
scp: have: No such file or directory
scp: spaces.txt: No such file or directory

Я также пробовал file\\ that\\ have\\ spaces.txtиfile%20that%20have%20spaces.txt

решение1

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

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

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

scp '[email protected]:download/file\ that\ have\ spaces.txt' ~/download/

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

scp [email protected]:download/file\\\ that\\\ have\\\ spaces.txt ~/download/

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

mkdir remote
sshfs [email protected]: remote
cp remote/download/file\ that\ have\ spaces.txt ~/download/
fusermount -u remote
rmdir remote

решение2

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

scp "[email protected]:~/download/file\ that\ have\ spaces.txt" ~/download/

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