Rsyncが.bashrcファイルを持つリモートサーバーで動作しないことがわかりましたか?
ローカルクライアントで、rsyncを実行したときに得た:
protocol version mismatch -- is your Shell clean?
(see the rsync man page for an explanation)
rsync error: protocol incompatibility (code 2) at compat.c(180) [sender=3.0.7]
提案されたように here サーバー上の.bashrcを削除すると問題が解決しました。 .bashrcファイルを(一時的に)削除せずに解決するにはどうすればよいですか?
リモートサーバーの.bashrc
が何かを端末に出力すると、問題が発生する可能性があります。 Rsyncはそれを予期せず、結果として問題が発生する可能性があります。
テキストを出力する.bashrc
のコマンドを削除するか、出力を/ dev/nullにパイプすることで、これを修正できます。
.bashrcは、この種の問題を引き起こすため、出力を生成するための正しい場所ではありません。しかし、多くの人はrsyncを実行しようとするまで、それを回避します:-)
必要な出力(および関連するロジックとコマンド)は.bash_profileに移動する必要があります(たとえば、 (サーバー障害の質問 ".profile vs. .bash_profile vs. .bashrc" を参照して、ファイル間の違い)。
そうすれば、ログイン時に出力の取得を犠牲にする必要も、rsyncを使用するときに.bashrcを一時的に変更する必要もありません。
ユーザーアカウントには常に.bashrcファイルがあり、ルートアカウントを使用してサーバーに何かをrsyncしようとするまで、この問題は発生しませんでした。あなたの投稿は私が解決策を見つけるのに役立ちました:
この種の問題を防ぐために、私の$ user/.bashrcファイルは常に次のセクションで始まります。私はそれをルートの.bashrcにレプリケートし、rsyncが魅力的に機能するようになりました!
# If not running interactively, don't do anything
case $- in
*i*) ;;
*) return;;
esac
HTH、karsten
複雑な理由 rsync/scp/sftpは、別のホストに接続するときに.bashrcを実行します。 。bashrcの先頭にこれらのコマンドのいずれかが必要です。
どちらか
[[ $- != *i* ]] && return
または
[ -z "$PS1" ] && return
上記のコマンドはいずれも、 インタラクティブセッション の残りの.bashrcコマンドの実行のみを許可します。私が知る限り、他のタイプのセッションではそれらは必要ありません(実際、ArchとDebianのデフォルトのbashrcで、bashrcでこの手法を使用しています)。
ただし、非インタラクティブセッションでもbashrcコマンドを実行できるようにするために特別な偏執狂になりたい場合は、少なくともこのような出力を生成するbashrcのコマンドをラップする必要があります( reference )。インタラクティブセッションでのみ実行されること:
if shopt -q login_Shell; then
# this is an interactive session, we _can_ display output
...code that produces output goes here...
fi
テキストを出力するコマンドをbash_profileに移動することを提案する人もいますが、これが常に良いかどうかは疑問です( ここで説明する理由 )
この負担は、SSH経由でrsyncを実行しているためです。
SSHは。bashrcのようなシェルスクリプトを開始します。スクリプトの出力はRSYNCハンドシェイクを破壊します。これは既知の問題です。ヒント「プロトコルバージョンの不一致—です」あなたのシェルはきれいですか?」
SSH機能(認証やトンネリングなど)が必要ない場合は、SSHなしで純粋なrsyncを実行できます。各ホストの先頭にrsync://を追加するだけです
rsync over rsync:
アクセス許可を定義できます。これらのファイルを参照してください
注:ファイルの場所は異なる場合があります。
パフォーマンス
Rsync/rsyncは、rsync/sshよりもはるかに高速な場合があります。サーバーとネットワークでテストします。