sudo コマンドの使い方|root 権限の取得と sudoers の設定

コマンドリファレンス

sudosuperuser do の略)は、一時的に管理者(root)権限でコマンドを実行するための Linux コマンドです。
Ubuntu ではデフォルトで root への直接ログインが無効化されており、管理者作業が必要なときは sudo を使うのが標準的な方法です。
パッケージのインストール(sudo apt install)やシステム設定の変更など、権限が必要な操作のほぼすべてに使います。

sudo とは

sudo は「Substitute User DO」または「Superuser DO」の略とされ、自分のパスワードだけで一時的に管理者権限を借りるコマンドです。root ユーザーに切り替えるのではなく、コマンド1回ごとに権限を昇格させる点が特徴で、実行内容はログ(/var/log/auth.log など)に残ります。

  • 権限昇格の単位が細かい: コマンド単位で権限を与えるため、root で常時作業するより誤操作のリスクを抑えられる
  • 認証は自分のパスワード: root のパスワードを共有する必要がなく、sudoers で許可されたユーザー・グループだけが使える
  • 実行記録が残る: 誰が・いつ・何を実行したかが監査できるため、チーム運用や本番環境で標準的に使われる

構文(Syntax)

sudo [OPTIONS] COMMAND [ARGS...]

# 主な使い方
sudo COMMAND              # 管理者権限で COMMAND を実行
sudo -u USER COMMAND      # 指定ユーザーとして COMMAND を実行
sudo -i                   # root のログインシェルを起動(root 環境に入る)
sudo -s                   # root シェルを起動(環境変数は引き継ぐ)
sudo -l                   # 現在のユーザーに許可された sudo コマンドを一覧表示
sudo -k                   # 認証キャッシュを即時クリア(次回から再入力が必要)
sudo -v                   # 認証キャッシュを更新(延長)だけ行い、コマンドは実行しない
sudo -e FILE              # sudoedit と同じ。ファイルを安全に編集する
sudo visudo               # /etc/sudoers を安全に編集

主なオプション一覧

オプション説明使用例
-u USER指定ユーザーとして実行sudo -u www-data cat /var/log/nginx/error.log
-iroot のログインシェルを起動sudo -i
-sroot シェルを起動(現在の環境変数を引き継ぐ)sudo -s
-l許可されたコマンドを一覧表示sudo -l
-k認証キャッシュをクリアsudo -k
-v認証キャッシュを更新(延長)。コマンドは実行しないsudo -v
-eファイルを安全に編集する(sudoedit と同じ)sudo -e /etc/hosts
-n非対話モード(パスワード不要なければ失敗)sudo -n apt update
-E現在のユーザーの環境変数を引き継ぐsudo -E make install
--オプション終端(コマンドに - が含まれる場合)sudo -- mycmd -x

実行例

パッケージのインストール(最もよく使うパターン)

説明: apt install はシステムファイルを変更するため root 権限が必要です。
コマンド:

sudo apt update
sudo apt install curl

ファイルの所有権・パーミッション変更

説明: /etc/ 配下など root 所有のファイルを変更するときに使います。
コマンド:

sudo chmod 644 /etc/nginx/nginx.conf
sudo chown root:root /etc/cron.d/myjob

root シェルに切り替える

説明: 複数の管理者操作を続けて行う場合、都度 sudo を付けるより sudo -i で root 環境に入るほうが効率的です。
コマンド:

sudo -i
# root として操作...
exit   # 一般ユーザーに戻る

自分に許可された sudo コマンドを確認

説明: -l で自分が sudo できるコマンドの一覧を確認できます。
コマンド:

sudo -l

出力例(抜粋):

User ubuntu may run the following commands on this host:
    (ALL : ALL) ALL

sudoedit でファイルを安全に編集する

説明: sudo vi FILE のようにエディタごと権限昇格するのではなく、-esudoedit)は一時コピーを自分の権限で編集してから元の場所へ書き戻す方式です。エディタ自体を root で動かさないため、より安全に設定ファイルを編集できます。
コマンド:

sudo -e /etc/hosts
# または
sudoedit /etc/hosts

sudoers の設定と注意点

/etc/sudoersどのユーザー・グループが sudo を使えるかを定義するファイルです。
Ubuntu では初期ユーザーが sudo グループに自動追加されており、そのグループに対して次のルールが設定されています:

# /etc/sudoers の既定ルール(Ubuntu の場合)
%sudo   ALL=(ALL:ALL) ALL

これは「sudo グループのメンバーは、あらゆるホスト・ユーザーで、あらゆるコマンドを実行できる」という意味です。

sudoers を安全に編集する方法

必ず visudo を使ってください。 直接エディタで開いて編集すると、構文エラーが入ったまま保存されて sudo が完全に使えなくなるリスクがあります。visudo は保存前に構文チェックを実行します。

# sudoers の安全な編集
sudo visudo

# 追加設定は /etc/sudoers.d/ に別ファイルで書く(推奨)
sudo visudo -f /etc/sudoers.d/myconfig

よく使う sudoers の設定例

# ユーザー alice にすべての権限を付与
alice   ALL=(ALL:ALL) ALL

# deploy ユーザーが apt コマンドのみをパスワードなしで実行できる
deploy  ALL=(ALL) NOPASSWD: /usr/bin/apt, /usr/bin/apt-get

# %devops グループに全権限を付与
%devops ALL=(ALL:ALL) ALL

sudoers の重要な注意点

  • /etc/sudoers を直接編集しない: 構文エラーで sudo が使えなくなる。必ず sudo visudo を使うこと。
  • NOPASSWD: ALL の乱用に注意: パスワードなしで何でも実行できる設定はセキュリティリスクが高い。CI/CD 専用ユーザーへの特定コマンド限定など、スコープを絞ること。
  • 追加設定は /etc/sudoers.d/ に分割する: メインファイルを汚さず管理しやすい。sudo visudo -f /etc/sudoers.d/FILENAME で編集する。
  • ユーザーの sudo 権限を確認する: sudo -l -U ユーザー名 で特定ユーザーの権限を確認できる(管理者権限が必要)。
  • ログはシステムログに残る: sudo の実行記録は /var/log/auth.log(Ubuntu)に保存される。不正な sudo 実行(「This incident will be reported」のメッセージ)もここに記録される。

sudo と su の違い

比較項目sudosu
動作1コマンドだけ権限昇格して実行別ユーザー(通常 root)のシェルに切り替える
認証自分のパスワードで認証対象ユーザー(root)のパスワードが必要
ログ実行コマンドがシステムログに記録されるセッション中の操作はほぼ記録されない
Ubuntu のデフォルト初期ユーザーは sudo が使えるroot パスワードが未設定のため使いにくい
推奨度推奨(最小権限の原則に沿っている)必要なときのみ(root 全権限が必要な場合)

よくあるエラーと対処法

sudo グループに未追加のユーザー

sudo apt install nginx

出力例(エラー):

newuser is not in the sudoers file. This incident will be reported.

対処法: 管理者権限を持つユーザーで sudo usermod -aG sudo newuser を実行して sudo グループに追加します。

パスワードを3回間違えた場合

出力例(エラー):

Sorry, try again.
Sorry, try again.
Sorry, try again.
sudo: 3 incorrect password attempts

対処法: sudo はデフォルトで3回まで入力を許可し、失敗するとコマンドを中断します。自分のログインパスワード(root のパスワードではない)を入力しているか確認してください。それでも失敗する場合は、Caps Lock やキーボードレイアウト(IME)の影響も疑ってください。

cron やスクリプトから実行するとエラーになる

出力例(エラー):

sudo: no tty present and no askpass program specified

対処法: cron やCI/CDなど端末(tty)が無い環境からパスワード認証が必要な sudo を実行すると発生します。対象コマンドを sudoers.dNOPASSWD 指定するか、事前に sudo -v でその端末(セッション)の認証キャッシュを作っておく方法があります。

関連コマンド

  • apt / apt-get : Debian/Ubuntu 系パッケージ管理コマンド。sudo apt install PKG のように sudo と組み合わせて使う。
  • su : 別ユーザーのシェルに切り替えるコマンド。su - root で root シェルに入る(root パスワードが必要)。
  • visudo : /etc/sudoers を安全に編集するためのコマンド。構文チェック付き。
  • usermod : ユーザーのグループ追加など属性変更。sudo usermod -aG sudo USERNAME で sudo グループへ追加。
  • id / groups : 現在のユーザーが所属するグループを確認。sudo グループへの追加確認に使う。

関連記事

よくある質問

sudo と su の違いは何ですか?

sudo はコマンド単位で一時的に権限を昇格し、自分のパスワードで認証します。su は別ユーザー(既定は root)のシェルに切り替え、切り替え先ユーザーのパスワードが必要です。詳しくは上記の「sudo と su の違い」の比較表を参照してください。

パスワードなしで sudo を使うにはどうすればいいですか?

sudo visudo/etc/sudoers(または /etc/sudoers.d/ 配下のファイル)に NOPASSWD を指定します。
deploy ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart myapp のように、コマンドを限定して NOPASSWD を設定するのが安全です。NOPASSWD: ALL のように無制限にするのはセキュリティリスクが高いため避けてください。

「is not in the sudoers file」と出たときは?

そのユーザーが sudo グループ(Debian/Ubuntu系)または wheel グループ(RHEL/CentOS系)に入っていません。管理者権限を持つ別ユーザーで sudo usermod -aG sudo ユーザー名 を実行し、対象ユーザーは一度ログアウト・再ログインするとグループ変更が反映されます。

sudo でリダイレクト(>)が効かないのはなぜですか?

sudo echo "text" > /etc/filesudo ではなくシェル自身がリダイレクトを処理するため、書き込み権限は昇格されません。echo "text" | sudo tee /etc/file か、sudo sh -c 'echo "text" > /etc/file' を使ってください。

macOS でも sudo は使えますか?

使えます。macOS は BSD 系のため標準で sudo が搭載されており、基本的なオプション(-i / -s / -l / -k など)は Linux と共通です。ただし /etc/sudoers の初期設定やユーザーグループ名(admin グループなど)は Linux ディストリビューションと異なります。

備考

  • 認証キャッシュ: sudo 認証後、デフォルト15分間はパスワード不要で繰り返し実行できる。sudo -k でキャッシュを手動クリア可能。
  • 環境変数の引き継ぎ: sudo はデフォルトで環境変数をリセットする(安全のため)。sudo -E で引き継ぎ可能。
  • 対話コマンドへの対応: sudo vim /etc/hosts のように対話型コマンドも問題なく動作する。
  • パイプとリダイレクト: sudo echo "text" > /etc/file はシェルがリダイレクトを先に処理するため root 権限が効かない。echo "text" | sudo tee /etc/file を使うか、sudo sh -c 'echo "text" > /etc/file' とする。
  • 対象OS: Linux 全般で利用可能。macOS でも同様に動作する。

参考

  • manページ: man 8 sudo, man 5 sudoers, man 8 visudo
  • Ubuntu 公式ドキュメント: RootSudo ページ(sudo の設定と推奨事項)
Bash玄

はじめまして!Bash玄です。

エンジニアとしてシステム運用に携わる中で、手作業の多さに限界を感じ、Bashスクリプトを活用して業務を効率化したのがきっかけで、この道に入りました。「手作業は負け」「スクリプトはシンプルに」をモットーに、誰でも実践できるBashスクリプトの書き方を発信しています。

このサイトでは、Bashの基礎から実践的なスクリプト作成まで、初心者でもわかりやすく解説しています。少しでも「Bashって便利だな」と思ってもらえたら嬉しいです!

# 好きなこと
- シンプルなコードを書くこと
- コマンドラインを快適にカスタマイズすること
- 自動化で時間を生み出すこと

# このサイトを読んでほしい人
- Bashに興味があるけど、何から始めればいいかわからない人
- 定型業務を自動化したい人
- 効率よくターミナルを使いこなしたい人

Bashの世界に一歩踏み出して、一緒に「Bash道」を極めていきましょう!

Bash玄をフォローする

コメント