sudo – 特権ユーザー(別ユーザー)としてコマンドを実行する

権限昇格・実行制御
スポンサーリンク

sudo は、一時的に権限を昇格させて別ユーザー(既定は root)としてコマンドを実行するためのコマンドです。
パスワード確認や実行履歴の記録、権限の細かな制御を sudoers 設定で行えます。
実務では、設定ファイルの編集やサービスの再起動など、管理権限が必要な操作を安全に実行する際に使います。

構文(Syntax)

sudo [OPTION...] COMMAND [ARG...]
sudo -u USER [OPTION...] COMMAND [ARG...]
sudo -g GROUP [OPTION...] COMMAND [ARG...]

# シェルを起動
sudo -i               # 対象ユーザーの「ログインシェル」環境で起動
sudo -s               # シェルを起動(SHELL 変数優先、なければ /bin/sh)

# 編集モード(sudoedit)
sudo -e FILE...       # 環境変数 VISUAL/EDITOR を使って安全に編集

# 権限や認証の確認・管理
sudo -l [COMMAND]     # 自分に許可された操作の一覧
sudo -v               # 認証キャッシュを延長
sudo -k | -K          # 認証キャッシュを失効(-K は完全削除)

主なオプション一覧

オプション説明使用例
-u USER実行ユーザーを指定(既定は rootsudo -u www-data whoami
-g GROUP実行グループを指定(sudoers で許可されている場合)sudo -g nginx id
-i対象ユーザーのログインシェルで起動(環境も切替)sudo -i
-sシェルを起動(最小限の環境で)sudo -s
-esudoedit モードでファイルを安全に編集sudo -e /etc/hosts
-l許可されたコマンドを表示sudo -l
-v認証の有効期限を延長(パスワード入力を求められることあり)sudo -v
-k / -K認証キャッシュを失効 / 完全削除sudo -k
-E環境変数を保持(sudoers の env_keep 設定が必要)sudo -E mycmd
-HHOME を対象ユーザーのものに設定sudo -H pip install ...
-bバックグラウンドで実行sudo -b long-task
-n非対話(パスワード要求が出たら即失敗)sudo -n systemctl status
-Aaskpass プログラム経由でパスワード取得sudo -A cmd
-p PROMPTパスワードプロンプトを変更sudo -p 'Password: ' cmd
-S標準入力からパスワードを読む(スクリプト用、要注意)`echo pass
-C NUMclosefrom() の下限 FD を指定(高度な用途)sudo -C 3 cmd
--, -h, -V引数終端 / ヘルプ / バージョン表示sudo -V

重要: 実際に使えるオプションはバージョンやディストリによって差異があります。man sudo を参照してください。

実行例

基本:root 権限でコマンドを 1 回だけ実行

説明: 現在のユーザーと、root での id を比較します。
コマンド:

id
sudo id

出力例(例):

uid=1000(user) gid=1000(user) groups=1000(user)
uid=0(root) gid=0(root) groups=0(root)

別ユーザーとして実行(-u)

説明: Web サービス用ユーザー www-data として whoami を実行します。
コマンド:

sudo -u www-data whoami

出力例(例):

www-data

管理作業:安全に設定ファイルを編集(sudoedit / -e)

説明: 直接 vim /etc/hosts ではなく、sudoedit を使うと権限分離で安全です。
コマンド:

sudo -e /etc/hosts

出力例:

# エディタが起動し、保存すると安全に反映されます

権限の確認(-l)

説明: 自分に許可されているコマンドを一覧表示します。
コマンド:

sudo -l

出力例(例):

User user may run the following commands on host:
    (root) NOPASSWD: /usr/bin/systemctl restart nginx

エラー例:sudoers に未登録

説明: sudo 権限がないユーザーが実行するとエラーになります。
コマンド:

sudo ls /root

出力例(例):

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

関連コマンド

  • su : 別ユーザーのシェルに切り替える(パスワードが必要)。
  • visudo : /etc/sudoers を安全に編集(構文チェック付き)。
  • sudoedit : 権限分離でファイルを編集するためのフロントエンド(sudo -e と同等)。
  • pkexec : polkit 経由で権限昇格(ディストリによって無効化/推奨されない場合あり)。
  • doas : OpenBSD 由来の軽量代替。Linux 用パッケージも存在。

備考

  • 設定ファイル: sudo の権限は /etc/sudoers/etc/sudoers.d/ で管理します。必ず visudo を使って編集し、直接編集は避けます。代表的な記述例:user ALL=(root) /usr/bin/systemctl
  • パスワードとキャッシュ: 成功後は一定時間(timestamp_timeout)は再入力不要です。sudo -k で失効、sudo -v で延長できます。端末ごとに管理する tty_tickets 設定もあります。
  • 環境変数と PATH: 既定では環境はリセットされます(env_reset)。PATH は secure_path に上書きされることがあります。必要な変数を保持したい場合は -Eenv_keep を併用。
  • スクリプトでの利用: 対話不要で失敗させたい場合は -n を使います。スクリプト中で都度 sudo を付けるより、最初に root で実行するほうが安全なことが多いです([ $(id -u) -eq 0 ] || { echo "Run as root"; exit 1; } など)。
  • 監査: 実行コマンドはログに記録されます(/var/log/auth.log など、環境により異なる)。sudoerslog_input/log_output で I/O ログを有効化できる実装もあります。
  • 互換性: 最小コンテナには sudo が入っていない場合があるため、必要なら su や root での実行に切り替えるか、パッケージを導入してください。
  • セキュリティ注意: NOPASSWD は利便性が高い反面、リスクも増します。コマンド単位で絞る・Cmnd_Alias を活用するなど、最小権限を徹底してください。

参考

スポンサーリンク
Bash玄

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

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

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

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

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

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

Bash玄をフォローする

コメント