前にssh越しにsudo経由でtarを用いるという事をやっていたのだが、今回はrsync。 で、rsyncもそうみたいなのだが、ssh越しで擬似端末(tty)を使っての通信できないらしい。 こうなると、sshで「-tt」オプションを付けて擬似端末を有効にしての対応は難しいので、CentOSなどのデフォルト(AWSとかAzure上のイメージでは手が入ってるので対象外)だとsudo実行時には擬似端末を要求する指定(Defaults requiretty)を解除する必要があるようだ。 ユーザごとに設定もできるのだが、面倒であれば以下のようなコマンドを実行してrequirettyを無効化してしまおう。

ssh -t user@host 'sudo sed -i "/requiretty$/s/^/# /g" /etc/sudoers'

疑似端末が要求されないようになったら、あとは以下のようにコマンドを実行することでroot権限が必要になるディレクトリに対するrsyncが行えるようになる。

rsync -auv -e "ssh -i key " --rsync-path="sudo rsync " user@host:/remotedir /localdir

で、この時注意したいのがsudo実行時にパスワードが必要な場合。 sshコマンドで直接sudoを呼び出しているのと違い、rsync経由でssh接続しているからか、ヒアドキュメントや標準入力を利用してのパスワード入力はちょっと難しいみたい。 X11Forwardingを使えるのなら、ssh-askpassを使ってやればなんとかなるようだけど、それ以外の方法はちょっと無さそう。

色々と試してみたけど、基本はやはり/etc/sudoersいじってrequirettyを無効化・NOPASSWDで実行できるようにするのが一番早いようだ。