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


97

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を使用する必要がありますか?

回答:


68

修正済み: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

より適切に実装されたrecursiveのput場合は、psftp代わりにPuTTY コマンドラインツールを使用できます。これはputty-toolsDebian(および最も可能性の高いUbuntu)の下のパッケージにあります。

あるいは、GUIを使用したい場合、Filezillaは必要なことを行います。


FYI:sftpことができますput -rから、OpenSSHの5.4
ティノ

3
ありがとう-私は私の答えを訂正しました。それは時間についてですよね?;-P
ジャンダー

128

sftpがこれを行う理由はわかりませんが、宛先ディレクトリがすでに存在する場合にのみ再帰コピーが可能です。だからこれを...

sftp> mkdir bin
sftp> put -r bin

1
-rOpenSSH 5.4以降が必要
Tino

22

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

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

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


すごい!とても簡単!
アスケン

3
これsftpはコマンドとプロトコルであることに注意してください。 -protocolをrsyncサポートしていませんsftp
ティノ

9

lcd:ローカルフォルダー(サブフォルダーを含む)

cd:リモートフォルダー

put -r .


実際には、これが最も正しい答えだと思います...フォルダ全体をそこに置くために
-nopole

ローカルの親フォルダーにcd'dして、名前でディレクトリを配置しようとすると、sftpが文句を言いました。しかしcd、私はアップロードしたいディレクトリにそれをやった。ありがとうございました!
カリムコルン16

8

zip圧縮せずに、tarを含めていくぶん複雑な答えを提案してもいいですか

さあ:

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

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

それはまるで自宅で荷物を梱包し、それをポストに持って来て、仕事に出かけるときのようです。

たぶんsftpを使用するはるかにエレガントなソリューションがあるかもしれません。


パイプtarは非常に優れたソリューションですが、これにはsshログインサポートが必要sftpです(上に別のプロトコルがありますssh)。 tar、他とは異なり、デフォルトでは、再帰的に実行され、すべての特殊ファイル(FIFO、ブロック/キャラクターデバイスなど)を転送し、UID / GIDマッピングをソースからターゲットシステムに変換しようとし、従来の短いコマンドラインがあります。(ただし、1つの例外:「Unixドメインソケット」は転送されません。しかし、誰が必要ですか?)
Tino

ノード間で圧縮が必要なときにこの方法を使用します。また、このpvツールを使用して長時間の転送の速度を監視できます
フェリペアルカシバル


1

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

例えば ​​:

rsync -zrp /home/a/ user@remote.host.com:/home/b/  

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


0

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

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

0

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>
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.