web-dev-qa-db-ja.com

sftpでディレクトリをアップロードしていますか?

Sftpによるディレクトリ(他のディレクトリがいくつかのレベルに深い)のアップロードに問題があります。これをgzip圧縮することで回避できることはわかっていますが、なぜそれが必要なのかわかりません。

とにかく、

sftp> put bin/
Uploading bin/ to /home/earlz/blah/bin
bin/ is not a regular file
sftp> put -r bin/
Uploading bin/ to /home/earlz/blah/bin
Couldn't canonicalise: No such file or directory
Unable to canonicalise path "/home/earlz/blah/bin"

最後のエラーメッセージは完全に愚かだと思います。それで、ディレクトリは存在しませんか?ディレクトリを作成しませんか?

とにかく、この問題の周りにsftpがありますか、それともscpを使用するだけですか?

97
Earlz

[〜#〜]修正済み[〜#〜]:OpenSSHがput -rをサポートしていないと最初に誤って主張しました。ありますが、非常に奇妙な方法で行います。移動先のディレクトリは、移動元のディレクトリと同じ名前ですでに存在していると想定されているようです。

sftp> put -r source
 Uploading source/ to /home/myself/source
 Couldn't canonicalize: No such file or directory
 etc.
sftp> mkdir source
sftp> put -r source
 Uploading source/ to /home/myself/source
 Entering source/
 source/file1
 source/file2

特に奇妙なのは、宛先に別の名前を付けた場合にもこれが当てはまることです。

sftp> put -r source dest
 Uploading source/ to /home/myself/dest
 Couldn't canonicalize: ...
sftp> mkdir dest
sftp> put -r source dest
 Uploading source/ to /home/myself/dest/source
 Couldn't canonicalize: ...
sftp> mkdir dest/source
sftp> put -r source dest
 Uploading source/ to /home/myself/dest/source
 Entering source/
 source/file1
 source/file2

よりよく実装された再帰的なputの場合は、代わりにPuTTY psftpコマンドラインツールを使用できます。 Debian(そしておそらくUbuntu)の下のPuTTY-toolsパッケージにあります。

あるいは、GUIを使用したい場合は、Filezillaが希望どおりの動作をします。

68
Jander

なぜsftpがこれを行うのかはわかりませんが、宛先ディレクトリがすでに存在する場合に限り、再帰的なコピーを行うことができます。これを行う...

sftp> mkdir bin
sftp> put -r bin
130
Useful Dude

代わりにrsyncの使用に興味があるかもしれません。そのためのコマンドは

 rsync --delete --rsh=ssh -av bin/ remote-ip-or-fqdn:/home/earlz/blah/bin/

これにより、bin/のすべてがコピーされ、/home/earlz/blah/bin/のリモートサーバーに配置されます。追加の利点として、最初にリモート側のファイルが変更されていないかどうかを確認し、変更されていない場合は再送信しません。さらに、-zオプションを追加すると、圧縮されます。

22
Shawn J. Goff

lcd:ローカルフォルダ(サブフォルダあり)

cd:リモートフォルダー

put -r .

9
eliseu

圧縮せずにタールを含めて、やや複雑な答えを提案できますか?

さあ行こう:

tar -cf - ./bin | ssh target.org " ( cd /home/earlz/blah ; tar -xf - ) "

これにより、ディレクトリ./binがtar(-cf:= create file)、ファイル名-(none、stdout)でパックされ、ssh-commandを介してtarget.org(IPの場合もある)にパイプされる引用符で囲まれて実行されます。つまり、cd to blah、およびtar -xf(抽出ファイル)-なし、名前なし、stdinのみです。

それはまるで自宅でパッケージを梱包し、それをポストに持ってきて、それからあなたがパッケージを期待し、それを開けるところまで運転するようなものです。

おそらく、sftpを使用するだけのはるかにエレガントなソリューションがあるでしょう。

8
user unknown

yafc を使用できます(まだFTP/SFTPクライアントです)。 -rオプションはそこでうまく機能します。

2
Dmitry Shpakov

rsyncを使用できます。これは、特にマシンAからマシンBにコピーを更新する場合、scpおよびsftpの非常に強力な代替手段です。 t変更されていないファイルをコピーします。また、マシンAから削除されたファイルをマシンBから削除することもできます(もちろん指示された場合のみ)。

例えば ​​:

rsync -zrp /home/a/ [email protected]:/home/b/  

-rオプションはファイルを再帰的にコピーするためのもので、-zは転送中に圧縮を有効にし、-pはコピー時にファイルのアクセス許可(ファイルの作成、編集など)を保持します。さらに多くのオプションが可能です。いつものように、manページを読んでください。
カロロスによる元の回答

1
Sherlock

Sshでリモートサーバーにログインし、sftpを使用してボックスに接続してから、get -rコマンドを使用して、ディレクトリをリモートサーバーに転送します。 getコマンドを使用すると、ディレクトリをすでに作成していなくても、ディレクトリを再帰的に転送できます。

ssh remote ip
sftp local ip 
get -r whichever-dir
0
Cyb3rT00th

SFTPケース:

その構造を私のftpにコピーする必要がありました。

mainfolder --- folder --- subfolder
                  |           |
              file1.txt   file2.txt

それは私の問題を解決しました:

cd ./mainfolder
mkdir folder
put -r /from/source/folder/* /mainfolder/folder/
cd ./folder
mkdir subfolder
put -r /from/source/folder/subfolder/* /mainfolder/folder/subfolder/
0

Arch Linux Wiki から、sshfsを使用してsftp-shareをマウントすることが可能であることを知りました。 chrootとjailを備えたsftp-server を実行しており、sshfsは非常にうまく機能します。

  1. マウント:sshfs <sftpuser>@<server>:<read/writable/directory> <your/local/mount/directory>
  2. アンマウント:fusermount -u <your/local/mount/directory>
0
saltani