mattintosh note

どこかのエンジニアモドキの備忘録

2024-06-05: 現在ホビー関連の記事を 新しいブログ に移行しています(一部の国、ISP からは閲覧できません)

リモートでsudoしてrsyncしたい

EC2 インスタンス上のデータをバックアップするのに root しか読み取り権限がないファイルやディレクトリをどうコピーするか、という問題にあたった。Amazon Linux では root のログインを禁止しているため何らかの方法でユーザをスイッチしなくてはならない。んで、rsync のマニュアルを読み返して考えたところ --rsync-path オプションで rsyncsudo で実行すれば良いことに気づいた。

なお、このサーバは踏み台を利用しており、ホストや秘密鍵の設定などは ssh/config に書いてあるためそれを -e "ssh -Fssh/config" で呼び出している。--compress は無くてもいいが EC2 インスタンスからグローバルへの転送は料金がかかるので圧縮しておいた方がコストが減らせる。

rsync -av --progress --compress \
    --no-o --no-g --no-p \
    --copy-unsafe-links \
    -e "ssh -Fssh/config" \
    --rsync-path="sudo rsync" \
    remote:/path/to/source/ /path/to/destination/

--no-o--no-g--no-p はそれぞれ --no-owner--no-group--no-perms の省略形。-a オプションは -rlptgoD の省略形であるが、このうち ogp を打ち消す(-a を使わずに -rltD でもいいだろう)。打ち消している理由はバックアップ先のメディアが FAT32 でそもそもパーミッションという概念が無く、「パーミッション変更できまへん」エラーが大量に出るから。本来であれば EXT4 や XFS などの Linux ファイルシステムが望ましい(今回はクライアントからの要望で USB メモリ標準のフォーマットを使用した)。