Я хочу использовать scp
для загрузки файлов, но иногда целевой каталог может не существовать.
Можно ли создать папку автоматически? Если так, то как? Если нет, какой альтернативный способ я могу попробовать?
Это одна из многих вещей, которые rsync
можно сделать.
Если вы используете версию, rsync
выпущенную в последние несколько лет, basic основной синтаксис команды похож на 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/
существует. В любом случае, OP загружает файлы и даже в тех случаях, когда это работает, он работает только для целых каталогов.rsync file host:/foo/file
терпит неудачу, еслиfoo/
не существует, ноrsync file host:/foo/
создает каталог и помещаетfile
в него. Странный. В любом случае, вы совершенно правы, и основной сценарий работает, я откажусь от своего отрицательного мнения.Если вы копируете группу файлов, не совсем. Если вы копируете каталог и все содержимое под ним, да. Учитывая эту команду:
Если
directory
не существует в~/the/target
onhost
, он будет создан. Если, однако,~the/target
не существует, у вас, скорее всего, будут проблемы - я не помню точные результаты этого случая, но будьте готовы к тому,scp
что он потерпит неудачу.источник
scp: /home/madmike/test_bin: No such file or directory
Как только целевой каталог отсутствует, это нарушает мои настройки. Использование cygwin на клиенте и RHEL 6.9 на сервере. Каковы ваши настройки?Насколько я знаю,
scp
сам не может этого сделать, нет. Тем не менее, вы можете простоssh
на целевой машине, создать каталог, а затем скопировать. Что-то вроде:Обратите внимание, что если вы копируете целые каталоги, вышеописанное не требуется. Например, чтобы скопировать каталог
~/foo
на удаленный хост, вы можете использовать-r
(рекурсивный) флаг:Это создаст целевой каталог
~/foo
на удаленном хосте. Тем не менее, он не может создать родительский каталог.scp ~/foo user@host:~/bar/foo
потерпит неудачу, если целевой каталог неbar
существует. В любом случае-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 /my/remote/path
источник
Вы можете связать команду с командой mkdir, а затем сослаться на созданную вами папку:
источник
Когда ограничено только scp или sftp без ssh (по rssh), можно создавать каталоги, копируя пустое дерево каталогов с помощью rsync, а затем копируя файлы.
Вот как я помещаю открытый ключ ssh на удаленный хост, когда ssh-copy-id не работает и каталог .ssh не существует:
Можно объединить эти команды в один rsync, добавив еще один фильтр включения в середине, если имя целевого файла совпадает.
источник