Linuxで管理者権限でコマンドを実行する方法(sudo, su)

Linuxで管理者権限でコマンドを実行する方法(sudo, su)

Linuxで一般ユーザーがrootユーザーの権限でコマンドを実行する方法としては、sudoを使った方法やsuを使った方法がありますが、両者の違いがよくわからないと感じている方もいらっしゃるでしょう。

そこでここでは、Linuxのsudoとsuコマンドの違いや、suやsudoを使ってrootユーザー(スーパーユーザー)権限でコマンドを実行する方法を紹介します。

suとsudoの違い

suとsudoは、ともに別のユーザーの権限でコマンドを実行したり、rootユーザー(スーパーユーザー)権限でコマンドを実行するときに使用します。

suコマンドではユーザーが切り替わるため、rootユーザーに切り替えると以降の操作はすべてrootユーザーの権限で実行できます。また、rootに切り替える際にrootのパスワードを入力する必要があります。

sudoコマンドは、設定ファイルにあらかじめどのユーザーがどのコマンドをroot権限で実行できるかを設定しておくことで、許可されたコマンドだけをroot権限で実行させることができます。また、rootのパスワードを入力する必要がないため、suより安全性が高いと言われています。

suコマンドの使い方

suコマンドを単独で実行して、rootユーザーのパスワード入力すると、以降は「exit」コマンドを実行して元のユーザーに戻るまで、すべてのコマンドをrootユーザー権限で実行できます。

$ su
パスワード:
# dnf update

また「-c」オプションを使えば、指定したコマンドだけをrootユーザー権限で実行することもできます。

$ su -c "dnf update"
パスワード:

特定のユーザーのみパスワードなしでsuコマンドを実行できるようにしたいときは「/etc/pam.d/su」ファイルの以下の2行のコメントアウトを解除して、wheelグループにユーザーを所属させることで、suでroot への切り替えをパスワードなしで行えるようになります。

# vi /etc/pam.d/su

auth sufficient pam_wheel.so trust use_uid
auth required pam_wheel.so use_uid

wheelグループにユーザーを追加するときは、以下のコマンドを実行します。

# usermod -aG wheel ユーザー

sudoコマンドの使い方

sudoコマンドを使って、特定のユーザーがrootユーザー権限が必要なコマンドを実行できるようにするときは、あらかじめ設定ファイル「/etc/sudoers」に設定しておく必要があります。

まず、以下のコマンドで設定ファイル「/etc/sudoers」を開きます。

# visudo

設定ファイルを開いたら、以下の書式で設定を記述します

ユーザー ホスト名 = (権限) コマンド1,コマンド2,・・・

たとえば、RedHat系のLinuxで特定のユーザーがrootユーザー権限が必要なコマンドを実行できるようにする場合は、sudoersファイルの以下の行のコメントアウトを解除して、対象のユーザーをwheelグループに所属させます。

%wheel ALL=(ALL) ALL

wheelグループにユーザーを追加するときは、以下のコマンドを実行します。

# usermod -aG wheel ユーザー

以上で、sudoコマンドでrootユーザー権限が必要なコマンドを実行できるようになります。なお、sudoコマンド実行時には、自分のパスワードを入力します。

$ sudo dnf update
[sudo] xxxのパスワード:

ちなみに、sudoコマンドでパスワードを入力した場合、デフォルトで5分ほどは認証がキャッシュされる、時間の範囲内であれば再度sudoコマンドを実行してもパスワード入力は省略できます。

もし、sudoの実行をパスワード入力なしで行えるようにしたいときは、sudoersファイルの以下の行のコメントアウトを解除して有効化します。

%wheel ALL=(ALL) NOPASSWD: ALL

これで、wheelグループのユーザーは、sudoコマンド実行時にパスワード入力が不要になります。

リダイレクトやパイプに注意

sudoコマンドは、直後に入力した1つのコマンドに対してのみ有効なため、パイプを使った複数のコマンドの実行や、リダイレクトでファイルに書き出すといった処理が、権限不足で実行できまない場合があります。

たとえば、以下のようなコマンドを実行した場合、リダイレクトによるファイルへの書き込み処理がアクセス拒否で実行できません。

$ sudo grep WARNING /var/log/php.log > /root/php_warn.log
bash: /root/php_warn.log: Permission denied

このようなときは、sudoコマンドでシェルを実行して、シェルのオプションとして実行したい処理を記述することで正常に実行できるようになります。

$ sudo sh -c "grep WARNING /var/log/php.log > /root/php_warn.log"