Как создать каталог на удаленном хосте, если он не существует без ssh-в? - PullRequest
52 голосов
/ 27 августа 2009

Я не уверен, возможно ли это или нет. По сути, я пишу скрипт, который позволяет мне scp файл на мой хостинг. Это так далеко. Аргумент 1 - это файл, а аргумент 2 - это папка, в которую я хочу поместить ее на удаленном сервере:

function upload {
    scp $1 myusername@ssh.myhost.net:$2
}

Как вы, возможно, не знаете, если каталог, который я указываю при вызове функции, не существует, передача завершается неудачно. Есть ли способ проверить, существует ли каталог в функции, и если нет, создайте его.

Я бы предпочел не использовать ssh каждый раз и создавать каталог, но если у меня нет выбора, у меня нет выбора.

Ответы [ 5 ]

32 голосов
/ 27 августа 2009

Вы можете использовать rsync.

Например,

rsync -ave ssh fileToCopy ssh.myhost.net:/some/nonExisting/dirToCopyTO

Примечание о rsync:

rsync - это служебное программное обеспечение и сетевой протокол для Unix, который синхронизирует файлы и каталоги из одного места в другое, минимизируя при этом передачу данных, используя при необходимости дельта-кодирование, используя алгоритм rsync, который работает быстрее, чем другие инструменты.

24 голосов
/ 27 августа 2009

Я предполагаю, что вы имеете в виду, что вы не хотите интерактивно входить в систему и создавать каталоги вручную, вместо того, чтобы вообще избегать использования ssh, поскольку вам все еще нужен пароль или открытый ключ с scp.

Если использование ssh неинтерактивно приемлемо, то вы можете транслировать файл, используя cat over ssh:

cat $1 | ssh $2 "mkdir $3;cat >> $3/$1"

, где

$1 = filename 
$2 = user@server
$3 = dir_on_server

Если каталог уже существует, mkdir жалуется, но файл все еще копируется. Существующий каталог не будет перезаписан. Если каталог не существует, mkdir создаст его.

19 голосов
/ 27 августа 2009

Если вы выполните рекурсивный scp (-r), он также скопирует каталоги. Поэтому, если вы создадите каталог с желаемым именем на удаленном хосте локально, скопируете в него файл и затем рекурсивно скопируете, каталог будет создан с файлом в нем.

Довольно неловко, но это сделало бы работу.

13 голосов
/ 24 июля 2013

Это двухэтапный процесс

ssh myusername@ssh.myhost.net "mkdir -p $2"

Это обеспечивает создание структуры каталогов. Затем вы копируете

scp $1 myusername@ssh.myhost.net:$2
6 голосов
/ 08 июля 2011

Как насчет, например,
ssh remote_user@remote.host '[ -d /tmp/nonexist/dir ] || mkdir -p /tmp/nonexist/dir ]'; scp test.txt remote_user@remote.host:/tmp/nonexist/dir

...