Вопрос или проблема
Я часто использую SCP для копирования файлов, особенно связанных с вебом. Проблема в том, что каждый раз, когда я это делаю, я не могу заставить команду копировать скрытые файлы (например, .htaccess).
Обычно я вызываю следующую команду:
scp -rp src/ user@server:dest/
Это не копирует скрытые файлы. Я не хочу снова вызывать это (например, делая что-то вроде scp -rp src/.* ...
, и у этого есть странные последствия с .
и ..
в любом случае).
Я не нашел ничего в мануале scp
о “включении скрытых файлов”.
Как я могу это сделать?
Это определенно должно соответствовать скрытым файлам. Слеш в конце источника говорит “каждый файл в этом каталоге”. Тем не менее, тестирование и исследования подтверждают это. Это глупое поведение.
Ответ заключается в том, чтобы добавить точку в конце источника:
scp -rp src/. user@server:dest/
Настоящий ответ — использовать rsync.
Вы можете попробовать rsync. Он лучше подходит для этой задачи:
rsync -av src/ user@server:dest/
(И его мануал стоит прочитать.)
Не ставьте слеш после каталога источника. Ваша команда будет выглядеть так:
scp -rp src user@server:dest/
Это создаст каталог ‘src’ в ‘dest’ на удаленной машине, включая все скрытые файлы. Возможно, это не совсем то, что вам нужно, но это скопирует скрытые файлы из src.
Чтобы скопировать только скрытые файлы, используйте эту команду:
scp -rp /path_to_copy_hidden/.[!.]* user@host:/path_to_paste/
Фактический трюк заключается в теге /.[!.]*
, который относится к файлам, начинающимся с .
(скрытым).
Следующее решение должно решить проблему, это было полностью протестировано в нашей среде непрерывной интеграции:
scp -rp src/ user@server:dest/
пример: scp -rp /usr/src/code/ [email protected]:/usr/dest/code/
Надеюсь, это поможет.
Поскольку scp
поддерживает регулярные выражения, это прекрасно подойдет для вас:
scp -rp src/(*|.*) user@server:dest/
Вы можете использовать “shopt -s dotglob
“, чтобы включить скрытые файлы, и использовать “shopt -u dotglob
“, чтобы отключить это снова:
# Включите опцию dotglob для включения скрытых файлов
shopt -s dotglob
# Копировать файлы на сервер
scp -rp src/ user@server:dest/
# Сбросьте опцию dotglob
shopt -u dotglob
Таким образом, вы сохраняете те же инструменты и уменьшаете изменения. 🤷♂️
Ни одно из вышеупомянутых решений scp не сработало для меня. Однако я обнаружил, что следующее сработало на cygwin:
scp -r directory/* host:directory
Звездочка ‘*’ совпадает со всеми видимыми файлами и пропускает невидимые.
Если вход с паролем отключен на удаленной машине, и единственный способ входа — через публичный ключ, то вы можете использовать следующее:
$ rsync -av -s 'ssh -i /path/to/your/private/SSH/key' --progress [email protected]:/remote/source/directory/ /local/destination/directory/
Это также копирует скрытые файлы.
Также имейте в виду, что “user1” должен иметь разрешения на чтение этих файлов, например, нельзя копировать папки ssh других пользователей таким образом.
Решение-1
-
Следующая команда рекурсивно копирует все содержимое текущего каталога, но исключает скрытые файлы, находящиеся непосредственно в текущем каталоге.
current_dir$ scp -r ${pwd}/* user@server:dest/
-
Следующая команда копирует все скрытые файлы, которые находятся непосредственно в текущем каталоге, но не внутри каких-либо его подпапок.
current_dir$ scp -r ${pwd}/.[!.]* user@server:dest/
Решение-2
# Включите опцию dotglob для включения скрытых файлов
current_dir$ shopt -s dotglob
# Копировать файлы на сервер "и это также должно включать скрытые файлы"
current_dir$ scp -r ${pwd}/* user@server:dest/
# Сбросьте опцию dotglob
current_dir$ shopt -u dotglob
Ссылки:
https://serverfault.com/a/915383/98910
https://superuser.com/questions/1403473/scp-error-unexpected-filename
Распределенный контроль версий обрабатывает скрытые файлы
Из-за уязвимости CVE-2018-20685, трюк с /.
больше не может использоваться с scp
. Однако распределенный контроль версий, такой как git
или Hg Mercurial, будет обрабатывать скрытые файлы так же, как любые другие файлы. Вот команды для моего любимого Hg Mercurial:
server:$ sudo apt install mercurial
client:$ sudo apt install mercurial
client:$ hg init src
client:$ cd src/
client:$ hg addr
client:$ hg com -m "pervый коммит"
client:$ cd
client:$ hg clone src ssh://user@server/dest/
Последующие изменения нужно будет закоммитить снова с помощью client:$ hg com -m "сообщение коммита"
и затем отправить, используя команду client:$ hg push
. Узнайте больше о том, как отправлять изменения из этого шпаргалки по Hg Mercurial.
Ответ или решение
Чтобы скопировать скрытые файлы с помощью SCP, важно знать, что SCP не копирует файлы с точкой (например, .htaccess
) автоматически, если вы используете стандартные команды. Существуют несколько подходов для решения этой проблемы:
1. Копирование с помощью SCP
Чтобы скопировать скрытые файлы, вы можете использовать следующую команду:
scp -rp src/. user@server:dest/
Добавление точки после src/
указывает на все содержимое каталога, включая скрытые файлы.
Если вы хотите скопировать все файлы, включая скрытые, но без создания нового подкаталога на сервере, вы можете использовать:
scp -rp src user@server:dest/
2. Использование rsync
rsync
считается более продвинутым инструментом для синхронизации файлов и каталогов. Он также позволяет удобно передавать скрытые файлы. Пример использования:
rsync -av src/ user@server:dest/
Эта команда рекурсивно копирует весь контент каталога src
, включая скрытые файлы.
Если потребуется передать файлы с использованием определённого SSH-ключа, можно выполнить:
rsync -av -e 'ssh -i /path/to/your/private/key' src/ user@server:dest/
3. Использование shopt
Если вы хотите использовать SCP и при этом скопировать все файлы, включая скрытые, временно измените вашу оболочку:
shopt -s dotglob
scp -rp src/* user@server:dest/
shopt -u dotglob
Эта команда расширит glob (маску), чтобы также учитывать скрытые файлы.
4. Ручное копирование скрытых файлов
Если вам нужно скопировать только скрытые файлы, можно воспользоваться следующей командой:
scp -rp src/.[!.]* user@server:dest/
Здесь .[!.]*
выбирает все скрытые файлы и каталоги, начиная с точки, исключая .
и ..
.
Заключение
Как видно, у SCP есть свои ограничения при работе с скрытыми файлами. Использование rsync
является предпочтительным вариантом из-за его мощных возможностей и гибкости. Если вы все же предпочитаете SCP, учитывайте предложенные методы для корректного копирования скрытых файлов.