Rsyncは.bashrcと互換性がないようです(「シェルはきれいですか?」)


16

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]

示唆したように、ここで削除するサーバー上の.bashrcには、問題を解決しました。.bashrcファイルを(一時的に)削除せずに解決する方法は?


1
そのアカウントでsshが有効になっているかどうかを確認します。
ラミー

以下の回答はおそらく間違っています。.bashrcファイルに何も変更がなかったにもかかわらず、最近、Ubuntuの定期的なアップグレード後にこのエラーが発生し始めました。
セリン

いいえ-.bashrcファイルを削除すると(この質問で述べたように)修正される場合、問題は.bashrcから出力されます。アップグレードにより、実際にプロトコルの非互換性が生じる可能性がありますが、これはまったく別の問題です。
ランドール

回答:


21

.bashrcリモートサーバー上のが端末に何かを出力すると、問題が発生する可能性があります。Rsyncはそれを期待しておらず、結果として問題があるかもしれません。

これを修正するには、.bashrcその出力テキスト内のコマンドを削除するか、/ dev / nullに出力をパイプします。


3
クライアント上のファイルのみを変更できる場合、どのように出力を/ dev / nullにパイプするのですか?
コンピューター論者

1
あなたはあなたのシステム管理者として支援を得ることができると思います。FTPやscpなど、別の方法でサーバー上のファイルを変更することもできます。
グレッグヒューギル

ええ、私の.bashrcファイルには、エコー「*** Starting ROOT Shell ***」とecho「(可能であれば、ルートシェルの代わりにsudoを使用してください!)」が含まれていました。これらのエコーを削除することで問題が修正されました。
ケントグラフ

1
rsyncのmanページから:「プロトコルバージョンの不一致-シェルはきれいですか?」通常、このメッセージは、rsyncがトランスポートに使用しているストリームに不要なゴミを生成する起動スクリプトまたはリモートシェル機能によって発生します。この問題を診断する方法は、次のようにリモートシェルを実行することです:ssh remotehost / bin / true> out.datその後、out.datファイルを確認します。すべてが正常に機能している場合、out.datは長さゼロのファイルである必要があります。
ケントグラフ

8

.bashrcは、この種の問題を引き起こすため、実際には出力を生成するための正しい場所ではありません。しかし、rsyncを実行しようとするまで、多くの人がそれを避けます:-)

必要な出力(および関連するロジックとコマンド)は、.bash_profileに移動する必要があります(ファイル間の違いについて詳しくは、サーバー障害の質問「.profile vs. .bash_profile vs. .bashrc」を参照してください)。

そうすれば、ログイン時に出力の取得を犠牲にする必要も、rsyncを使用するときに.bashrcに一時的な変更を加える必要もなくなります。


6

私は常にユーザーアカウントに.bashrcファイルがあり、ルートアカウントを使用してサーバーに何かをrsyncしようとするまで、この問題は一度もありませんでした。あなたの投稿は解決策を見つけるのに役立ちました:

この種の問題を防ぐため、$ user / .bashrcファイルは常に次のセクションで始まります。これをrootの.bashrcに複製し、rsync'ingが魅力的に機能するようになりました!

# If not running interactively, don't do anything
case $- in
    *i*) ;;
      *) return;;
esac

HTH、カルステン


これrsyncは、何らかの理由で「インタラクティブシェル」として分類されるため、通常は機能しません。しかし、とにかく追加するのは良い行です。そうしないと、出力がある場合に非対話型シェルが台無しになる可能性があるからです。
マイケルシューベルト

これが質問に対する最善の解決策だと思います。「テキストを出力する.bashrcのコマンドを削除する」という回答は現実的ではありません。
キンシー

4

以下のために複雑な理由から別のホストに接続するときにrsync / SCP / SFTP .bashrcに実行されます。これらのコマンドのいずれかを.bashrcの先頭に配置する必要があります

どちらか

[[ $- != *i* ]] && return

または

[ -z "$PS1" ] && return

上記のコマンドはいずれも、対話型セッションの残りの.bashrcコマンドの実行のみを許可します。私の知る限り、他のタイプのセッションには必要ありません(そして実際、ArchとDebianのデフォルトのbashrcをbashrcでこの手法を使用しているのを見ました)。

ただし、非対話型セッションであってもbashrcコマンドを実行させることについて過度に偏執的になりたい場合は、少なくともこのような出力を生成するbashrcのコマンドをラップして(対話型セッションでのみ実行されるようにしてください):

if shopt -q login_shell; then
    # this is an interactive session, we _can_ display output
    ...code that produces output goes here...
fi

他の人がテキストをbash_profileに出力するコマンドを移動することを提案していることに注意してくださいが、これが常に良いかどうかは疑問です(ここで説明する理由のため)

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