2009-08-27 1 views
51

これが可能かどうかわかりません。基本的に、私はscp私のホストにファイルを許可するスクリプトを書いています。これまでのところそれです。引数1はファイルであり、引数2は、私はそれがリモートサーバー上に置くことにしたいフォルダです:あなたは/知らないかもしれないこととして、私は「関数はdoesnの呼び出し時にリモートホスト上にディレクトリを作成するにはどうしたらいいですか?

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

は、私が指定したディレクトリ場合存在しない場合、転送は失敗します。ディレクトリが関数内に存在するかどうかを確認する方法はありますか?存在しない場合は作成してください。

私はいつもsshを使ってディレクトリを作成する必要はありませんが、選択肢がなければ選択肢はありません。

答えて

31

rsyncを使用できます。例えば

、rsyncの約

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

rsyncは場合デルタ符号化を用いてデータ転送を最小にしながら、一つの場所から別のファイルやディレクトリを同期Unix用ユーティリティソフトウェアとネットワークプロトコルであります他のツールより速いrsyncアルゴリズムを使用して適切な

+3

これは私のためには機能しません(あて先のディレクトリが存在しないと不平を言うだけです) - 最近のバージョンのrsyncが必要ですか?しかし 'rsync -R'は、ローカルファイルが適切な名前のディレクトリにある場合、例えば' rsync -R'を使用して目的の効果を達成することができます: 'rsync -Rave ssh some/nonExisting/dirToCopyTo/fileToCopy ssh.myhost.net:/' –

+1

@MartinKleppmann私は、これを使用していないディレクトリについて不平を言ってエラーを出すだけです。あなたは実際にこの作業を目撃しましたか?もしそうなら、私はrsyncプログラムについて何が違うのかを理解することに興味があります。 – DougW

+2

ああ、コピーするディレクトリのレベルを1つだけ作成する必要がある場合は、このように動作します。私は/ var/www/myapp/test /に展開しようとしました。サーバが/ var/www /を持っていただけで、失敗しました。/var/www/myapp /を作成すると、テストフォルダが作成され、すべてがコピーされました。ディレクトリ構造のレベルを複数作成する必要がある場合は、以下の@ire_and_cursesのようなソリューションが必要になります。 – DougW

18

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

いろいろな種類がありますが、それは仕事をするでしょう。

+0

リモートディレクトリが既に存在する(空ではない)場合はどうなりますか? – mouviciel

+0

新しい内容が既存のディレクトリに追加されます。 – bejota

23

scpのパスワードまたは公開鍵が必要なので、sshの使用を避けたいのではなく、対話的にログインして手作業でディレクトリを作成したくないと思います。

非対話のsshを使用することが許容される場合は、あなたがsshcatを使用してファイルをストリーミングすることができます:ディレクトリがすでに存在する場合

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

$1 = filename 
$2 = [email protected] 
$3 = dir_on_server 

は、mkdirが不平を言うが、ファイルそれでもなおコピーされます。 既存のディレクトリは上書きされません。ディレクトリが存在しない場合は、mkdirが作成されます。

+14

'mkdir -p $ 3'は、既存のディレクトリにmkdirが文句を付けるのを避けます。さらに、複数のレベルのディレクトリを作成することができます。 – FabienAndre

6

方法については、例えば、
ssh [email protected] '[ -d /tmp/nonexist/dir ] || mkdir -p /tmp/nonexist/dir ]'; scp test.txt [email protected]:/tmp/nonexist/dir

+0

私は間違いなく 'SSH'とWikipediaによる' 'SSH'プロトコルに基づく' 'scp''を見ています。これはOPが求めていたものではありません。 – Bojangles

+0

sshやscpの使用には何も問題はなく、回避する必要はありません。リモートホスト上に作成されたものを覚えておく必要があるのは、ユーザースクリプトだけです。チェックは何度も繰り返されることはありません。私は実際にこの方法を使って最近ログバックアップスクリプトを書いていました。リモートファイルへのアクセスのために、CIFS、NFS、FTP、rsync(これは実際にsshで実行される)などの方法を提供しない場合、リモートホスト上に新しいフォルダをチェックして新しいフォルダを作成するオプションがあるかどうかを知りたいです。 –

+0

申し訳ありません私は間違った方法リコを見つけた場合、私は、OPのSSHを使用したくないことを言及していたが、私はより慎重に質問を読む必要があります。 scpは問題ありません。 – Bojangles

11

は、これはこれは、ディレクトリ構造が作成されることを保証2段階のプロセス

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

です。次に、コピーします

scp $1 [email protected]:$2 
関連する問題