Я хочу использовать scp
для загрузки файлов, но иногда целевой каталог может не существовать.
Можно ли создать папку автоматически? Если так, то как? Если нет, какой альтернативный способ я могу попробовать?
Я хочу использовать 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
в него. Странный. В любом случае, вы совершенно правы, и основной сценарий работает, я откажусь от своего отрицательного мнения.
Если вы копируете группу файлов, не совсем. Если вы копируете каталог и все содержимое под ним, да. Учитывая эту команду:
$ scp -pr /source/directory user@host:the/target/directory
Если directory
не существует в ~/the/target
on 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, добавив еще один фильтр включения в середине, если имя целевого файла совпадает.