rsync でまるっと移行してみたと思ったらまるっと移行できていなかったので対応を加えた(特定のコマンドだけtty無しのsudoを許可する方法)

このエントリーをはてなブックマークに追加

先日『さくらVPS の契約を追加して rsync でまるっと移行してみた』というエントリーを書いたのですが、その時の移行ではまるっと移行できていなかったということに数日後気づくことに。

気づいたのはバックアップを定期的にしようと、再度先日のコマンドを動かした時に、更新していたファイルがコピーされていないのがあったために気づいたという。

あらためて、まるっとコピーが動くように設定をしてみようと思う。

SSH の root ログインの壁を再度確認

前回のエントリーで、NOPASSWD で root で繋げそう!と書いていたけど、先日のはNOPASSWDでつなげただけで、root権限ではなかったので、結果として権限の壁はまだ超えられていなかった。

root ユーザーでのログインは NGにしているので、他のユーザーでログインをするしかない。その前提だけは変更せずに改めてやり方を模索。

root権限のが足りていないので、 rsync をするときに sudo をつけたコマンドで動かせばよいかと思い以下のようにコマンドを変更してみた。

rsync -rtlzvogpHAX --rsync-path="sudo /usr/bin/rsync" --exclude /boot/ --exclude /dev/ --exclude /proc/ --exclude /sys/ --exclude /var/run/ --exclude /var/lock/ --exclude ifcfg* --exclude ssh_host_* --exclude fstab --block-size=4096 -e ssh / 新鯖IP(***.***.***.***):/

変更したのは、 --rsync-path='sudo /usr/bin/rsync' を加えたこと。

これを実行したところ、以下のようなメッセージがでてきた。

sudo: sorry, you must have a tty to run sudo
rsync: connection unexpectedly closed (0 bytes received so far) [receiver]
rsync error: error in rsync protocol data stream (code 12) at io.c(600) [receiver=3.0.6]

えっと、「sudo: sudo を実行するには tty がなければいけません。」ということらしい。tty?

ttyとは、標準入出力となっている端末デバイス(制御端末、controlling terminal)の名前を表示するUnix系のコマンドである。元来ttyとはteletypewriter(テレタイプライター)のことを指す。

引用元:tty - Wikipedia

標準入出力ではないということなのか。ssh 経由ではセキュリティの関連で sudo できないと解釈。つまり、sudo が使えるようにするか、rootと同等の権限をログインユーザーに持たせたらたいいということ・・・だと思う。

ということで、rsync のみ、sudo が使えるようにできるか検索してみたところ、以下のページを発見。

Ansible - rootだけtty無しのsudoを許可 - Qiita

コマンドのみをsudo権限つけて動かせるようなので、設定を加えてみることに。

visudo

Defaults    !requiretty
Defaults!/usr/bin/rsync    !requiretty

下の行を追加。

これで先ほど書いた変更後のコマンドが動いて、コピーできていなかったものもすべてコピーされるようになった。無事解決!