Я хочу використовувати scp
для завантаження файлів, але іноді цільовий каталог може не існувати.
Чи можливо створити папку автоматично? Якщо так, то як? Якщо ні, то який альтернативний спосіб я можу спробувати?
Я хочу використовувати scp
для завантаження файлів, але іноді цільовий каталог може не існувати.
Чи можливо створити папку автоматично? Якщо так, то як? Якщо ні, то який альтернативний спосіб я можу спробувати?
Відповіді:
Це одна з багатьох речей, які rsync
можна зробити.
Якщо ви використовуєте версію, rsync
випущену за останні кілька років, ¹ його основний синтаксис команд схожий на scp
: ²
$ rsync -r local-dir remote-machine:path
Це скопіює local-source
та його вміст $HOME/path/local-dir
на віддалену машину, створюючи необхідні каталоги.³
rsync
тут є деякі обмеження, які можуть вплинути на те, чи спрацює це у вашій конкретній ситуації. Наприклад, це не створить кілька рівнів відсутніх віддалених каталогів; це створить лише один відсутній рівень на пульті. Ви можете легко обійти це завдання, передуючи rsync
команді щось подібне:
$ ssh remote-host 'mkdir -p foo/bar/qux'
Це створить $HOME/foo/bar/qux
дерево, якщо воно не існує. Він не буде скаржитися або зробити що - небудь ще погано , якщо це дійсно вже існує.
rsync
іноді має інші дивні поведінки. По суті, ви просите його розібратися, що ви хотіли скопіювати, і його здогадки можуть не відповідати вашим припущенням. Спробуйте і подивіться. Якщо він не веде себе так, як ви очікували, і ви не можете зрозуміти чому, опублікуйте докладніші відомості про налаштування локальних та віддалених каталогів та дайте команду, яку ви спробували.
Виноски :
До rsync
2.6.0 (1 січня 2004 р.) Він вимагав від -e ssh
прапора так, щоб він поводився таким чином, scp
тому що він був дефолт до застарілого протоколу RSH .
scp
і rsync
поділитися деякими прапорами, але є лише трохи перекриття.
Використовуючи SSH
як протокол передачі, rsync
використовує ті самі за замовчуванням. Отже, так само scp
, як передбачається, на віддаленій машині за замовчуванням є користувач з тим самим іменем, що і ваш місцевий користувач.
rsync
на сторінці документації, не знайшли, як використовувати ключ ssh для входу. Я не хочу використовувати ім'я користувача / пароль для входу в систему
rsync
. І так, вам це теж потрібно rsync
на віддаленій стороні, як і з scp
. Що стосується SSH-ключів, rsync
то насправді використовується SSH під типом за замовчуванням -e ssh
, тому якщо у вас є ключі, створені для використання scp
, вони також працюватимуть rsync
.
-r
не має значення. Описаний вами сценарій працює лише в тому випадку, якщо ви копіюєте каталог і якщо існує цільовий батьківський каталог. Отже, rsync foo/ u@h:~/
створимо цільовий каталог, foo
але rsync foo/ u@h:~/bar/
не створите цільовий каталог bar
. Цей буде створений bar/foo
лише за bar/
наявності. У будь-якому випадку ОП завантажує файли і навіть у тих випадках, коли це працює, працює лише для цілих каталогів.
rsync file host:/foo/file
не вдається, якщо її foo/
немає, але rsync file host:/foo/
створює каталог і розміщує file
в ньому. Дивно. У будь-якому випадку, ви абсолютно праві, і основний сценарій працює, я відступлю свою заяву.
Якщо ви копіюєте групу файлів, насправді. Якщо ви копіюєте каталог та весь вміст під ним, так. З огляду на цю команду:
$ scp -pr /source/directory user@host:the/target/directory
Якщо directory
не існує ~/the/target
на host
, він буде створений. Якщо ж ~the/target
цього не існує, у вас, швидше за все, будуть проблеми - я не пам’ятаю точних результатів цієї справи, але будьте готові до того, що намірилися scp
не вдатися.
scp: /home/madmike/test_bin: No such file or directory
Як тільки цільовий каталог відсутній, це перерветься в моїй установці. Використання cygwin на клієнті та RHEL 6.9 на сервері. Яка ваша установка?
Наскільки я знаю, scp
сама не може цього зробити. Однак ви можете просто ssh
до цільової машини, створити каталог і потім скопіювати. Щось на зразок:
ssh user@host "mkdir -p /target/path/" &&
scp /path/to/source user@host:/target/path/
Зауважте, що якщо ви копіюєте цілі каталоги, вищезазначене не потрібно. Наприклад, для копіювання каталогу ~/foo
на віддалений хост ви можете використовувати -r
прапор (рекурсивний):
scp ~/foo/ user@host:~/
Це створить цільовий каталог ~/foo
на віддаленому хості. Однак він не може створити батьківський каталог. scp ~/foo user@host:~/bar/foo
не вдасться, якщо не bar
існує цільового каталогу . У будь-якому випадку -r
прапор не допоможе створити цільовий каталог, якщо ви копіюєте окремі файли.
Так, ти можеш. Відповідно до чоловічої сторінки scp:
людина scp
.....
-r Рекурсивно копіювати цілі каталоги. Зауважте, що scp слідує за символічними посиланнями, які зустрічаються в обході дерева.
….
scp -r foo/ u@h:~/bar
створимо, bar/foo
якщо пульт bar/
існує, але не вдасться, якщо він не буде.
foo
вміст у новий каталог /bar
. Звичайно, назва була змінена, що може бути не тим, чого хоче ОП. Якщо ви хочете, це нова структура дерева, створена в машині призначення, тоді scp
не буде виконувати цю роботу, якщо ви хочете скопіювати структуру дерева з певної гілки в дереві, тоді ця структура буде створена.
scp -r file host:~/bar/
не створить bar/
.
Перед передачею btrfs
знімків я використовую таку функцію ssh
:
check_remote_dir() {
printf "\ntesting remote directory: '$1' "
if ssh -p $PORT $ROOT@$REMOTE "[ ! -d $1 ]"; then
printf "\nCreating: $1 on $ROOT@$REMOTE\n"
ssh -p $PORT $ROOT@$REMOTE "mkdir -p $1"
else
printf "[OK]\n"
fi
}
Просто зателефонуйте до функції у своєму сценарії за допомогою:
check_remote_dir /my/remote/path
Ви можете зв'язати команду командою mkdir, а потім посилатися на створену вами папку:
mkdir ~/new-folder/ && scp -P 22 <remote/url>:~/new-folder/
Якщо обмежуються лише scp або sftp без наявного ssh (від rssh), можна створити каталоги, скопіювавши порожнє дерево каталогів з rsync, а потім скопіювавши файли.
Ось так я ставлю публічний ключ ssh до віддаленого хоста, коли ssh-copy-id не працює, а каталог .ssh не існує:
rsync -e 'ssh -p22' -av -f"+ */" -f"- *" ~/.ssh backup@1.2.3.4:~/
scp -P22 ~/.ssh/id_rsa.pub backup@1.2.3.4:~/.ssh/authorized_keys
Можна комбінувати ці команди в одну rsync, додавши ще один фільтр включення в середині, якщо ім'я цільового файлу однакове.