rssh と rsync 3 の相性

リモートのアカウントを rssh で保護している状態で、たとえば

$ rsync -a -e "ssh hogehoge" /local/path remote:/remote/path

のように実行した時に、

insecure -e option not allowed.
This account is restricted by rssh.
Allowed commands: scp sftp rsync

If you believe this is in error, please contact your system administrator.

のように表示される(そして転送されない)ようになってしまった。


原因は

  • rssh (2.3.2) は、rsync にわたされたコマンドライン*1-e が含まれている場合に、危険なので実行しないようになっている
  • rsync 3.0.0 以降で、ローカル側で -e オプションを指定した場合にリモート側に -e オプションを渡すように変更された
    • rsync 2 では -e オプションはリモート側に渡さないようになっていた

ということみたい。
Bug 485946 – rssh doesn't accept rsync あたりに現象と議論が載っている)


解決法は2つ。

解決法 1: rssh にパッチを当てる

rssh は更新されてないので*2、自分でパッチを当てる必要がある。といっても Debian 系列だとすでにパッチはあたっていると思う。

自分がみつけたパッチは2種類あった。

どちらを採用するかはお好みで。

Debian のほうが(すでに大勢につかわれているであろうという点で)信頼性が高いかもしれないけど、個人的には bugzilla に投稿されているコードのほうが好み*3

解決法 2: rsync 実行時に 2.x 系列であるかのように振る舞わせる

rsync って結構アップデートされてるんだけど、ローカル側とリモート側でバージョンが異なってもうまく動くように、後方互換性が確保されている(過去のプロトコルも実装してある)。結構すごいよね。

んで、プロトコル番号 29 を指定すると、リモート側(rssh 側)に -e オプションをわたさないようになってうまく rsync できるようになる。

$ rsync -a -e "ssh hogehoge" --protocol=29 /local/path remote:/remote/path

ただし Bug 5607 – Add a way to elide the client's use of -e to the server からすると rsync 3.0.5 以降じゃないと効かないと思う。

大量にファイルが存在する場合、rsync 3 プロトコルのほうが格段に高速なんだけど、そうでもない場合はこの方法のほうがお気軽かも。

*1:といってもクライアントサイドでユーザーが指定したコマンドラインではなく、rsync 実行時にリモート側で(暗黙に)実行されるコマンドラインのこと

*2:メンテナンスされていないというのは厳密には嘘。Bug 485946 – rssh doesn't accept rsync に作者も降臨していて、重大なセキュリティ上の脆弱性には対応するけど、rsync 3 で加えられた変更のほうがおかしいから俺は対応したくないといってる。

*3:わざわざ regex でマッチする必要あるのかなぁ(Debian のほうのコードがね)と思うんで。