Ubuntu Weekly Recipe

第410回 あなたの人生を少しだけ豊かにするsudoの使い方

この記事を読むのに必要な時間:およそ 6 分

rootや他のユーザーになりたい

管理者権限が必要な作業はsudoコマンド経由でできますし,前述のようにsudoを使うことでいくつものメリットが存在しますが,どうしてもrootになって作業したい場合が存在するかもしれません※4)⁠そんなときはsudoの「-s」オプションないしは「-i」オプションを使うと便利です。

※4
たとえば管理者しか読み込み権限のないディレクトリの下を操作する場合,一般権限のシェルだとタブ補完できないという不便さがあります。
$ sudo -s
# pwd
/home/miho
# echo $HOME
/home/miho
# exit
$ sudo -i
# pwd
/root
# echo $HOME
/root

「-s」「-i」の違いは,前者が環境変数SHELLか/etc/passwdで指定したシェルを実行するだけなのに対して,後者はログインシェルとして「~/.login」「~/.profile」も評価するということです。このため「-i」の場合はカレントディレクトリもsudo後のユーザーのホームディレクトリに移動しています。設定されている環境変数も変わっていますので,どちらで実行するかは状況にあわせて変更してください。

なお,上記のオプションに加えて「-u "ユーザーID"」を指定すれば,rootではなく指定したユーザーの権限でシェルが起動します。特定のサービスをインストール時に作成されるユーザーで作業を行いたい場合に便利でしょう。

繰り返しになりますがsudoでシェルを起動した場合,その作業内容は/var/log/auth.logには残らないなど,sudoを使うメリットが損なわれます。⁠Ubuntuではできるだけ避けるべきやり方」だということは心に留めておいてください※5)⁠

※5
「sudo su -」はほぼ「sudo -i」と同じです。⁠sudo su」「sudo -s」に似ていますが,中途半端に環境変数が書き換わるので注意してください。

別のユーザーもsudoできるようにする

Ubuntuではインストール時に作成したユーザーのみ,sudoコマンドを実行できるようになっています。もしインストール後に作成したユーザーもsudoを実行できるようにしたい場合,一番簡単な方法はsudoグループに追加することです。

$ sudo adduser "追加したいユーザーID" sudo

またシステム設定の「ユーザーアカウント」からも変更できます。右上の「ロック解除」を選択した上で「アカウントの種類」をクリックすれば,一般ユーザーから管理者への変更が可能です。

特定のユーザーをsudoグループから外したい場合は,次のコマンドを実行します。

$ sudo deluser "追加したいユーザー名" sudo

外したユーザーはsudoを実行できなくなります。sudoグループに誰もいなくなってしまうと,誰もsudoを実行できないのでグループも変更できないという事態になってしまいます。そうするとシングルユーザーモードで起動するかライブセッションを起動して,無理やりルートファイルシステムを書き換えるぐらいしか手がなくなりますので,sudoグループを操作する場合は細心の注意を払ってください。

GUIアプリケーションを管理者権限で起動したい

ファイルブラウザーやテキストエディターといったGUIアプリケーションを管理者権限で起動したいという要望はそれなりにあるようです。しかしながらこれはあまり推奨されていません。GUIアプリケーションは単純にプロセスを起動するだけでなく,他のプロセスと通信したり,ホームディレクトリにキャッシュや設定ファイルを作成・編集したりと裏でいろいろな処理を行っています。これらの処理が管理者権限で行われると,次回一般ユーザー権限で起動した時に,うまく起動できなる可能性があるからです※6)⁠

※6
同様の現象はCUIアプリケーションでも発生しえます。たとえばnanoやvimをsudoで起動した時に設定が読み込まれない,などです。ちなみに「sudo -e」「sudoeditor」コマンドを使えば,編集したいファイルを一時的に/tmpに移動し「一般ユーザー権限で」エディターを起動し,編集し終わったら「管理者権限で」反映してくれます。これにより,一般ユーザーの設定を反映したままエディター使用できます。

過去にはgksuというコマンドが最初からインストールされており,それをsudoのように使う方法が紹介されたこともあります。しかし今ではgksuは初期状態ではインストールされていません。その代わりにUbuntuではpolkitpkexecコマンドを使っています。実際にアップデートマネージャー経由のパッケージの更新やネットワーク設定などで表示されるパスワード入力ダイアログはいずれもこのpolkitによるものです。

pkexecで特定のコマンドを実行したい場合は,XMLベースのアクションファイルを記述する必要があります。残念ながらこのアクションファイルを簡単に記述する方法はまだ存在しません※7)⁠ただファイルブラウザ(nautilus)とテキストエディター(gedit)に限って言えば,WebUpd8の記事でアクションファイルが公開されていますので,それを使うことにしましょう。以下はgeditの例です。

※7
よくわからないままに権限を付与されては困るので,当然と言えば当然です。さらにアクションファイルの書き方がわかるほど「知識がある」のであれば,最初からGUIに頼らなくてもいいはずです。
$ wget https://raw.githubusercontent.com/hotice/webupd8/master/org.gnome.gedit.policy \
    -O /tmp/org.gnome.gedit.policy
$ sudo cp /tmp/org.gnome.gedit.policy /usr/share/polkit-1/actions/

さらにUnity Launcherのファイルアイコンを右クリックした時,pkexec経由で起動するメニューを追加します。

$ cp /usr/share/applications/gedit.desktop ~/.local/share/applications/
$ cat <<END >> ~/.local/share/applications/gedit.desktop

[Desktop Action admin-window]
Name=Open a Admin Window
Exec=pkexec gedit --new-window
END

さらに「~/.local/share/applications/nautilus.desktop」のActions行に追加したadmin-windowアクションを設定してください。

Actions=new-window;new-document;admin-window;

あとはLauncherにgeditアイコンを追加し,アイコンを右クリックすれば「Open a Admin Window」が追加されているはずです。

著者プロフィール

柴田充也(しばたみつや)

Ubuntu Japanese Team Member株式会社 創夢所属。数年前にLaunchpad上でStellariumの翻訳をしたことがきっかけで,Ubuntuの翻訳にも関わるようになりました。