はじめに

こんにちは!今回はsudoコマンドについて解説します。

sudoは「Super User DO」の略で、一時的に管理者権限でコマンドを実行するためのコマンドです。システム設定の変更、ソフトウェアのインストール、重要なファイルの編集など、特権が必要な操作を行う際に使います。

Linuxを使っていると「Permission denied」ってエラーに遭遇すること、めっちゃありますよね。そんな時にsudoの出番です!

sudoコマンドとは

sudoは、一般ユーザーが一時的にroot権限(管理者権限)を取得してコマンドを実行するための外部コマンドです。

直接rootユーザーでログインするよりも安全で、どのユーザーがいつ何を実行したかログに記録されるため、セキュリティと監査の面で優れています。また、必要な時だけ権限を昇格させるので、誤操作のリスクも減らせます。

基本構文

1
sudo [オプション] コマンド

初回実行時、またはタイムアウト後には、ユーザーのパスワード入力が求められます(rootのパスワードではありません)。

主なオプション

オプション 説明
-u ユーザー名 指定したユーザーとしてコマンドを実行
-i rootユーザーとしてログインシェルを起動
-s rootユーザーとしてシェルを起動
-l 現在のユーザーが実行可能なコマンドを表示
-k 認証キャッシュをクリア(次回パスワード入力必須)
-v 認証の有効期限を延長
-b バックグラウンドでコマンドを実行
-E 環境変数を保持したまま実行

使用例

例1: 基本的な使い方

1
sudo apt update

実行結果:

1
2
3
4
[sudo] password for user:
Hit:1 http://archive.ubuntu.com/ubuntu jammy InRelease
Get:2 http://archive.ubuntu.com/ubuntu jammy-updates InRelease [119 kB]
...

パッケージリストの更新には管理者権限が必要なので、sudoを付けて実行します。初回はパスワードを聞かれます。

例2: ファイルの編集

1
sudo nano /etc/hosts

実行結果:

1
(nanoエディタが起動し、/etc/hostsファイルを編集できる)

システムファイルの編集には管理者権限が必要です。sudoを付けることで編集できるようになります。

例3: 別のユーザーとしてコマンドを実行

1
sudo -u postgres psql

実行結果:

1
2
3
4
psql (14.5)
Type "help" for help.

postgres=#

-uオプションで、postgresユーザーとしてpsqlコマンドを実行します。

例4: rootシェルを起動

1
sudo -i

実行結果:

1
root@hostname:~#

rootユーザーとしてログインシェルが起動します。複数のコマンドを連続して実行する時に便利です。

例5: 実行可能なコマンドを確認

1
sudo -l

実行結果:

1
2
User user may run the following commands on hostname:
    (ALL : ALL) ALL

現在のユーザーがsudoで実行できるコマンドを一覧表示します。

例6: 認証キャッシュをクリア

1
sudo -k

実行結果:

1
(何も表示されない)

次回sudo実行時に必ずパスワード入力が必要になります。セキュリティ上、席を離れる前に実行すると安全です。

例7: 環境変数を保持して実行

1
sudo -E env | grep HOME

実行結果:

1
HOME=/home/user

通常、sudoは環境変数をリセットしますが、-Eオプションで現在の環境変数を保持できます。

例8: パイプと組み合わせる

1
echo "127.0.0.1 example.local" | sudo tee -a /etc/hosts

実行結果:

1
127.0.0.1 example.local

パイプの後ろのコマンドだけにsudoを適用する例です。teeコマンドを使うことで、標準出力とファイル書き込みの両方を行えます。

例9: 複数のコマンドを実行

1
sudo sh -c 'apt update && apt upgrade -y'

実行結果:

1
2
3
4
5
Hit:1 http://archive.ubuntu.com/ubuntu jammy InRelease
...
Reading package lists... Done
Building dependency tree... Done
...

sh -cを使うことで、複数のコマンドをまとめて管理者権限で実行できます。

例10: コマンドの出力をリダイレクト

1
sudo ls -la /root > root-listing.txt

実行結果:

1
(root-listing.txtに/rootディレクトリの内容が保存される)

rootディレクトリの内容を一般ユーザーのファイルに保存します。

Tips・注意点

パスワードのキャッシュ

sudoは一度パスワードを入力すると、デフォルトで15分間はパスワード入力なしで実行できます。

1
2
3
sudo apt update
# 15分以内なら次のコマンドはパスワード不要
sudo apt upgrade

セキュリティ上、長時間席を離れる場合はsudo -kでキャッシュをクリアしましょう。

sudoers ファイルの編集

sudoの設定は/etc/sudoersファイルで管理されていますが、直接編集してはいけません

1
2
# 正しい方法
sudo visudo

visudoコマンドを使うと、保存時に文法チェックが行われるので安全です。

sudo su との違い

1
2
3
4
5
# rootユーザーに切り替え(非推奨)
sudo su

# rootシェルを起動(推奨)
sudo -i

sudo suよりsudo -iの方が、環境変数が適切に設定されるのでおすすめです。

リダイレクトの注意点

1
2
3
4
5
6
7
8
# これはエラーになる
sudo echo "test" > /etc/test.conf

# 正しい方法1
echo "test" | sudo tee /etc/test.conf

# 正しい方法2
sudo sh -c 'echo "test" > /etc/test.conf'

リダイレクト(>)はsudoの前に評価されるため、sudoが効きません。teeコマンドやsh -cを使いましょう。

パスワードなしで実行する設定

特定のコマンドをパスワードなしで実行するには、visudoで設定します。

1
2
3
4
sudo visudo

# 以下を追加
user ALL=(ALL) NOPASSWD: /usr/bin/apt update

ただし、セキュリティリスクがあるので慎重に!

実践的な使い方

システムアップデート

1
sudo apt update && sudo apt upgrade -y

UbuntuやDebianでパッケージを最新に更新します。

サービスの管理

1
sudo systemctl restart nginx

Nginxサービスを再起動します。サービス管理には管理者権限が必要です。

ファイルの所有者変更

1
sudo chown user:user /var/www/html/index.html

Webサーバーのファイル所有者を変更します。

ログファイルの閲覧

1
sudo tail -f /var/log/syslog

システムログをリアルタイムで監視します。ログファイルは通常rootしか読めません。

ディスク使用量の確認

1
sudo du -sh /var/*

/varディレクトリ内の各ディレクトリのサイズを確認します。

パッケージのインストール

1
sudo apt install nginx

新しいソフトウェアをインストールします。

ネットワーク設定の変更

1
sudo ip addr add 192.168.1.10/24 dev eth0

ネットワークインターフェースにIPアドレスを追加します。

ファイルのパーミッション変更

1
sudo chmod 644 /etc/config.conf

設定ファイルのパーミッションを変更します。

まとめ

sudoコマンドのポイント:

  • 一時的に管理者権限でコマンドを実行できる
  • -u: 指定したユーザーとして実行
  • -i: rootシェルを起動
  • -l: 実行可能なコマンドを確認
  • -k: 認証キャッシュをクリア
  • -E: 環境変数を保持
  • リダイレクトにはteesh -cを使う
  • 設定変更はvisudoで安全に
  • よく使う組み合わせ: sudo -i, sudo -u

sudoは強力なコマンドなので、何をしているか理解した上で使いましょう。「とりあえずsudo付ければ動く」じゃなくて、「なぜsudoが必要なのか」を考えるクセをつけると、Linuxの権限システムへの理解が深まりますよ!