- Linux
Linuxのsuとsudoの違い|su -・sudo -i・-sの比較表
su は「別のユーザーに切り替える」コマンドで切り替え先のパスワードを使い、sudo は「許可された人が、別のユーザーの権限でコマンドを実行する」コマンドで自分のパスワードを使います。 どちらも root の権限で作業するために使われますが、パスワードの持ち方、環境変数、ログの残り方が異なります。
この記事では、su、su -、sudo コマンド、sudo -s、sudo -i、sudo su - の6通りを、Ubuntu 24.04.4 LTS(sudo 1.9.15p5、util-linux 2.39.3 の su)で実行した結果をもとに比べます。ユーザー名とホームディレクトリの表示は、検証用のユーザー名を taro(操作する人)と hanako(切り替え先の一般ユーザー)に置き換えています。RHEL系での動作など、手元で動かせなかった部分は「未実行」と明記しています。
su と sudo の比較早見表
| コマンド | 入力するパスワード | 実行後の whoami | 実行後の pwd | HOME | 環境変数 | ログインシェル | 向いている場面 |
|---|---|---|---|---|---|---|---|
su |
切り替え先(root) | root | 元のまま | 切り替え先 | ほぼ引き継ぐ | いいえ | root のパスワードを知っている環境で手早く切り替える |
su - |
切り替え先(root) | root | 切り替え先のホーム | 切り替え先 | 作り直す | はい | root としてログインし直した状態にする |
sudo コマンド |
自分 | root(その1回だけ) | 元のまま | /root | 必要なものだけ残す | ― | 日常の基本。1コマンドずつ実行 |
sudo -s |
自分 | root | 元のまま | /root | 必要なものだけ残す | いいえ | 今いるディレクトリで root の作業を続ける |
sudo -i |
自分 | root | /root | /root | 作り直す | はい | root として続けて作業する |
sudo su - |
自分 | root | /root | /root | 作り直す | はい | sudo -i とほぼ同じ結果(SUDO_USER は消える) |
結論を先に書くと、普段は sudo コマンド、root のまま続けて作業したいときは sudo -i を使えば足ります。 以降で、この表の各マスを実行結果で確かめていきます。
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「Linuxのsuとsudoの違い|su -・sudo -i・-sの比較表」
su と sudo の仕組みの違い
flowchart LR
U["taro(一般ユーザー)"]
subgraph S1["su"]
A1["root のパスワードを入力"] --> A2["root のシェルが起動"]
end
subgraph S2["sudo"]
B1["自分のパスワードを入力"] --> B2["sudoers で許可を確認"] --> B3["コマンドを root で実行<br>記録を残す"]
end
U --> S1
U --> S2
| 項目 | su | sudo |
|---|---|---|
| 名前の意味 | substitute user(ユーザーを替える) | substitute user do(別のユーザーとして実行) |
| 認証に使うもの | 切り替え先のユーザーのパスワード | 実行する人自身のパスワード |
| だれが使えるか | パスワードを知っている人 | sudoers で許可された人 |
| 許可の細かさ | 切り替えるか、切り替えないか | ユーザー・グループ・コマンド単位で設定できる |
| 記録 | 切り替えたことが残る | だれが、どのコマンドを実行したかが残る |
| パスワードの再入力 | 毎回 | 一定時間(既定は5分)は省略 |
| 設定ファイル | /etc/pam.d/su、/etc/login.defs |
/etc/sudoers、/etc/sudoers.d/ |
su は root のパスワードを使う人全員で共有することになります。sudo なら各自が自分のパスワードで操作でき、だれが何を実行したかも記録に残るため、複数人で管理するサーバーでは sudo が基本になっています。
6通りを実行結果で比べる
検証の準備
一般ユーザー taro でログインし、ホーム以外のディレクトリに移動して、目印の環境変数を1つ設定しておきます。
cd /tmp/work
export MYVAR=hello
whoami; pwd; echo $HOME
echo $PATH
実行結果(表示は環境に合わせて置き換えています。以下同じ):
taro
/tmp/work
/home/taro
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
各コマンドのあとで、ユーザー・カレントディレクトリ・HOME・PATH・MYVAR・SUDO_USER・ログインシェルかどうか(shopt -q login_shell)を表示して比べました。
su(ハイフンなし)
su はユーザー名を省略すると root に切り替えます。Ubuntu は初期状態で root のパスワードが設定されていないため、su で root になろうとすると認証エラーになります。
su
実行結果:
Password:
su: Authentication failure
そこで、su の環境の扱いは、パスワードを設定した一般ユーザー hanako への切り替えで確かめました(root を切り替え先にした su は未実行です)。
su hanako
whoami; pwd; echo $HOME; echo $MYVAR
hanako
/tmp/work
/home/hanako
hello
ユーザーと HOME は切り替わりますが、カレントディレクトリと自分で設定した環境変数(MYVAR)はそのまま残ります。 ログインシェルではないので、~/.profile は読まれません。
su -(ハイフンあり)
su - hanako
whoami; pwd; echo $HOME; echo $MYVAR
実行結果(~/.profile に目印の echo を入れてあります):
[.profile read]
hanako
/home/hanako
/home/hanako
su - は切り替え先のユーザーとしてログインし直した状態を作ります。 カレントディレクトリは切り替え先のホームになり、MYVAR は消え、~/.profile が読み込まれました。PATH も /etc/profile や ~/.profile の内容で作り直されます。su -、su -l、su --login は同じ意味です。
sudo コマンド
sudo whoami
sudo pwd
sudo sh -c 'echo $HOME'
sudo echo $HOME
実行結果:
[sudo] password for taro:
root
/tmp/work
/root
/home/taro
入力するのは taro 自身のパスワードです。 カレントディレクトリは元のまま、HOME は /root になりました。4行目が /home/taro になっているのは、$HOME が sudo に渡る前に taro のシェルで展開されるためです。root 側の値を見たいときは、3行目のように sh -c '...' の中に書きます。
環境変数は次のようになりました。
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin
SUDO_USER=taro MYVAR=
PATH は sudoers の secure_path に置き換わり、MYVAR は取り除かれ、SUDO_USER に元のユーザー名が入ります。
sudo -s
sudo -s
whoami; pwd; echo $HOME
root
/tmp/work
/root
sudo -s は root のシェルを起動します。カレントディレクトリは元のままで、ログインシェルではありません(login_shell は off、SUDO_USER=taro)。今いるディレクトリでそのまま root の作業を続けたいときに向いています。
sudo -i
sudo -i
whoami; pwd; echo $HOME
root
/root
/root
sudo -i は root のログインシェルを起動します。カレントディレクトリは /root になり、ログインシェルとして /etc/profile や root の ~/.profile が読まれます(login_shell は on、起動名は -bash)。PATH も root のログイン用の設定で作り直されました。SUDO_USER=taro は残るので、だれが root になったのかを後から確認できます。
sudo su と sudo su -
sudo su -
whoami; pwd; echo $HOME; echo "SUDO_USER=$SUDO_USER"
root
/root
/root
SUDO_USER=
sudo su - は「sudo で root になってから、su で root としてログインし直す」という2段階の動作です。結果は sudo -i とほぼ同じですが、su - が環境を作り直すため SUDO_USER が消えました。ハイフンなしの sudo su では、カレントディレクトリは /tmp/work のまま、SUDO_USER=taro も残りました。
実行結果のまとめ表
| コマンド | whoami | pwd | HOME | PATH | MYVAR | SUDO_USER | ログインシェル |
|---|---|---|---|---|---|---|---|
| (実行前) | taro | /tmp/work | /home/taro | 自分のPATH | hello | (空) | ― |
su hanako |
hanako | /tmp/work | /home/hanako | 元と同じ値 | hello | (空) | いいえ |
su - hanako |
hanako | /home/hanako | /home/hanako | ログイン用に作り直し | (空) | (空) | はい |
sudo コマンド |
root | /tmp/work | /root | secure_path | (空) | taro | ― |
sudo -s |
root | /tmp/work | /root | secure_path | (空) | taro | いいえ |
sudo -i |
root | /root | /root | ログイン用に作り直し | (空) | taro | はい |
sudo su |
root | /tmp/work | /root | /etc/environment の値 | (空) | taro | いいえ |
sudo su - |
root | /root | /root | ログイン用に作り直し | (空) | (空) | はい |
Ubuntu 24.04 の su は、PAM(認証の仕組み)の設定で /etc/environment を読むため、sudo su のPATHには /usr/games などが含まれていました。PATH の中身はディストリビューションや設定で変わるので、手元では echo $PATH で確かめるのが確実です。
読み込む設定ファイルの違い
シェルがログインシェルとして起動するかどうかで、読み込まれるファイルが変わります(bash の場合)。
| 起動のしかた | 該当するコマンド | 読み込むファイル |
|---|---|---|
| ログインシェル | su -、sudo -i、sudo su - |
/etc/profile → ~/.bash_profile、~/.bash_login、~/.profile のうち最初に見つかった1つ(Ubuntu の ~/.profile は ~/.bashrc も読む) |
| ログインシェルではない対話シェル | su、sudo -s、sudo su |
/etc/bash.bashrc(Debian/Ubuntu)と ~/.bashrc |
| シェルを起動しない | sudo コマンド |
読まない(コマンドを直接実行) |
今回は、su - hanako と sudo -u hanako -i で ~/.profile に入れた目印が表示されること、su hanako では表示されないことを確かめました。「root でログインしたときと同じ PATH やエイリアスで作業したい」ときは、ログインシェルになる sudo -i か su - を選びます。
sudo でよく使うオプション
| コマンド | 意味 | 確認 |
|---|---|---|
sudo コマンド |
root としてコマンドを1つ実行 | 実行結果あり |
sudo -u hanako コマンド |
指定したユーザーとして実行 | 実行結果あり(-i と併用) |
sudo -i |
root のログインシェルを起動 | 実行結果あり |
sudo -s |
root のシェルを起動(ログインシェルではない) | 実行結果あり |
sudo -u hanako -i |
hanako としてログインし直した状態にする | 実行結果あり |
sudo -l |
自分に許可されている内容を表示 | 実行結果あり |
sudo -v |
パスワード入力の有効時間を延長 | 実行結果あり |
sudo -k |
有効時間を取り消し、次回はパスワードを聞く | 実行結果あり |
sudo -n コマンド |
パスワードを聞かずに実行(必要ならエラー) | 実行結果あり |
sudo -E コマンド |
自分の環境変数を引き継ぐ(許可されている場合) | 実行結果あり |
sudo !! |
直前のコマンドを sudo 付きでやり直す(bash の履歴機能) | 未実行 |
sudoedit ファイル |
自分のエディタで安全に編集する | 未実行 |
sudo -l で許可内容を確認する
sudo -l
実行結果(sudo グループに入っている taro の場合):
Matching Defaults entries for taro on vm:
env_reset, mail_badpass,
secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin,
use_pty
User taro may run the following commands on vm:
(ALL : ALL) ALL
(ALL : ALL) ALL は「どのユーザー・グループとしても、すべてのコマンドを実行できる」という意味です。vm は検証環境のホスト名です。
パスワードの有効時間(-v、-k、-n)
sudo -v # 認証して有効時間を更新
sudo -n true; echo "exit=$?"
sudo -k # 有効時間を取り消す
sudo -n true; echo "after -k exit=$?"
実行結果:
exit=0
sudo: a password is required
after -k exit=1
一度認証すると、しばらくはパスワードなしで sudo を実行できます。席を離れる前に sudo -k を実行しておくと、次の sudo で再びパスワードが求められます。
環境変数を引き継ぐ(-E)
sudo -s では MYVAR が空になりましたが、sudo -E -s では MYVAR=hello が残ることを確かめました。プロキシの設定など、自分の環境変数を root 側でも使いたいときに使います。
リダイレクトは sudo の外で処理される
sudo echo x > /etc/test.conf
実行結果:
bash: /etc/test.conf: Permission denied
> によるファイルへの書き込みは、sudo ではなく taro のシェルが行うため、権限が足りずに止まります。root でファイルに書き込むときは tee を sudo で動かします。
echo x | sudo tee /tmp/work/root_owned >/dev/null
ls -l /tmp/work/root_owned
-rw-r--r-- 1 root root 2 Oct 3 08:25 /tmp/work/root_owned
別のユーザーとして実行する(sudo -u と su -c)
su も sudo も、切り替え先は root に限りません。アプリケーション用のユーザーとして操作したいときにも使えます。
sudo -u hanako whoami
sudo -u hanako sh -c 'echo $HOME; pwd'
sudo -u hanako -g hanako id
実行結果:
hanako
/home/hanako
/tmp/work
uid=1002(hanako) gid=1003(hanako) groups=1003(hanako)
sudo -u は自分のパスワードで実行できるので、切り替え先のユーザーにパスワードを設定しておく必要がありません。 ログインできない設定のサービス用ユーザーを扱うときに便利です。su でコマンドを1つだけ実行したいときは -c を使います。
su - hanako -c 'whoami; pwd'
Password:
[.profile read]
hanako
/home/hanako
| やりたいこと | sudo での書き方 | su での書き方 |
|---|---|---|
| 別のユーザーでコマンドを1つ実行 | sudo -u hanako コマンド |
su hanako -c 'コマンド' |
| 別のユーザーのログイン環境でコマンドを1つ実行 | sudo -u hanako -i コマンド |
su - hanako -c 'コマンド' |
| 別のユーザーのシェルに入る | sudo -u hanako -i |
su - hanako |
| 入力するパスワード | 自分 | hanako(root から実行するときは不要) |
root から su を実行するときにパスワードを聞かれないのは、/etc/pam.d/su の auth sufficient pam_rootok.so という行によるものです(Ubuntu 24.04 で確認)。同じファイルには pam_wheel.so を使って su を実行できる人を特定のグループに絞る設定がコメントの形で用意されています(有効化は未実行)。
sudo が設定する環境変数
sudo で実行したコマンドからは、元のユーザーの情報を環境変数で参照できます。
sudo env | grep -E '^(SUDO_|HOME|USER|LOGNAME|SHELL|MAIL)' | sort
実行結果(UIDとGIDは環境により異なります):
HOME=/root
LOGNAME=root
MAIL=/var/mail/root
SHELL=/bin/bash
SUDO_COMMAND=/usr/bin/env
SUDO_GID=1002
SUDO_UID=1001
SUDO_USER=taro
USER=root
スクリプトの中で「sudo を付けて実行した人」を知りたいときは $SUDO_USER を使います。特定の変数だけを引き継ぎたいときは sudo --preserve-env=MYVAR コマンド と書けます(MYVAR=hello が渡ることを確認しました)。
su と sudo が root の権限で動ける理由
ls -l /usr/bin/sudo /usr/bin/su
-rwsr-xr-x 1 root root 55680 Aug 20 01:47 /usr/bin/su
-rwsr-xr-x 1 root root 277936 Mar 2 2026 /usr/bin/sudo
権限の rws の s は setuid という印で、だれが実行しても、所有者である root の権限で動くことを表します。su と sudo はこの仕組みで起動し、パスワードや sudoers を確認したうえで、許可された操作だけを実行します。
つまずきやすい表示と対処
| 表示 | 理由 | 対処 | 確認 |
|---|---|---|---|
su: Authentication failure |
切り替え先のパスワードが違う、または未設定(Ubuntu の root) | sudo -i を使う |
実行結果あり |
taro is not in the sudoers file. |
sudo の許可がない | sudo / wheel グループに追加 | 実行結果あり |
Sorry, try again. |
自分のパスワードの入力違い | もう一度入力する | 実行結果あり |
sudo: a terminal is required to read the password |
端末のない場所(スクリプトなど)でパスワードが必要になった | 必要なコマンドだけ NOPASSWD: にする、または端末から実行する |
実行結果あり |
sudo: a password is required |
-n を付けたがパスワードが必要 |
先に sudo -v で認証する |
実行結果あり |
sudo: cd: command not found |
cd はシェルの組み込みコマンド |
sudo -i や sudo -s でシェルに入る、または sudo ls ディレクトリ で中を見る |
実行結果あり |
Permission denied(sudo echo x > ファイル) |
リダイレクトは自分のシェルが処理する | sudo tee を使う |
実行結果あり |
sudo: unknown user ... |
-u に指定したユーザーがいない |
id ユーザー名 で確かめる |
実行結果あり |
sudo: command not found |
最小構成の環境に sudo が入っていない | root で apt install sudo や dnf install sudo |
未実行 |
sudo cd /root を実行したときの表示は次のとおりで、sudo 自身が代わりの方法を案内してくれます。
sudo: cd: command not found
sudo: "cd" is a shell built-in command, it cannot be run directly.
sudo: the -s option may be used to run a privileged shell.
sudo: the -D option may be used to run a command in a specific directory.
端末のない場所から sudo を実行したときは、次の表示になりました。
sudo: a terminal is required to read the password; either use the -S option to read from standard input or configure an askpass helper
sudo: a password is required
定期実行のスクリプトで sudo が必要になったときは、スクリプト全体を root で動かすか、必要なコマンドだけを NOPASSWD: で許可する形にすると、パスワードをスクリプトに書かずに済みます。
Ubuntu系とRHEL系の違い
| 項目 | Ubuntu系(Ubuntu、Debianの一部設定) | RHEL系(RHEL、Rocky Linux、AlmaLinux など) |
|---|---|---|
| root のパスワード | 初期状態では未設定(root で直接ログインしない前提) | インストール時に設定するかを選ぶ |
su で root になる |
初期状態では認証エラーになる(実行結果あり) | root のパスワードを設定していれば可能(未実行) |
| sudo を使えるグループ | sudo グループ |
wheel グループ |
| sudoers の該当行 | %sudo ALL=(ALL:ALL) ALL |
%wheel ALL=(ALL) ALL |
| グループへの追加 | usermod -aG sudo ユーザー名 |
usermod -aG wheel ユーザー名 |
| 認証の記録先 | /var/log/auth.log |
/var/log/secure |
Ubuntu 24.04 の /etc/sudoers から、コメントを除いた有効な行は次のとおりでした(実行結果)。
Defaults env_reset
Defaults mail_badpass
Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin"
Defaults use_pty
root ALL=(ALL:ALL) ALL
%admin ALL=(ALL) ALL
%sudo ALL=(ALL:ALL) ALL
@includedir /etc/sudoers.d
| 行 | 意味 |
|---|---|
Defaults env_reset |
環境変数を必要なものだけに絞る(MYVAR が消えた理由) |
Defaults secure_path=... |
sudo で実行するコマンドの PATH を固定する |
root ALL=(ALL:ALL) ALL |
root はすべて実行できる |
%sudo ALL=(ALL:ALL) ALL |
% はグループ。sudo グループの人はすべて実行できる |
@includedir /etc/sudoers.d |
このディレクトリのファイルも設定として読む |
RHEL系の表の内容と wheel グループの行は、一般に知られた既定の設定をもとにしており、今回は未実行です。
「sudoersファイル内にありません」を再現して直す
エラーを再現する
sudo グループに入っていないユーザーで sudo を実行すると、次の表示になります。
sudo whoami
実行結果:
[sudo] password for taro:
taro is not in the sudoers file.
日本語の表示にしている環境では「taro は sudoers ファイル内にありません。」という文になります(日本語メッセージは今回の環境では表示できず、未実行です)。このとき sudo -l も次のように表示されました。
Sorry, user taro may not run sudo on vm.
パスワードは合っているが、sudo を使う許可がないという状態です。パスワードが違う場合は別の表示になります。
[sudo] password for taro:
Sorry, try again.
直し方1:グループに追加する(おすすめ)
sudo を使える別のユーザー(または root)で、対象のユーザーを sudo グループに追加します。
# Ubuntu系
sudo usermod -aG sudo taro
# RHEL系(未実行)
sudo usermod -aG wheel taro
id taro
実行結果(Ubuntu 24.04、ユーザーIDなどの数字は環境により異なります):
uid=1001(taro) gid=1002(taro) groups=1002(taro),27(sudo)
グループの変更は次のログインから有効になります。taro でログインし直してから確かめると、root として実行できました。
sudo whoami
root
-aG の -a を付け忘れると、ほかの所属グループが外れてしまうので、必ず -aG の形で書きます。グループから外したときに再び taro is not in the sudoers file. に戻ることも確かめました。
直し方2:visudo で設定を追加する
特定のコマンドだけを許可したいときは、sudoers に設定を書きます。sudoers は必ず visudo で編集します。 visudo は保存時に文法を確認してくれるため、書き間違いで sudo が使えなくなる状況を防げます。
sudo visudo # /etc/sudoers を編集
sudo visudo -f /etc/sudoers.d/taro # 個別のファイルに分けて書く(おすすめ)
書き方は「だれが どのホストで=(だれとして) 何を」の順です。
taro ALL=(ALL) ALL
%devs ALL=(root) NOPASSWD: /usr/bin/systemctl restart nginx
1行目は taro にすべてのコマンドを許可、2行目は devs グループに「nginx の再起動だけをパスワードなしで」許可する例です。
今回の検証環境では共有の設定ファイルを書き換えられないため、/etc/sudoers の編集そのものは未実行です。代わりに、visudo の文法チェック機能(-c)を、作業用ディレクトリに置いたファイルに対して実行しました。
visudo -c
visudo -cf /tmp/ok.sudoers # 上の2行を書いたファイル
visudo -cf /tmp/ng.sudoers # かっこを閉じ忘れたファイル
実行結果:
/etc/sudoers: parsed OK
/etc/sudoers.d/README: parsed OK
/tmp/ok.sudoers: parsed OK
/tmp/ng.sudoers:1:15: syntax error
taro ALL=(ALL ALL
^~~
文法の誤りは行番号と位置つきで教えてくれます。 /etc/sudoers.d/ にファイルを置く前に visudo -cf ファイル で確認する習慣を付けると安心です。なお、/etc/sudoers の権限は -r--r-----(root だけが読める)でした。
管理者がだれもいないとき
sudo を使えるユーザーが1人もいない場合は、root として操作できる別の手段が必要です。RHEL系で root のパスワードがわかるなら su - で root になってから usermod -aG wheel taro を実行します。クラウドの仮想マシンでは初期ユーザーに sudo の権限が付いているので、そのユーザーで操作します(いずれも未実行)。
ログの残り方の違い
sudo は「だれが・どのディレクトリで・だれとして・何を実行したか」を記録します。 su は「だれがだれに切り替えたか」までで、切り替えたあとに実行したコマンドは認証ログには残りません。
| コマンド | 認証ログに残る内容 | 実行したコマンド名 |
|---|---|---|
sudo コマンド |
実行者、端末、ディレクトリ、実行ユーザー、コマンド | 残る |
sudo -i、sudo -s |
シェルを起動したこと(COMMAND=/bin/bash) |
シェルの中の操作は残らない |
su、su - |
だれがだれに切り替えたか | 残らない |
sudo su - |
sudo で su を実行したこと | シェルの中の操作は残らない |
記録の確認先は、Ubuntu系が /var/log/auth.log、RHEL系が /var/log/secure、systemd の環境では journalctl です。sudo の記録は一般に次のような形になります(書式の例です。今回の検証環境はログ収集のサービスが動いておらず、未実行です)。
sudo: taro : TTY=pts/0 ; PWD=/tmp/work ; USER=root ; COMMAND=/usr/bin/systemctl restart nginx
1コマンドずつ sudo コマンド で実行するほど、後から経緯を追いやすくなります。 root のシェルに入ると操作が1行にまとまってしまうため、手順を残したい作業では sudo コマンド の形が向いています。
どれを使うべきか(結論)
| やりたいこと | 使うコマンド | 理由 |
|---|---|---|
| 管理者権限のコマンドを1つ実行する | sudo コマンド |
記録が残り、権限を使う範囲が最小になる |
| root として続けて作業する | sudo -i |
root のログイン環境になり、SUDO_USER も残る |
| 今のディレクトリのまま root で数コマンド | sudo -s |
カレントディレクトリが変わらない |
| サービス用のユーザーとして操作する | sudo -u ユーザー名 -i または sudo -u ユーザー名 コマンド |
そのユーザーのパスワードが不要 |
| root のパスワードで切り替える運用の環境 | su - |
sudo の設定がなくても使える |
| root でファイルに書き込む | コマンド | sudo tee ファイル |
リダイレクトは sudo の外で処理されるため |
| 設定ファイルを編集する | sudoedit ファイル または sudo エディタ ファイル |
権限のあるファイルを編集できる |
sudo su - は多くの手順書に登場し、結果も sudo -i とほぼ同じです。新しく手順を書くなら、コマンド1つで済み、SUDO_USER も残る sudo -i がすっきりします。 すでに sudo su - で書かれた手順は、そのまま使っても同じ環境になります。
作業前のチェックリスト
| 確認すること | コマンド |
|---|---|
| 今のユーザーはだれか | whoami または id |
| 今のディレクトリはどこか | pwd |
| sudo が使えるか | sudo -l |
| root のシェルから戻る | exit または Ctrl+D |
| 元のユーザーを確かめる(sudo の中) | echo $SUDO_USER |
root のシェルではプロンプトの末尾が # になります(一般ユーザーは $)。作業が終わったら exit で戻る習慣を付けておくと、意図しない操作を減らせます。
よくある質問
Q. su と su - はどちらを使えばよいですか?
A. 迷ったら su - です。切り替え先のユーザーの PATH や設定ファイルで作業できるため、「コマンドが見つからない」といった差が出にくくなります。su は元のディレクトリのまま切り替えたいときに使います。
Q. sudo -i と sudo su - は何が違いますか?
A. 今回の実行結果では、ユーザー・カレントディレクトリ・HOME・ログインシェルである点は同じで、違いは SUDO_USER が残るかどうかと、PATH の一部でした。sudo -i は sudo だけで完結するので、記録も設定も sudo 側にまとまります。
Q. Ubuntu で root のパスワードを設定してもよいですか?
A. sudo passwd root で設定はできますが、Ubuntu は sudo で管理する前提で作られているため、sudo -i を使えば root のパスワードがなくても同じ作業ができます(passwd の実行は未実行)。
Q. sudo のたびにパスワードを聞かれないようにできますか?
A. sudoers に NOPASSWD: を付けると省略できます。すべてのコマンドに付けるより、systemctl restart nginx のように必要なコマンドだけに絞ると、便利さと安全さを両立できます。
Q. root のシェルから元のユーザーに戻るにはどうしますか?
A. exit と入力するか、Ctrl+D を押します。sudo su - のように2段階で入った場合も、su のシェルを抜けると sudo も終わるので、1回の exit で元のユーザーに戻ります。戻ったあとに whoami で確かめると確実です。
まとめ
- su は切り替え先のパスワード、sudo は自分のパスワードを使う
su -とsudo -iはログインシェル。カレントディレクトリがホームになり、環境が作り直されるsuとsudo -sはカレントディレクトリがそのまま。ログインシェルではない- Ubuntu は root のパスワードが未設定で
suは認証エラーになる。sudo グループ(RHEL系は wheel)で管理する - 「sudoers ファイル内にありません」はグループへの追加で直せる。
usermod -aGのあとログインし直す - sudoers の編集は visudo。
visudo -cfで文法を確認できる - 普段は
sudo コマンド、続けて作業するならsudo -i。記録が残り、後から経緯を追いやすい
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「Linuxのsuとsudoの違い|su -・sudo -i・-sの比較表」
株式会社RJCでは、suとsudoの使い分けのようなLinuxの基本を仲間と学び合っています。こうした知識を共有しながら、日々技術を磨いています。
株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。
WE ARE HIRING
RJCで一緒に開発しながら、
成長を楽しみませんか?
RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!
- 127日年間休日
- 12時間平均残業時間
- 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!
ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。