web-dev-qa-db-ja.com

ssh-ingなしで存在しない場合、リモートホストにディレクトリを作成するにはどうすればよいですか?

これが可能かどうかはわかりません。基本的に、ホスティングにファイルを scp できるスクリプトを書いています。これで終わりです。引数1はファイルで、引数2はリモートサーバーに配置するフォルダーです。

function upload {
    scp $1 [email protected]:$2
}

ご存じかもしれませんが、関数を呼び出すときに指定したディレクトリが存在しない場合、転送は失敗します。関数にディレクトリが存在するかどうかを確認し、存在しない場合は作成する方法はありますか。

毎回sshしてディレクトリを作成する必要はありませんが、選択の余地がない場合は選択の余地がありません。

52
larjudge

Rsyncを使用できます。

例えば、

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

Rsyncに関する注意:

rsyncは、他のツールよりも高速なrsyncアルゴリズムを使用して適切な場合にデルタエンコーディングを使用することにより、データ転送を最小限に抑えながら、ある場所から別の場所にファイルとディレクトリを同期するUnix用のユーティリティソフトウェアおよびネットワークプロトコルです。

32
Peter Mortensen

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が作成します。

24
ire_and_curses

再帰scp(-r)を実行すると、ディレクトリもコピーされます。したがって、リモートホスト上で希望する名前のディレクトリをローカルに作成し、その中にファイルをコピーしてから、再帰的にコピーすると、そのファイルを含むディレクトリが作成されます。

ちょっと厄介ですが、それは仕事をするでしょう。

19
Matthias Wandel

これは2段階のプロセスです

ssh [email protected] "mkdir -p $2"

これにより、ディレクトリ構造が作成されます。次に、コピーします

scp $1 [email protected]:$2
13
Sarang

たとえば、
ssh [email protected] '[ -d /tmp/nonexist/dir ] || mkdir -p /tmp/nonexist/dir ]'; scp test.txt [email protected]:/tmp/nonexist/dir

6
Rico Chen

sshfs派手に!

.ssh/config

Host your-Host
  HostHame example.com
  User name
  IdentitiesOnly yes
  IdentityFile ~/.ssh/private_key

上記以外のローカルセットアップには、targetマウントポイントのみが必要です...

Sudo mkdir /media/your-Host
Sudo chown ${USER}:${USER} /media/your-Host

...その後、スクリプトのマウントやアンマウントなどがはるかに簡単になります。

マウント

sshfs your-Host:within-home/some-dir /media/your-Host

アンマウント

fusermount -u /media/your-Host

サーバーで許可されている場合、このアプローチの最大の利点は、ローカルで実行されているスクリプトがリモートファイルシステムと対話できることです。ということは...

if ! [ -d "/media/your-Host/nowhere" ]; then
  mkdir -vp "/media/your-Host/nowhere"
fi

...そのような実装の魔法を介して実行できる他の多くのトリックの中で可能になります。

0
S0AndS0