経緯
先日、/usr/bin/sudo
のパーミションを変更してしまったために、sudoが使えなくなりました。
sudoを使用した際のエラーは以下のようになります。
sudo: /usr/bin/sudo must be owned by uid 0 and have the setuid bit set
経緯としましては、ローカルPCの/usr/bin/以下のとある実行ファイルのパーミッションを変更しようとしたところ、(面倒くさいので) chmod 777 * -R
を /user/bin
以下で行ってしまいました。
その中には /usr/bin/sudo
がおり、こいつは変更してはいけなかったのです。
色々調べて解決を試みましたが、最終的に諦めたので、自戒の念を込めて調べたことを残しておきます。
症状
まずバージョンですがUbuntu 18.04を使っていました。
$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=18.04
DISTRIB_CODENAME=bionic
DISTRIB_DESCRIPTION="Ubuntu 18.04.3 LTS"
/etc/usr/sudo
を誤って変更した後には、sudoを利用すると以下のようなエラーがでます。
(英語)sudo: /usr/bin/sudo must be owned by uid 0 and have the setuid bit set
(日本語)sudo: 実効 uid が 0 ではありません、sudo は setuid root を設定してインストールされていますか
修正方法1
1つめの修正方法はrootユーザーでログインしてパーミッションを変更しましょうというものです。
ただしrootユーザーのパスワードが事前に設定されている必要があります。
# rootユーザーに変更
su
# 権限変更
chown root:root /usr/bin/sudo
chmod 4755 /usr/bin/sudo
残念ながらデフォルトではrootユーザーはパスワードをもっていないので、特別設定してなければsudoなしにrootユーザーになれないかと思います。私もそうでした。
修正方法2
修正方法の2つめはリカバリーモードを利用してパーミッションを変更するという方法です。
再起動時にShiftキーかEscキーを押しっぱなしにするとGrabのブートメニューが表示されると思います。
この中の Advanced options for Ubuntu
を選び、その後 Ubuntu 18.04 (recovery mode)
のようにRecovery Modeを選んで下さい。
そうしたら、別のスクリーンが立ちがりますので、 Drop to root shell prompt
を選んで下さい。
コマンドラインのスクリーンが現れたと思います。そしたら以下のコマンド打って、パーミッションの変更を行って下さい。
mount -o remount,rw /
mount –all
chown root:root /usr/bin/sudo
chmod 4755 /usr/bin/sudo
最後にrestart
でPCを再起動します。
修正方法3
OS再インストール。
筆者はrootユーザーのパスワードを設定してなかったので、修正方法2のリカバリーモードによる解決を試みました。
しかし、再起動時にShiftやEscをいくら押しても、Grubのブートメニューが表示されないという問題にあたりました。
調べてみると、Grabの起動メニューの表示時間が0秒設定されているということがわかりました。
設定箇所は /etc/default/grab
の中の GRUB_TIMEOUT
の設定値です。
...
GRUB_TIMEOUT=0
...
Ubuntu 18.04からこの設定がデフォルトのようです(そういえば昔14.04使っているときはブートメニューが毎回表示されていた気がする)。
これのせいで起動メニューが表示されなくなっていますので、この時間設定値を変更するなり、この設定をコメントアウトなりする必要があります。
しかし…このファイルの所有者はrootユーザーなんです。
sudo
がないと編集できないんです。
詰んだ…
となりました。
泣く泣く諦めて、次回構築時はTIMEOUT設定を3秒にしておくことを誓って、OS再インストールとなりました。
以上