Я хочу використовувати 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іноді має інші дивні поведінки. По суті, ви просите його розібратися, що ви хотіли скопіювати, і його здогадки можуть не відповідати вашим припущенням. Спробуйте і подивіться. Якщо він не веде себе так, як ви очікували, і ви не можете зрозуміти чому, опублікуйте докладніші відомості про налаштування локальних та віддалених каталогів та дайте команду, яку ви спробували.
Виноски :
До rsync2.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, додавши ще один фільтр включення в середині, якщо ім'я цільового файлу однакове.