まず結論:状況別の切り替えコマンド早見表
切り替え先と目的に応じて使うコマンドが変わります。以下がUbuntu・RHEL系どちらでも通用する現代Linuxでの基本です。
# rootへ切り替える(sudoが設定済みの環境で推奨)
sudo -i
# rootへ切り替える(rootパスワードを使う)
su -
# 特定の一般ユーザーへ切り替える
su - webapp
# コマンド1つだけ別ユーザーとして実行する
sudo -u nginx cat /var/log/nginx/error.log
# 作業が終わったら元のユーザーへ戻る
exit
su と su - の違いに注意してください。su -(ハイフンあり)はそのユーザーのログインシェルを起動し、PATH や環境変数も切り替え先のものになります。ハイフンなしの su は呼び出し元の環境変数を引き継ぐため、意図しない動作の原因になることがあります。実務では原則 su - を使うのが安全です。
rootへ切り替える:sudo -i が現代の標準
Ubuntu・Debian系ではデフォルトでrootのパスワードがロックされているため、su - は使えません。RHEL/AlmaLinux/Rocky Linux系でも、セキュリティポリシー上rootパスワードを設定しない運用が増えています。このような環境では sudo -i がrootへ切り替える標準的な手段です。
# sudo -i でrootのログインシェルを起動
sudo -i
# 切り替え後に確認
whoami # → root
echo $HOME # → /root
sudo -i はrootの ~/.bash_profile や ~/.bashrc を読み込んでシェルを起動します。rootのエイリアスやPATHが有効になるため、管理コマンドが実行しやすい状態になります。
一方、sudo -s は現在のシェルのまま権限だけrootに昇格します。対話的な管理作業では sudo -i、スクリプト内での一時的な権限昇格には sudo -s と使い分けると整理しやすくなります。
一般ユーザーへ切り替える:su – の使い方
Webアプリケーションのデプロイ確認やファイル権限のチェックなど、特定の一般ユーザーとして作業したい場面は多くあります。su - ユーザー名 でそのユーザーのログインセッションを開始できます。
# webappユーザーへ切り替える
su - webapp
# 切り替え後に確認
id
# → uid=1001(webapp) gid=1001(webapp) groups=1001(webapp)
# 元のユーザーへ戻る
exit
rootから一般ユーザーへ切り替える場合はパスワードなしで切り替えられます。一般ユーザーから別の一般ユーザーへ切り替えるには、切り替え先のパスワード、またはsudo権限が必要です。
ある運用現場では、本番WebアプリのユーザーID(www-data や nginx など)へ切り替えてファイル権限を確認することで、アプリからは参照できるのに管理者からは見えないという権限まわりの問題を素早く特定できたケースがあります。切り替えたユーザー視点でのファイルアクセス確認は強力な診断手段です。
コマンド1つだけ別ユーザーで実行:sudo -u の活用
ユーザーを切り替えてコマンドを1つ実行してまた戻る、という操作は sudo -u ユーザー名 コマンド で1行にまとめられます。セッションを切り替えずに済むため、スクリプト内での使用にも適しています。
# nginxユーザーとしてキャッシュディレクトリを確認する
sudo -u nginx ls -la /var/cache/nginx/
# postgresユーザーとしてデータベース一覧を取得する
sudo -u postgres psql -c "\l"
# deployユーザーとしてデプロイスクリプトを実行する
sudo -u deploy /opt/scripts/deploy.sh
sudo の実行には /etc/sudoers(または /etc/sudoers.d/ 配下のファイル)への設定が必要です。設定は必ず visudo コマンドで編集してください。直接 vi で編集すると構文エラー時にsudoが完全に使えなくなるリスクがあります。
現在のユーザーと環境を確認する
切り替えが複数回続くと、自分が今どのユーザーで作業しているか見失うことがあります。以下のコマンドで現在の状態を素早く確認できます。
# 現在のユーザー名を確認
whoami
# UID・GID・所属グループを確認
id
# 環境変数(HOME, USER, PATH)を確認
echo "USER=$USER HOME=$HOME"
# ログイン中のユーザー一覧(誰が接続中か把握するとき)
who
# systemdのセッション一覧(ネスト状況も把握できる)
loginctl list-sessions
loginctl list-sessions はsystemdのセッション管理コマンドです。誰がどのセッションで作業中かをセッションIDとともに確認できます。SSH接続者が複数いるサーバーで作業の衝突を防ぐ際にも役立ちます。
切り替え時のセキュリティ注意点と運用のコツ
rootセッションを長時間放置しない
作業が終わったら必ず exit でrootから抜けてください。tmuxやscreenでrootセッションをデタッチしたまま離席する運用は、サーバーへの物理的または論理的なアクセスが発生した場合に深刻なリスクになります。
rootパスワードの共有よりsudoによる個人認証を使う
現代のLinux環境では su によるrootパスワードの共有よりも、sudo でユーザーごとの権限を制御する方法が推奨されています。誰がいつどの操作をしたかが /var/log/secure(RHEL系)や /var/log/auth.log(Debian系)に残るため、障害発生時の追跡が容易になります。
wheelグループ・sudoグループへの追加方法
# RHEL/AlmaLinux/Rocky Linux ではwheelグループに追加
usermod -aG wheel username
# Ubuntu/Debian ではsudoグループに追加
usermod -aG sudo username
# グループ設定を確認
groups username
グループの変更は次回ログイン時に有効になります。現在のセッション中に即時反映させるには newgrp wheel を実行する方法もありますが、新規ログインで確認するのが確実です。設定を急いで誤ったまま適用するとsudoが使えなくなるケースがあるため、変更後は別のターミナルで動作確認してから既存のセッションを閉じるようにしてください。
「コマンドは打てる。次は”現場で通用する型”を最短で身につけたい」——そんなあなたへ。
ネットの断片的なTipsをコピペするだけでは、体系的な運用スキルはなかなか積み上がりません。リナックスマスター.JPの無料メルマガ「リナマガ」では、現場で実際に使うLinuxサーバー運用の考え方を、順を追って実務目線でお届けしています。いま登録された方には、安全なサーバー構築の「型」をまとめた『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼント中です。
>> 図解60P『Linux入門マニュアル』を無料で受け取る
(メルマガ登録は10秒・いつでも解除OK)
※ 「独学の時間がもったいない」「プロから現場の技術を最短で学びたい」という本気の方には、2日で実務レベルが身につく初心者向けハンズオンセミナーもご用意しています。
