FTP経由でrsyncを使用する方法


187

任意のUNIX:

私は正常に動作する次のコマンドラインを持っています。

rsync -avr -e ssh /home/dir user@example.com:/home/

しかし、FTPサーバーのみが存在するリモートサーバーにrsyncするように設定する必要があります。それについてどうすればいいですか?

rsyncのヘルプを見ましたが、すぐに迷子になりました(このようなことはあまりしません)。


21
これは... IRC上でHTTPを使用する方法を尋ねるに似ている、またはどのようにSMTP上でFTPを使用する方法
ジュリアーノ

2
たぶん、あなたはこれをしたいというあなたの推論のいくつかを説明することができました、そして、我々はあなたが実行可能な解決策を思い付くのを手伝うことができます。
ジェームズ

1
本質的には、共有ホスティングサーバーからのバックアップを自動化しようとしていて、rsyncの仕組みを理解していませんでした。私は今vpsに移動し、もうftpの制限はありません
バンパーボックス

二枚舌は、あなたの神である:scie.nti.st/2013/4/13/...
user956584

NodeJSを気にせずに展開する場合は、dployをチェックして、怠zyであり、gitでうまく動作します
フランクノック

回答:


78

あなたはしません。rsyncはあなたのためにそれを行うことはできません、それはそれ自体のプロトコルであり、FTPを介して動作しません。

ただし、csyncを試してみることもできます。IIRCは、HTTPを介したrsyncのような動作を提供します。FTPで機能するかどうかについてはコメントできません。試してみる必要があります。


1
csync Webページを見ると、sftpがサポートされていますが、プレーンftpのサポートについては言及されていません。
キーストンプソン14

162

rsyncは、他の人が述べた理由のためにあなたのために機能しません。ただし、lftpncftpの両方には、おそらくニーズを満たす「ミラー」モードがあります。

私はこれを使用して、ローカルディレクトリからftpまたはsftp Webホストにデータをプッシュします。

lftp -c "set ftp:list-options -a;
open ftp://user:password@your.ftp.com; 
lcd ./web;
cd /web/public_html;
mirror --reverse --delete --use-cache --verbose --allow-chown  
--allow-suid --no-umask --parallel=2 --exclude-glob .svn"

2
lftpはとてもいいです。私がちょうど見つけたもう1つのものはwput、帯域幅制限が組み込まれています。
カルマカゼ

122

書かれたようイーゼルlftp優れたツールです。

スクリプトをパラメータ化し、利用することをお勧めします

exclude-glob

シェルのglob機能(* ,? ..)を使用してファイル名を除外するオプション:

#!/bin/bash    
HOST="your.ftp.host.dom"
USER="username"
PASS="password"
FTPURL="ftp://$USER:$PASS@$HOST"
LCD="/path/of/your/local/dir"
RCD="/path/of/your/remote/dir"
#DELETE="--delete"
lftp -c "set ftp:list-options -a;
open '$FTPURL';
lcd $LCD;
cd $RCD;
mirror --reverse \
       $DELETE \
       --verbose \
       --exclude-glob a-dir-to-exclude/ \
       --exclude-glob a-file-to-exclude \
       --exclude-glob a-file-group-to-exclude* \
       --exclude-glob other-files-to-exclude"

警告:ターゲットディレクトリが存在することを確認してください。存在しない場合、cdコマンドは失敗します。そのため、ファイルツリーの削除を含む操作は 、間違ったディレクトリ(ルート)で行われます

--deleteオプションをdefautによって無効にし、コメントを外して有効にするようにスクリプトを更新しましたDELETE= command


たくさん助けてくれました。しかし、「set ftp:list-options -a;」を削除する必要がありました。どこがめちゃくちゃだ。
マット

1
SFTP(FTPS?)上で同じことを行うこのようなものはありますか?
trusktr

1
cd $RCDa-script-with-a-typoが間違ったディレクトリからファイルを誤って削除するのを防ぐために、前にこれを行いましたset cmd:fail-exit yes。(それはそうlftpする前に、そして- 。あなたは、次のコマンドを発行するまで、それが実際に終了したことに気づかない)cd $LCD:私はこれを行うと思います(ローカルシェルに、それはスクリップの上部に、です)set -eu
-KajMagnus

3
実際、最初にスクリプトを実行したときには、まだリモートディレクトリを作成していなかったため、スクリプトはその存在しないディレクトリにCDを作成できませんでした。その後、スクリプトがし始めmirror、ひいては--delete:間違ったディレクトリからDファイル。(しかし、私はそれらを再びコピーしたので、その場合、それは重要ではありませんでした。おそらく他の誰かにとって重要です。)
KajMagnus

1
「set -eu」および「cd $ LCD」の使用に関する@KajMagnusのアドバイスに従うだけでなく、「cd $ LCD」の前に「mkdir -p $ LCD」を追加します。これにより、ディレクトリが存在することを確認できます。その中に再。
ポール・ギア

25

実際に何をしようとしているかに応じて、別の完全に異なるアプローチを使用curlftpsしてftpフォルダーをマウントし、次にrsync2つの「ローカル」フォルダーをマウントすることができます。

私はその上で一般化することはできませんので、インストールはディストリビューションによって異なりますが、あなたはインストールする必要がありますfuseし、curlftpfs(prolly Debianはすでに持っているfuse、その後、デフォルトでインストールします):

  1. sudo apt-get install curlftpfs

  2. fuseモジュールがロードされていることを確認してください(modprobe fuse

  3. sudo curlftpfs ftp.yourserver.com /path/to/ftp/folder/ -o user=username:password,allow_other

最後のコンマの後にスペースがないことに注意してください(タイプミスではありません!)。満足している場合、または毎回作成したくない場合は、fstab(通常は/etc/fstab)に追加できます。

curlftpfs#user:password@ftp.yourserver.com /path/to/ftp/folder/ fuse auto,user,uid=1000,allow_other 0 0

その場合、事前にヒューズモジュールがロードされていることを確認する必要があります。

ただし、次の2つの点に注意してください。

  • 開発者が1〜2年前にプロジェクトを削除したため、当分の間はどの程度使用可能/安定しているかわかりません。
  • パスワードは変な文字が含まれている場合はcurlftpfs失敗する可能性があります(多分あなたはで何かを行うことができます.netrc)。

FTP Fuseとrsyncは質問に最も近いですが、小さなファイルの小さなセット以外は明らかに非常識です。
スティーブo

1
なぜそれは非常識なのでしょうか?デフォルトのrsync stat()sでは、内容を比較しません。これは、ftpクライアントでls -lを使用して実行できます。
ptman

私は実際にこれを(rsnapshot経由で)試しましたが、動作しませんでした。各ファイルが返されてエラーが発生し、rsyncがリンクを作成できなかったことを示しました。だから、rsnapshotと一緒にトリックをなかったlftpを使って
コンスタンチンPereiaslov

14.04 LTSで問題なし。追加のヒント:FTPサイトをアンマウントする準備ができたら、上記のumount DIR場所DIRを使用します/path/to/ftp/folder
ジョー

1
2017、これはまだ機能します!正直なところ、FTPサイトエンマスからファイルをコピーする最も簡単な方法です。ローカルにマウントし、ローカルのようにrsync
td512

16

weexがあります...

Weexは、Webページまたはその他のFTPアーカイブをリモートで管理するタスクを自動化するように設計されたユーティリティです。必要に応じてアップロードとリモート削除を実行することにより、ローカルファイルのセットをリモートサーバーに同期します。


2
チャームのように機能します!次のように実行します: $ weex yourFTPconfigNameここにマニュアルlinuxcertif.com/man/1/weex-sobi3ch 15
1

9

rsyncはftpでは機能しません。リモート側では、rsyncデーモンまたはrsyncを呼び出すことができるシェルが必要です。一般に、Ftpではいくつかのコマンドを呼び出すことができますが、rsyncはそれらの1つではありません。「lftp」のようなftpタスクを自動化するための他のツールがあります。



7

あなたがしようとしているように見えるもののために、wgetを使用することもできます。

wget -m ftp:// username:password@domain.com


それはサイトのミラーを作成するだけです。これを使用して変更をアップロードすることはできません。
デビッドV.

5

curlftpfsを使用してftpをマウントし、http: //linux.die.net/man/1/curlftpfsの後にrsyncを使用できます。


ServerFaultへようこそ!これは良いスタートかもしれませんが、なぜこれがより良いアプローチであるか、そしておそらくそれを行う方法のモックアップに関するいくつかの技術的な詳細は合理的かもしれません。
スコットパック

4

GVFS / FTPを使用しています。リモートFTPサーバーをgigoloでマウントします。ローカルディレクトリと見なされるため、ローカルファイルで動作するほとんどすべての機能が動作します。rsyncは、ファイルハッシュをリモートで計算して、ファイルを転送せずに比較するように設計されていますが、仮想ファイルを使用してファイルを転送すると、ファイルが転送されます。unisonとfreefilesyncは通常は正常に機能しますが、アップロードしたファイルの名前を変更するときに問題が発生しました。ダウンロードは問題ありません。これはgvfs 1.6.1の問題である可能性があります。


3

Jonas Sのソリューションは、状況に応じて役立ちます。たとえば、ダウンロード速度が高く、アップロードが遅い場合、サーバー上のファイルのチェックは、ファイルを不必要にアップロードするよりも比較的高速です。

:あなたは、おそらくしかし、CurlFTPFSを使用したい http://packages.ubuntu.com/search?suite=default§ion=all&arch=any&searchon=names&keywords=curlftpfs

ただし、一般的には、rsyncの代わりに通常のFTPクライアントを使用することをお勧めします。


2

私はあなたがこれを行うことができるとは思わない、あなたがRsyncしようとしているサーバーはFTPサーバーを実行しているだけで、Rsyncが送信しているコマンドを理解しないだろう。

これを行う理由がポート21へのアクセスのみで、サーバーの制御がある場合、サーバーでRsyncがリッスンするポートを変更できますが、これは明らかに、そのポートでFTPを使用したい。


2

タスクを自動化する場合は、lftpを使用して、上記で投稿したようにスクリプトを作成できます。1回限りのソリューションを探している場合(つまり、Webサイト全体をダウンロードする必要がある場合) ftp経由で/別のサーバーに移動します)ncftpを使用します、シンプル、まだインストールされていない場合はインストールします:

apt-get install ncftp

または

yum install ncftp

(debian / red hatベースのディストリビューションはありません。)

インストールしたら、ターミナルでncftpを開き、次のように入力します。

open -u ftpusername ftp.thedomain.com

パスワードの入力を求められますので、パスワードを入力してから:

get -R /home/remotewebsite/public_html/ /home/localwebsite/public_html/

それはあなたのために仕事の残りを行います..幸運



0

wputもあります:

wput --timestamping --reupload --dont-continue source-files ftp://target.host/dir

ユーザー名とパスワードは〜/ .netrcから読み取られます。それ以外の場合、特にセキュリティに関心がない場合は、ftp:// username:password@target.hostとして提供できます


0

そのための独自のコマンドラインツールを作成しました: ftpsync

どうして?シンプルでエレガントなため、他のツールは多くの依存関係を必要とし、時にはコンパイルし、時には機能しません(MacOs High Sierraのlftpなど)。Ftpsyncは純粋なPythonで書かれており、サードパーティのライブラリを必要とせず、小さく、プロジェクトにファイルを含めることができます。

使用法:プロジェクトディレクトリにcdして、次を入力します。

ftpsync user:pass@ftp.address.url/remote/dir --delete

--delete ローカルに存在しないリモートファイルを削除することを意味します。

同期したくないが、raw ftpコマンドを実行するだけの場合:

ftpsync -c '...'

ファイルの送信や名前の変更など、いくつかの簡単な操作に役立ちます。

ftpsync -c 'PASV; TYPE I; STOR some_file.ext; RNFR some_file.ext; RNTO some_file_renamed.ext'

他の人と同じ理由でこれにつまずいた。FTPプロトコルを介した適切な同期ユーティリティの必要性。あなたのツールは良さそうに見えますが、私の要件はリモートからダウンロードしてローカルと同期することなので、使用することができませんでした。既にダウンロードされているファイルのダウンロードを避けたい。ローカルでは、ダウンロードしたファイルに対して処理を行うため、ファイルが異なります。次回FTPスクリプトを実行するときにはスキップする必要があります。現時点では、解決策を見つけるのに苦労しています。
アヌープ

はい、実際には一方向の同期です。
superdario128

0

rcloneは、ftpおよびクラウドストレージプロバイダー(Amazon S3、Dropbox、Google Drive)を含む他の多くのプロトコルを介してディレクトリ同期を行う素晴らしいソフトウェアです。ローカルストレージまたはリモートストレージの任意の組み合わせとの間で同期できます。

ftpリモートをセットアップするには、次の手順に従ってください

それが完了すると、同期操作は次のようになります。

rclone sync /home/dir FTP_REMOTE:/home --progress 

-7

sftpをインストールしてから、rsyncを使用できます。

私は次のものを使用します。

rsync --delete --times --recursive --perms --owner --group --verbose --progress --stats -e ssh root@192.168.0.100:/folder1/ /folder2/

7
これはFTPではなく、おそらくSSH内部のsftpサブシステムを使用します(少なくとも、デフォルトの構成ではそうです)
-serverhorror

CSYNC(SFTP)とのrsyncは、作業の同様とすることができる
Rajat
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.