44

WinscpKeep Remote Directory Up-to-date機能がとても気に入っています。残念ながら、OS X や Linux でこれほど簡単に使用できるものは見つかりません。理論的にはchangedfilesまたはrsyncを使用して同じことを達成できることは知っていますが、両方のツールのチュートリアルが不足しているか、矛盾していることが常にわかりました。

基本的には、OSX または Linux で動作し、ローカル ディレクトリに変更を加えている間、リモート ディレクトリをローカル ディレクトリと同期 (ミラーリング) するツールが必要です。


アップデート

ソリューションを調べてみると、リモート ディレクトリとローカル ディレクトリの同期を手動で維持するという一般的な問題を解決するいくつかの方法が見つかりました。rsync を毎分実行するように cron タスクを設定できることはわかっていますが、これはかなりリアルタイムに近いはずです。

winscp はこれ以上のことを行うため、これは私が探していた正確な解決策ではありません。(作業中に) ディレクトリ内のファイルの変更を検出し、その変更をリモート サーバーに自動的にプッシュします。これが最善の解決策ではない (コード リポジトリがない) ことはわかっていますが、開発中にサーバー上でコードを非常に迅速にテストできます。rsync を他のコマンドと組み合わせてこの機能を実現する方法を知っている人はいますか?

4

17 に答える 17

19

どの程度「リアルタイム」で同期しますか? 両方のプラットフォーム (Windows も cygwin を使用) で完全にサポートされることがわかっており、cron ジョブを介して実行できるため、rsync に傾倒します。システムで実行する非常に単純なbashファイルがあります(これは古いファイルを削除しません):

#!/bin/sh
rsync -avrz --progress --exclude-from .rsync_exclude_remote . remote_login@remote_computer:remote_dir    

# options
#   -a  archive
#   -v  verbose
#   -r  recursive
#   -z  compress 

あなたの最善の策は、それを設定して試してみることです. オプションはあなたの-n (--dry-run)友達です!

rsync (少なくとも cygwin では) は Unicode ファイル名をサポートしていないことに注意してください (2008 年 8 月 16 日現在)。

于 2008-08-12T22:14:46.830 に答える
9

Linux リモート アクセスでやりたいことは、'sshfs' (SSH ファイル システム) を使用することです。

# sshfs username@host:path/to/directory local_dir

次に、それをネットワークマウントのように扱います...

私のブログで、通常のユーザーとしてこれを行うことができるように設定する方法など、もう少し詳細

winSCP の非同期動作が必要な場合は、rsync を定期的に実行するものと組み合わせて使用​​する必要があります。上記の cron ソリューションは機能しますが、winscp の使用例ではやり過ぎかもしれません。

次のコマンドは、rsync を 5 秒ごとに実行して、コンテンツをリモート ホストにプッシュします。サーバーの負荷を軽減するために、必要に応じてスリープ時間を調整できます。

# while true; do rsync -avrz localdir user@host:path; sleep 5; done

ディレクトリ構造が非常に大きく、ポーリングのオーバーヘッドを削減する必要がある場合は、'find' を使用できます。

# touch -d 01/01/1970 last; while true; do if [ "`find localdir -newer last -print -quit`" ]; then touch last; rsync -avrz localdir user@host:path; else echo -ne .; fi; sleep 5; done

そして、cronはやり過ぎかもしれないと言いましたか?しかし、少なくともこれはすべてコマンドラインから実行され、ctrl-C で停止できます。

キロバイト

于 2008-11-14T05:19:26.870 に答える
4

変更されたファイルを検出するには、fam (ファイル変更モニター) または inotify を試すことができます。後者は Linux 固有のもので、fam には OS X で動作する可能性のある bsd ポートがあります。両方とも、スクリプトで rsync と一緒に使用できるユーザー空間ツールを備えています。

于 2008-08-13T00:24:41.293 に答える
3

同じ問題があります。winscpの「リモートディレクトリを最新に保つ」コマンドが大好きでした。しかし、Windows をなくそうとするうちに、winscp を失いました。私は、fileschanged と rsync を使用して、よりリアルタイムに近い処理を行うスクリプトを作成しました。

使い方:

  • fileschanged がインストールされていることを確認してください
  • このスクリプトを /usr/local/bin/livesync または $PATH で到達可能な場所に保存し、実行可能にします
  • Nautilus を使用してリモート ホストに接続する (sftp または ftp)
  • livesync SOURCE DESTを実行して、このスクリプトを実行します。
  • DEST ディレクトリは /home/[ユーザー名]/.gvfs/[ftp scp へのパスなど] にあります。

いくつかの欠点:

  • winscp よりも遅いです (私の推測では、Nautilus を経由し、rsync を介して変更を検出する必要があるためです)。
  • 宛先ディレクトリがまだ存在しない場合は、手動で作成する必要があります。したがって、ディレクトリを追加する場合、DEST 側でディレクトリを検出および作成しません。
  • まだ気づいていないことの方が多いかもしれません
  • また、「rsyncThis」という名前の SRC ディレクトリを同期しようとしないでください。それはおそらく良くないでしょう:)

#!/bin/sh

upload_files()
{
    if [ "$HOMEDIR" = "." ]
    then
        HOMEDIR=`pwd`
    fi

    while read  input
    do
        SYNCFILE=${input#$HOMEDIR}
        echo -n "Sync File: $SYNCFILE..."
        rsync -Cvz --temp-dir="$REMOTEDIR" "$HOMEDIR/$SYNCFILE" "$REMOTEDIR/$SYNCFILE" > /dev/null
        echo "Done."
    done
}


help()
{
    echo "Live rsync copy from one directory to another.  This will overwrite the existing files on DEST."
    echo "Usage: $0 SOURCE DEST"    
}


case "$1" in
  rsyncThis)
    HOMEDIR=$2
    REMOTEDIR=$3
    echo "HOMEDIR=$HOMEDIR"
    echo "REMOTEDIR=$REMOTEDIR"
    upload_files
    ;;

  help)
    help
    ;;

  *)
    if [ -n "$1" ] && [ -n "$2" ]
    then
        fileschanged -r "$1" | "$0" rsyncThis "$1" "$2"
    else
        help
    fi
    ;;
esac
于 2010-12-07T16:20:21.923 に答える
2

SVN のようなバージョン管理をいつでも使用できるので、サーバーが毎晩フォルダーで svn を実行するだけで済みます。ファイルを公に共有している場合、これはセキュリティ上の問題に遭遇しますが、機能します。

ただし、Linux を使用している場合は、rsync の使用方法を学んでください。-n ですべてのコマンドをテストできるので、それほど難しくありません。man ページを参照してください。必要な基本的な形式は次のとおりです。

rsync [OPTION...] SRC... [USER@]HOST:DEST

学校のサーバーから自宅のバックアップ マシンに実行するコマンドは次のとおりです。

rsync -avi --delete ~ me@homeserv:~/School/ >> BackupLog.txt

これは、ホーム ディレクトリ (~) 内のすべてのファイルを取得し、rsync のアーカイブ モード (-a)、冗長 (-v) を使用し、加えられたすべての変更を一覧表示し (-i)、もう存在しないファイルを削除します。 (--delete) をリモート サーバーのフォルダー /home/me/School/ に配置します。印刷されるすべての情報 (コピーされたもの、削除されたものなど) は、BackupLog.txt ファイルにも追加されます。

これが rsync の旋風ツアーであることは承知していますが、お役に立てば幸いです。

于 2008-08-12T22:17:34.297 に答える
2

rsync特に変更を一方向にのみプッシュする場合、ソリューションは非常に優れています。もう 1 つの優れたツールはunison、両方向の変更を同期しようとすることです。詳細は Unison のホームページをご覧ください。

于 2008-08-12T23:01:14.880 に答える
2

何時間も答えを探してきた素晴らしい質問です!

lsyncdをテストしましたが、問題は、デフォルトの遅延が長すぎ-delayて、オプションを提供するコマンド ラインの例がないことです。

その他の問題は、デフォルトでrsyncが毎回パスワードを要求することです!

lsyncdを使用したソリューション:

lsyncd --nodaemon -rsyncssh local_dir remote_user@remote_host remote_dir -delay .2

他の方法は、スクリプトでinotify-waitを使用することです:

while inotifywait -r -e modify,create,delete local_dir ; do
    # if you need you can add wait here
    rsync -avz local_dir remote_user@remote_host:remote_dir
done

この 2 番目のソリューションでは、inotify-toolsパッケージをインストールする必要があります

変更のたびにパスワードを入力する必要がないようにするには、次を使用しますssh-keygen: https://superuser.com/a/555800/510714

于 2019-06-22T17:57:37.143 に答える
1

icco の SVN の提案に基づいて、ソース管理に Subversion などを使用している場合 (そうでない場合は、おそらく開始する必要があります)、次のコマンドを実行することで、運用環境を最新の状態に保つことができます。リポジトリを post-commit フックに更新します。

それを行う方法には多くの変数がありますが、私が見たのは、開発またはライブサイトを作業コピーにしてから、ポストコミットに強制コマンドで ssh キーを使用させることです。リモート サイトにログインし、作業コピーで svn up をトリガーします。別の方法として、post-commit フックで、リモート マシンで svn エクスポートをトリガーするか、ローカル (svn リポジトリへ) svn エクスポートをトリガーしてから、リモート マシンへの rsync をトリガーできます。

変更を検出してプッシュするものや、競合状態のために毎分実行されるものについても心配していました。ファイルが書き込まれているのとまったく同じ瞬間にファイルが転送されないことをどのように知っていますか? これに 1 回か 2 回出くわすと、常に rsync などを行っていた時間節約の利点がすべて失われます。

于 2008-09-16T15:13:37.330 に答える
1

これを自動化するには、watcher.py と rsync を使用します。ここで、次のステップバイステップの説明をお読みください。

http://kushellig.de/linux-file-auto-sync-directories/

于 2015-02-20T18:39:19.347 に答える
1

おそらく間違った問題を解決しているようです。リモート コンピューター上のファイルを編集しようとしている場合は、jedit の ftp プラグインなどを使用してみてください。 http://plugins.jedit.org/plugins/?FTP これにより、ファイルのバージョンが 1 つだけになるため、同期がずれることはありません。

于 2008-08-13T00:32:05.897 に答える
1

DropBox ( http://www.getdropbox.com/ ) はあなたが望むことをしますか?

于 2008-09-22T02:23:01.850 に答える
1

私は以前、あなたと同じように Windows でローカル ファイルツリー (バージョン管理) とリモート サーバー上のテスト環境をセットアップしていました。Mac に切り替えたとき、満足するまでかなり掘り下げなければなりませんでしたが、最終的には以下を使用することになりました。

  • Subversion クライアントとしてのSmartSVN
  • Sublime Text 2をエディターとして使用 (既に Windows で使用)
  • 保存時にアップロードを処理する ST2 への SFTP プラグイン (申し訳ありませんが、2 つ以上のリンクを投稿することはできません)

このセットアップを本当にお勧めします。お役に立てば幸いです。

于 2012-01-13T17:20:32.110 に答える
0

Fetch を SFTP クライアントとして使用し、その中からサーバー上のファイルを直接編集することもできます。SSHFS (ssh フォルダーをボリュームとしてマウントする) オプションもあります。これは stimms が言ったことと一致しています。同期を維持したいですか、それともサーバー上のファイルを編集したいだけですか?

OS X には独自のファイル通知システムがあり、これが Spotlight のベースになっています。これを使用して同期を維持するプログラムは聞いたことがありませんが、確かに考えられます。

私は個人的にこの種の目的で RCS を使用しています。手動の側面がありますが、最初にテストせずに開発マシンからテスト サーバーに何かをプッシュすることはほとんどありません。また、開発サーバーで作業している場合は、上記のオプションのいずれかを使用します。

于 2008-08-18T14:41:18.473 に答える
0

まあ、私は同じ種類の問題を抱えていましたが、rsync、SSH Passwordless Login、Watchdog (Python 同期ユーティリティ)、および Terminal Notifier (Ruby で作成された OS X 通知ユーティリティ) を一緒に使用することは可能です。必要ありませんが、知るのに役立ちます同期が完了したとき)。

  1. Dreamhost wiki のこのチュートリアルを使用して、パスワードレス ログインのキーを作成しました: http://cl.ly/MIw5

    1.1。終了したら、すべて問題ないかテストします。パスワードなしでログインできない場合は、afp マウントを試す必要があるかもしれません。Dreamhost (私のサイトがある場所) は afp マウントを許可しませんが、パスワードなしのログインを許可します。ターミナルで、次のように入力します。

    ssh username@host.com パスワードを求められることなくログインする必要があります:P

  2. Github ページから Terminal Notifier をインストールしました: http://cl.ly/MJ5x

    2.1. Gemインストーラーコマンドを使用しました。ターミナルで、次のように入力します。

    gem install terminal-notifier

    2.3. 通知が機能するかどうかをテストします。ターミナルで、次のように入力します。

    terminal-notifier -message "Starting sync"

  3. rsync + 通知をテストする sh スクリプトを作成します。好きな名前で好きな場所に保存してください。この例では、~/Scripts/sync.shと呼びます。".sh 拡張子を使用しましたが、必要かどうかはわかりません。

    #!/bin/bash terminal-notifier -message "Starting sync" rsync -azP ~/Sites/folder/ user@host.com:site_folder/ terminal-notifier -message "Sync has finished"

    3.1. このshスクリプトに実行権限を付与することを忘れないでください。ターミナルで、次のように入力します。

    sudo chmod 777 ~/Scripts/sync.sh 3.2. スクリプトを実行して、メッセージが正しく表示され、rsync がローカル フォルダーとリモート フォルダーを実際に同期するかどうかを確認します。

  4. 最後に、Github ページから Watchdog をダウンロードしてインストールしました: http://cl.ly/MJfb

    4.1. 最初に、Brew を使用して libyaml 依存関係をインストールしました (OS X の「適性」のように、Brew のインストール方法には多くのヘルプがあります)。ターミナルで、次のように入力します。

    brew install libyaml

    4.2. 次に、「easy_install コマンド」を使用しました。Watchdog のフォルダーに移動し、ターミナルに次のように入力します。

    easy_install watchdog

  5. これで、すべてがインストールされました!同期したいフォルダに移動し、このコードを必要に応じて変更し、ターミナルに次のように入力します。

      watchmedo shell-command
          --patterns="*.php;*.txt;*.js;*.css" \
          --recursive \
          --command='~/Scripts/Sync.sh' \
          .
    

    スラッシュと改行を使用して正確にこのようにする必要があるため、これらの行をテキストエディターにコピーし、スクリプトを変更し、ターミナルに貼り付けてリターンを押す必要があります。

    改行なしで試してみましたが、うまくいきません!

    私の Mac では、常にエラーが発生しますが、何の影響もないようです。

    /Library/Python/2.7/site-packages/argh-0.22.0-py2.7.egg/argh/completion.py:84: UserWarning: Bash completion not available. Install argcomplete.

    ここで、フォルダー内のファイルにいくつかの変更を加えて、魔法を見てください!

于 2013-01-21T09:25:35.473 に答える