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
オプションはリモート側に渡さないようになっていた
- rsync 2 では
ということみたい。
(Bug 485946 – rssh doesn't accept rsync あたりに現象と議論が載っている)
解決法は2つ。
解決法 1: rssh にパッチを当てる
rssh は更新されてないので*2、自分でパッチを当てる必要がある。といっても Debian 系列だとすでにパッチはあたっていると思う。
自分がみつけたパッチは2種類あった。
- RedHat の bugzilla に投稿されているパッチ: https://bugzilla.redhat.com/attachment.cgi?id=332270
- Debian であたっているパッチ: http://patch-tracker.debian.org/patch/series/view/rssh/2.3.2-8/rsync-protocol
どちらを採用するかはお好みで。
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 プロトコルのほうが格段に高速なんだけど、そうでもない場合はこの方法のほうがお気軽かも。