Чи може scp створити каталог, якщо він не існує?


88

Я хочу використовувати scpдля завантаження файлів, але іноді цільовий каталог може не існувати.

Чи можливо створити папку автоматично? Якщо так, то як? Якщо ні, то який альтернативний спосіб я можу спробувати?

Відповіді:


71

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


Виноски :

  1. До rsync2.6.0 (1 січня 2004 р.) Він вимагав від -e sshпрапора так, щоб він поводився таким чином, scpтому що він був дефолт до застарілого протоколу RSH .

  2. scpі rsyncподілитися деякими прапорами, але є лише трохи перекриття.

  3. Використовуючи SSHяк протокол передачі, rsyncвикористовує ті самі за замовчуванням. Отже, так само scp, як передбачається, на віддаленій машині за замовчуванням є користувач з тим самим іменем, що і ваш місцевий користувач.


Я використовую Mac OSX, чи потрібно мені встановлювати rsync як на локальній, так і на віддаленій стороні?
AGamePlayer

шукали rsyncна сторінці документації, не знайшли, як використовувати ключ ssh для входу. Я не хочу використовувати ім'я користувача / пароль для входу в систему
AGamePlayer

@AwQiruiGuo: Mac OS X поставляється із rsync. І так, вам це теж потрібно rsyncна віддаленій стороні, як і з scp. Що стосується SSH-ключів, rsyncто насправді використовується SSH під типом за замовчуванням -e ssh, тому якщо у вас є ключі, створені для використання scp, вони також працюватимуть rsync.
Warren Young

1
@WarrenYoung -rне має значення. Описаний вами сценарій працює лише в тому випадку, якщо ви копіюєте каталог і якщо існує цільовий батьківський каталог. Отже, rsync foo/ u@h:~/створимо цільовий каталог, fooале rsync foo/ u@h:~/bar/не створите цільовий каталог bar. Цей буде створений bar/fooлише за bar/наявності. У будь-якому випадку ОП завантажує файли і навіть у тих випадках, коли це працює, працює лише для цілих каталогів.
тердон

1
Так, я теж грав із цим. Схоже, що вказівка ​​імені файлу також робить його помилковим. Так rsync file host:/foo/fileне вдається, якщо її foo/немає, але rsync file host:/foo/створює каталог і розміщує fileв ньому. Дивно. У будь-якому випадку, ви абсолютно праві, і основний сценарій працює, я відступлю свою заяву.
тердон

35

Якщо ви копіюєте групу файлів, насправді. Якщо ви копіюєте каталог та весь вміст під ним, так. З огляду на цю команду:

$ scp -pr /source/directory user@host:the/target/directory

Якщо directoryне існує ~/the/targetна host, він буде створений. Якщо ж ~the/targetцього не існує, у вас, швидше за все, будуть проблеми - я не пам’ятаю точних результатів цієї справи, але будьте готові до того, що намірилися scpне вдатися.


1
scp: /home/madmike/test_bin: No such file or directoryЯк тільки цільовий каталог відсутній, це перерветься в моїй установці. Використання cygwin на клієнті та RHEL 6.9 на сервері. Яка ваша установка?
MadMike

16

Наскільки я знаю, 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прапор не допоможе створити цільовий каталог, якщо ви копіюєте окремі файли.


3

Так, ти можеш. Відповідно до чоловічої сторінки scp:

людина scp

.....

-r Рекурсивно копіювати цілі каталоги. Зауважте, що scp слідує за символічними посиланнями, які зустрічаються в обході дерева.

….


7
Це не створить цільовий батьківський каталог. Він може скопіювати каталог у існуюче місце. Отже, scp -r foo/ u@h:~/barстворимо, bar/fooякщо пульт bar/існує, але не вдасться, якщо він не буде.
тердон

1
Це не вийде з ладу. Він скопіює fooвміст у новий каталог /bar. Звичайно, назва була змінена, що може бути не тим, чого хоче ОП. Якщо ви хочете, це нова структура дерева, створена в машині призначення, тоді scpне буде виконувати цю роботу, якщо ви хочете скопіювати структуру дерева з певної гілки в дереві, тоді ця структура буде створена.
YoMismo

6
Так, але це працює лише в тому випадку, якщо ви копіюєте каталоги , а не файли. scp -r file host:~/bar/не створить bar/.
тердон

3

Перед передачею 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


Я роблю майже те саме, але мені доведеться вводити пароль вручну (з міркувань безпеки), тому я закінчую його введенням щонайменше двічі ...
Стефан Рейх

0

Ви можете зв'язати команду командою mkdir, а потім посилатися на створену вами папку:

mkdir ~/new-folder/ && scp -P 22 <remote/url>:~/new-folder/

3
(1) У запитанні написано "автоматично". Схоже, це не автоматично. (2) Це, мабуть, є лише тривіальною варіацією відповіді тердона .
G-Man

0

Якщо обмежуються лише 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, додавши ще один фільтр включення в середині, якщо ім'я цільового файлу однакове.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.