Как заставить scp копировать скрытые файлы?

63

Я часто использую SCP, чтобы копировать файлы - особенно связанные с сетью файлы. Проблема в том, что всякий раз, когда я делаю это, я не могу получить команду на копирование скрытых файлов (например, .htaccess).

Я обычно призываю это:

scp -rp src/ user@server:dest/

Это не копирует скрытые файлы. Я не хочу , чтобы ссылаться на этот раз (делать что - то подобное scp -rp src/.* ...- и это имеет странное .и ..последствия в любом случае.

На scpстранице руководства я ничего не видел о «включении скрытых файлов».

Как я могу сделать это?

Рашер
источник
Я предполагаю, что src/.*также копии src/..(родительский каталог), верно?
Кен Шарп

Ответы:

67

Это должно абсолютно соответствовать скрытым файлам. / В конце источника говорит "каждый файл в этом каталоге". Тем не менее, тестирование и исследования подтверждают ваше мнение. Это глупое поведение.

« Ответ » заключается в добавлении точки в конец источника:

scp -rp src/. user@server:dest/

Реальный ответ заключается в использовании Rsync.

Мэтт Симмонс
источник
Приятный трюк я еще не осознал.
Cstamas
21
rsync -avz -e ssh --progress src / user @ server: dest /
MikeyB
2
Я не могу воспроизвести это поведение. scp -r source/ host:source2копирует точечные файлы. Работает в OpenSSH 5.1 с 2007 года.
Микель
3
Обратите внимание, что добавление .в конце больше не работает (2019) из-за проблем безопасности. Это объясняется здесь: superuser.com/questions/1403473/scp-error-unexpected-filename
Стефан
25

Вы можете попробовать rsync. Это лучше подходит для этой работы:

rsync -av src / user @ server: dest /

(И его руководство стоит прочитать.)

cstamas
источник
2
Я всегда использую опцию --progress для rsync, я не могу жить без нее = D
Hofa
1
@Hof Я обычно использую -P, потому что он короче, уже включает --progress, а также включает --partial, который может иметь смысл, если я уже заинтересован в его прогрессе ;-)
cstamas
9

Не ставьте косую черту после исходного каталога. Ваш код будет выглядеть так:

scp -rp src user@server:dest/

Это создаст каталог 'src' в папке 'dest' на удаленной машине со всеми включенными скрытыми файлами. Это, вероятно, не совсем то, что вы хотите, но он скопирует скрытые файлы в src.

kbyrd
источник
3

Следующее решит проблему, это было полностью проверено в нашей среде непрерывной интеграции

scp -rp src/. user@server:dest/
example scp -rp /usr/src/code/. content001@172.11.11.11:/usr/dest/code/

Надеюсь, это поможет

stevensagaar
источник
После недавнего обновления scp это приводит к scp: error: unexpected filename: . . Обязательно проверьте, работает ли он с вашим дистрибутивом, приятель Гуглер :)
Мориц Фридрих
1

Чтобы скопировать только скрытые файлы, используйте эту команду

scp -rp /path_to_copy_hidden/.[!.]* user@host:/path_to_paste/

Актуальная игра - это /.[!.]*тег, который ссылается на файлы, начинающиеся с .(скрытые)

Шахзаиб Хаят Хан
источник
0

Ни одно из вышеперечисленных scp-решений не помогло мне. Однако я обнаружил, что на cygwin работает следующее: scp -r directory / * host: directory '*' соответствует всем видимым файлам и пропускает невидимое.

Рэй Кот
источник
0

Если логин с паролем отключен на удаленном компьютере, и единственный способ войти - через открытый ключ, то вы можете использовать это:

$ rsync -av -s 'ssh -i /path/to/your/private/SSH/key' --progress user1@remote.host:/remote/source/directory/ /local/destination/directory/

Он также копирует скрытые файлы.

Также обратите внимание, что «user1» должен иметь права на чтение этих файлов, например, вы не можете копировать ssh-папки другого пользователя с помощью этого метода.

Гергели Лукачи
источник
0

Так как scpподдерживает регулярные выражения, это будет хорошо для вас:

scp -rp src/(*|.*) user@server:dest/

donmutti
источник
0

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

Из - за уязвимости CVE-2018-20685, то /.трюк не может быть больше не используется с scp. Однако распределенный контроль версий, как gitили Hg Mecurial, будет обрабатывать скрытые файлы, как и любые другие файлы. Вот команды для моего любимого 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 "first commit"
client:$ cd
client:$ hg clone src ssh://user@server/dest/

Последующие изменения необходимо будет зафиксировать снова, client:$ hg com -m "commit message"а затем отправить с помощью client:$ hg pushкоманды. Узнайте больше о внесении изменений из этого листа Hg Mercurial .

Серж Строобандт
источник