Как сделать так, чтобы scp копировал скрытые файлы?

Вопрос или проблема

Я часто использую 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

  1. Следующая команда рекурсивно копирует все содержимое текущего каталога, но исключает скрытые файлы, находящиеся непосредственно в текущем каталоге.

    current_dir$ scp -r ${pwd}/* user@server:dest/
    
  2. Следующая команда копирует все скрытые файлы, которые находятся непосредственно в текущем каталоге, но не внутри каких-либо его подпапок.

    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

https://superuser.com/a/1682929/478378

https://serverfault.com/a/1163655/98910

Распределенный контроль версий обрабатывает скрытые файлы

Из-за уязвимости 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, учитывайте предложенные методы для корректного копирования скрытых файлов.

Оцените материал
Добавить комментарий

Капча загружается...