トップ > Linuxらしい使い方を覚える >
権限昇格で一時的に管理者ユーザの権限を持つ

  

sudo コマンドで一時的に管理者ユーザと同じ権限を得られる

この記事では、sudo コマンドによる権限昇格について解説します。 簡単に言えば、標準ユーザでありながら管理者ユーザの権限を一時的に手に入れるための仕組みです。

管理者ユーザと標準ユーザ

以前の記事で軽く触れたように、UNIX系OSのユーザは管理者ユーザと標準ユーザに分かれます。 標準ユーザはさらに2種類に分類することができ、

  1. 自分自身のパスワードを入力することでシステム管理作業の権限を持てるユーザ
  2. システム管理作業の権限は持てないユーザ

に分かれます。 なお、インストール時に作成された標準ユーザは、

  1. 自分自身のパスワードを入力することでシステム管理作業の権限を持てるユーザ

となります。 つまり、今ログインしているユーザは自分自身のパスワードを入力することでシステム管理作業を行うことができます。

実際に、Linux MintやMX Linuxのインストール直後に行った最新状態へのアップデートやその後に実施したアプリケーションの追加の作業では、自分自身のパスワードを入力することでシステム管理作業を行えたことを思い出してください

端末での作業では sudo コマンドで権限昇格できる

端末から作業を行う場合でも、いつでもシステム管理作業を行うことができます。 そのためには、 sudo(スードゥ) スードゥ sudo(スードゥ) コマンドを利用して権限を昇格させる必要があります。

  
sudo コマンドの名前の由来は SuperUser DO だと聞きます。
  
スーパーユーザとは、UNIX系OSの管理者ユーザのことです。

sudo コマンドで権限昇格してみよう

では、実際に sudo コマンドを利用して権限昇格してみます。 さて、権限昇格して、どんなことをしましょうか。 うーん、そうですね、管理者ユーザのホームディレクトリを覗いてみましょう。

なお、UNIX系OSの管理者ユーザのユーザIDは root でホームディレクトリは /root です。

- UNIX系OSの管理者ユーザ -
ユーザID root
ホームディレクトリ /root

まずは、権限昇格せずに /root を覗いてみましょう。 端末を開いてキーボードから ls -la /root と入力して、Enterキーを押してください。


ls -la /root

 

以下のように許可がないぞ、と怒られます。 このように標準ユーザでは管理者ユーザのホームディレクトリを見ることはできません。

taro@myhostname:~$ ls -la /root
ls: ディレクトリ '/root' を開くことが出来ません: 許可がありません
taro@myhostname:~$

許可がない、というのはアクセス権がないという意味です。 過去の記事で解説したようにアクセス権とはパーミッションの設定によって決まります

ではここで、パーミッションの設定がどうなっているのかを確認してみましょう。 ディレクトリ /root のパーミッションを表示してみます。 端末を開いてキーボードから ls -ld /root と入力して、Enterキーを押してください。


ls -ld /root

 
  
ls コマンドの -d オプションは ディレクトリの中身ではなくディレクトリ自身の情報を表示するためのオプションです。

以下のようにディレクトリ /root の情報が表示されます。 -d オプションを指定することで、ディレクトリの内容ではなくディレクトリ自身の情報を見ることができます

taro@myhostname:~$ ls -ld /root
drwx------ 4 root root 4096  6月 10 11:44 /root
taro@myhostname:~$

このようにアクセス権は確かに不足しています。 管理者ユーザ以外のユーザには何の権限も与えられていません。


では続いて、sudo コマンドで権限昇格しつつ /root を覗いてみましょう。 キーボードから sudo ls -la /root と入力して、Enterキーを押してください。


sudo ls -la /root

 

以下のようにパスワードの入力を促されますので、パスワードを入力してEnterキーを押してください。

taro@myhostname:~$ sudo ls -la /root
[sudo] taro のパスワード:  

以下のように /root の内容が表示されます。

taro@myhostname:~$ sudo ls -la /root
[sudo] taro のパスワード:
合計 28
drwx------  4 root root 4096  6月  4 19:17 .
drwxr-xr-x 19 root root 4096  4月 17 09:43 ..
-rw-------  1 root root  183  6月  4 19:17 .bash_history
-rw-r--r--  1 root root 3106 10月 15  2021 .bashrc
drwx------  3 root root 4096  5月 18 15:40 .cache
-rw-r--r--  1 root root  161  7月  9  2019 .profile
drwx------  3 root root 4096  5月 18 15:59 .synaptic
taro@myhostname:~$

このように、実行したいコマンドの前に sudo を付け足すことで一時的に管理者ユーザと同等の権限を手に入れることができます。 なお、当然ですが sudo コマンドで権限昇格できるのは、

  1. 自分自身のパスワードを入力することでシステム管理作業の権限を持てるユーザ

のみであり、

  1. システム管理作業の権限は持てないユーザ

は、権限昇格することはできません。

では最後に、再び /root を覗いてみましょう。 キーボードから sudo ls -la /root と入力して、Enterキーを押してください。


sudo ls -la /root

 

以下のように /root の内容が表示されます。 パスワードは入力していないのに

taro@myhostname:~$ sudo ls -la /root
合計 28
drwx------  4 root root 4096  6月  4 19:17 .
drwxr-xr-x 19 root root 4096  4月 17 09:43 ..
-rw-------  1 root root  183  6月  4 19:17 .bash_history
-rw-r--r--  1 root root 3106 10月 15  2021 .bashrc
drwx------  3 root root 4096  5月 18 15:40 .cache
-rw-r--r--  1 root root  161  7月  9  2019 .profile
drwx------  3 root root 4096  5月 18 15:59 .synaptic
taro@myhostname:~$

このように、今回はパスワードを入力することなく /root の内容を参照することができました。 理由は、パスワードの入力が免除されたからです

sudo コマンドでは、一度正しいパスワードを入力すると一定時間はパスワードの入力が免除されます(標準設定では免除期間は15分間)。

  
別の端末からの sudo コマンドの実行ではパスワードの入力は免除されません(Linux系OSの種類による)。
  
また、ログインし直した場合にもパスワードの入力は免除されません。

パスワード入力の免除期間の設定場所

パスワード入力の免除期間は、設定ファイル /etc/sudoers の項目 timestamp_timeout で設定することができます。

ただし、Linux Mint / MX Linux のどちらとも、初期状態では /etc/sudoers に timestamp_timeout は存在していません。 新たに項目を追加してください。

  
詳細はマニュアルページ man sudoers で確認することができます。

即座にパスワードの入力免除を無効にする

sudo コマンドに -k オプションを渡して実行することで、パスワードの入力免除を即座に無効にすることもできます。

sudo -k

こうすることで、次回の sudo コマンドの実行時には必ずパスワードの入力が求められます

  

シェルは権限昇格していない

この記事で解説したように sudo コマンドを利用することで管理者ユーザと同等の権限に昇格することができます。

ただし、シェルそのものは権限昇格していません。 そのため、リダイレクトなどで問題が発生することがあります。

実際にやってみましょう。 端末を開いてキーボードから sudo echo 'Hello' > /root/hello.txt と入力して、Enterキーを押してください。


sudo echo 'Hello' > /root/hello.txt

 

以下のように "許可がありません" と怒られます。 なお、怒ってメッセージを表示しているのはシェルです。

taro@myhostname:~$ sudo echo 'Hello' > /root/hello.txt
bash: /root/hello.txt: 許可がありません
taro@myhostname:~$

sudo コマンドによって権限が昇格したのは echo コマンドです。 一方、リダイレクトを行うのはシェルの役目です。

echo コマンドの出力結果を受け取ってファイル /root/hello.txt へ保存しようとしているのはシェルなのです。

シェルは権限昇格していませんので /root にはファイルを書き込むことができず、エラーを表示しています。

困りました、何か対策はないのでしょうか。 大丈夫、対策は2通りが思いつきます


まずは、1つ目のオススメできない方法から解説します。 それは、権限昇格したシェルでずっと作業を行う、という方法です。

では、キーボードから sudo bash と入力して、Enterキーを押してください。


sudo bash

 

以下のようにシェルプロンプトの最後が $ から # に変化します。 また、@(アットマーク)の前も root に変化しています。

taro@myhostname:~$ sudo bash
[sudo] taro のパスワード:
root@myhostname:/home/taro#

つまり、あなたは今、管理者としての権限を手に入れたということです。 どうしてそんなことになったのでしょう。

まず、今あなたの入力を待っているのは端末を開いた時のシェルではありません。 あなたの入力を待っているのは、

sudo bash

によって呼び出された2番目のシェル(bash)です。 この2番目のシェルは sudo コマンドによって実行されていますので権限昇格されています。

権限昇格された2番目のシェルが表示しているプロンプトなので、最後の文字が # に変化した、というわけです。

ではここで、ユーザのアカウント情報を表示してみましょう。 キーボードから id と入力して、Enterキーを押してください。

  
id コマンドは本ウェブサイトでは初登場です。 ユーザのアカウント情報を表示するためのコマンドです。

id

 

以下のようにroot、つまり管理者ユーザになっていることがわかります。

root@myhostname:/home/taro# id
uid=0(root) gid=0(root) groups=0(root)
root@myhostname:/home/taro#

過去の記事でも触れましたが、今どきのLinux系OSでは管理者ユーザ(root)ではログインできないようになっています。 しかし、このようにログイン後に管理者ユーザ(root) に変身する(切り替える)ことはできます

では、/root ディレクトリへのリダイレクトに再挑戦してみましょう。 キーボードから echo 'Hello' > /root/hello.txt と入力して、Enterキーを押してください。


echo 'Hello' > /root/hello.txt

 
  
このシェルは権限昇格していますので sudo を付ける必要はありません。

以下のようにエラーは発生しません。 どうやら書き込みに成功したようです。

root@myhostname:/home/taro# echo 'Hello' > /root/hello.txt
root@myhostname:/home/taro#

では、/root/hello.txt の内容を表示してみましょう。 キーボードから cat /root/hello.txt と入力して、Enterキーを押してください。


cat /root/hello.txt

 

以下のようにファイルにきちんと書き込まれていることがわかります。 目的を達成することができました。

root@myhostname:/home/taro# cat /root/hello.txt
Hello
root@myhostname:/home/taro#

では、/root/hello.txt を削除しましょう、ゴミ掃除です。 キーボードから rm /root/hello.txt と入力して、Enterキーを押してください。


rm /root/hello.txt

 

以下のようにファイルを削除します。

root@myhostname:/home/taro# rm /root/hello.txt
root@myhostname:/home/taro#

では、2番目のシェルを終了して最初のシェルに戻りましょう。 キーボードから exit と入力して、Enterキーを押してください。


exit

 

以下のようにシェルプロンプトの最後が # から $ に戻りました。 また、@(アットマーク)の前も taro に戻っています。

root@myhostname:/home/taro# exit
exit
taro@myhostname:~$

無事、最初の(権限昇格していない)シェルに戻ることができました。

なお、1つ目のこの方法をオススメしないのは、sudo コマンドを付けることなく管理者ユーザの権限で全ての作業を行えるからです。

つまり、誤ってシステムを破損させる危険性があるということです。


続いて紹介する2つ目の方法が "シェルを一時的に権限昇格して呼び出す" というものです。 1つ目の方法のように2番目のシェルを呼び出してそこでずっと作業を行うということはしません。

この2つ目の方法のポイントは "シェルに引数としてコマンドを渡して実行する" というところにあります。 引数としてコマンドを受け取ったシェルはそのコマンドを実行し即座に終了します

ではやってみましょう。 キーボードから sudo bash -c "echo 'Hello' > /root/hello.txt" と入力して、Enterキーを押してください。


sudo bash -c "echo 'Hello' > /root/hello.txt"

 

なお、-c オプションが引数としてコマンドを渡すためのオプションです。 "(二重引用符) で囲まれた部分がコマンドとして bash に渡されます。

以下のようにエラーは発生しません。 /root ディレクトリへのファイルの書き込みに成功したようです。

taro@myhostname:~$ sudo bash -c "echo 'Hello' > /root/hello.txt"
[sudo] taro のパスワード:
taro@myhostname:~$

また、シェルプロンプトの最後が $ のままであることからわかる通り、2番目のシェルはすでに終了しています。 つまり、システムを誤って破損させる状態は脱しています

2番目のシェルは渡されたコマンド "echo 'Hello' > /root/hello.txt" を実行し、すぐに自分自身を終了させたのです。

  
シェルに -c オプションでコマンドを渡すと、コマンド実行後にすぐに終了します。

では、ファイルの中身を一応確認しておきましょう。 キーボードから sudo cat /root/hello.txt と入力して、Enterキーを押してください。


sudo cat /root/hello.txt

 
  
このシェルは権限昇格していませんので sudo を付ける必要があります。

以下のようにファイルにきちんと書き込まれていることがわかります。

taro@myhostname:~$ sudo cat /root/hello.txt
[sudo] taro のパスワード:
Hello
taro@myhostname:~$

無事、2つ目の方法でも書き込むことができました。


以上が "シェルそのものを権限昇格させて作業したい" という場合を想定した2通りの方法でした。

管理者ユーザに切り替える美しい方法

管理者ユーザ(root)に切り替える方法についての補足です。 前出の例では、

sudo bash

と実行することで管理者ユーザである root に切り替えることができました。 ただ、この方法は美しくありません

自然な方法は su コマンドを使うやり方です。

  
su コマンドは本ウェブサイトでは初めて紹介します。 su コマンドは、ログインし直さずに他のユーザに切り替えるためのコマンドです。
  
su コマンドの名前の由来は Switch User / Super User / Substitute User など、いくつかの説があります。

例えば、ユーザ jiro に切り替えるなら、

su - jiro

と実行します。 パスワードの入力を求められるので jiro のパスワードを入力します。 パスワードが正しければ jiro に切り替えることができます。

なお、ユーザIDを省略し

su -

と実行すると、管理者ユーザ(root)に切り替わる、という仕様になっています。

ただし、最近のLinux系OSではこれだけでは管理者ユーザにはなれません。 なぜなら、今どきのLinux系OSでは管理者ユーザ(root)ではログインできないようになっているためです。

なお、管理者ユーザ(root)でログインできないのはパスワードが設定されていないためです。

それなら、管理者ユーザ(root)にパスワードを設定すればいいのでしょうか。 残念ながら、それもオススメはできません

管理者ユーザ(root)にパスワードが設定されていないのは、セキュリティ上の理由だからです。

ではどうすればいいのでしょうか。 大丈夫、方法はあります。 パスワードの入力を回避すればいいのです。 sudo コマンドで権限昇格することで、パスワードを入力することなく su コマンドを成功させることができるのです。

では、美しい方法で管理者ユーザに切り替えてみましょう。 キーボードから sudo su - と入力して、Enterキーを押してください。


sudo su -

 

以下のように管理者ユーザ(root)に切り替えることができました。

taro@myhostname:~$ sudo su -
[sudo] taro のパスワード:
root@myhostname:~#

su コマンドは他のユーザに切り替えるためのコマンドです。 このコマンドで管理者ユーザ(root)に切り替えるのが自然です。

ただし、そもそも管理者ユーザ(root)に切り替えることはオススメできません。 誤ってシステムを破損させる危険性があるためです。

最近のLinux系OSが想定しているのは、1コマンドごとに sudo command のように実行するという手順です。

su コマンドの -(ハイフン) について

前出の su コマンドの例では、

su -

のように -(ハイフン) を su コマンドに渡しました。 この -(ハイフン) は、実際にそのユーザでログインしたかのように振る舞うためのオプションです。

実際にログインしたかのように振る舞うため、ユーザ切り替え時にそのユーザのホームディレクトリに移動します。 また、環境変数もそのユーザの値で初期化されます。

例えば /home/taro にいる状態で su - すると、切り替え後は /root に移動します。

-(ハイフン) を省略して、

su

と実行すると、ユーザ情報だけが管理者ユーザ(root)に切り替わります。 カレントディレクトリも環境変数も変化しません。

  

まとめ

UNIX系OSのユーザは、管理者ユーザと標準ユーザに分かれます。 標準ユーザはさらに2種類に分類することができ、自分自身のパスワードを入力することでシステム管理作業の権限を持てるユーザと持てないユーザがあります。

インストール時に作成されたユーザは、自分自身のパスワードを入力することでシステム管理作業を行えるユーザです。

自分自身のパスワードを入力することでシステム管理作業の権限を持てるユーザであれば、sudo コマンドを使うことでいつでも好きな時に管理者ユーザと同等の権限に昇格することができます。

操作/コマンド 説明
sudo command 管理者ユーザの権限で command コマンドを実行する
sudo -k パスワードの入力免除を即座に無効にする

ただし、シェルは権限昇格しません。 そのため、リダイレクトなどは思い通りの結果にならないこともあります。 その場合には、

sudo bash -c "command argument1 argument2"

のように、シェルを権限昇格させつつコマンドを実行させましょう。

オススメはしませんが、su コマンドで管理者ユーザ(root)に切り替える、という方法もあります。

su コマンドは他のユーザに切り替えるためのコマンドですが、ユーザIDを省略すると管理者ユーザ(root)に切り替わります。

su コマンドに -(ハイフン) を渡すことで、実際にログインしたかのように振る舞わせることもできます。

操作/コマンド 説明
su - 管理者ユーザ(root)に切り替える
※実際にログインしたかのように振る舞う
su 管理者ユーザ(root)に切り替える
su - jiro ユーザ jiro に切り替える
※実際にログインしたかのように振る舞う
su jiro ユーザ jiro に切り替える
メニュー