ユーザーを切り替える
前提:2-2が完了し、ユーザーyumiが作成済み。ubuntuユーザーのホームディレクトリ(~)にいる状態から始めます。前回はyumiという名前と部屋(ホームディレクトリ)を用意しただけでした。今回はいよいよsu - yumiを使って、実際にyumi本人としてログインします。ユーザーを切り替えると見える景色がどう変わるのか、そしてsuとsu -という似た2つのコマンドの違いを体験するのが到達点です。
SET 1 ― su - yumiでログインする
- $whoami
- ubuntu
- $pwd
- /home/ubuntu
- $echo $HOME
- $su - yumi
- Password: (yumiのパスワードを入力)
- $whoami
- yumi
- $id
- $pwd
- /home/yumi
- $echo $HOME
- $ls -la
- $hostname
1〜2行目で、現在ubuntuユーザーとしてホームディレクトリにいること、3行目の$HOMEが/home/ubuntuであることを確認しておきます。4行目のsu - yumiがこのページの主役です。suはswitch user※1の略で、別のユーザーに切り替えるコマンドです。sudoと違い、suで他人になりきるには基本的にそのユーザー自身のパスワードが必要になるため、出力例のようにPassword:の入力を求められます。ここでは2-2で設定したyumiのパスワードを入力してください(rootであるubuntu側からyumiに切り替える場合はubuntu自身のパスワードではなくyumiのパスワードが要求される点に注意です)。
ログインに成功すると、ターミナルのタイトルバーがyumi@lightsailに変わります。5行目のwhoamiでyumiになっていることを確認し、6行目のidでUID・GID・所属グループも見ておきます。7行目のpwdを見ると、なんと現在地が/home/yumiに変わっています。8行目のecho $HOME(1-4以降で使ったechoで環境変数※2の中身を表示)を実行すると、同じく/home/yumiが返ってきます。これは、コマンド名のsuの後ろに付けた-(ハイフン)の働きによるものです。su -は単に権限を切り替えるだけでなく、「yumiとして最初からログインし直した」のと同じ状態を作り出し、ホームディレクトリや環境変数をyumiのものに完全に入れ替えます。9行目のls -laで、2-2で確認した/home/yumiの中身がそのまま見えていることも確認しておきましょう。最後の10行目のhostnameを見ると、サーバー自体は変わっていないことがわかります。ユーザーが変わってもサーバーは同じ1台のまま、というのは意外と忘れがちなポイントです。
su - yumiのハイフンを省略してsu yumiと打つと、ユーザーIDだけyumiに切り替わりますが、ホームディレクトリや環境変数はubuntuのものが引き継がれてしまい、pwdを打っても/home/ubuntuのままという中途半端な状態になります。ユーザーを完全に切り替えたいときは、必ずハイフン付きのsu -を使う習慣をつけましょう。

やっと本人としてログインできたよ、こんにちは! suってなんとなくsudoと似てるから混同しがちだけど、sudoは「一瞬だけ他人の力を借りる」、suは「本当にその人にログインし直す」って感じで結構違うんだ。しかもパスワードもubuntu用じゃなくてあたし用のを聞かれたでしょ? そこも見分けるポイントだよ!
SET 2 ― yumiとして作業し、元に戻る
- $touch memo.txt
- $ls -l memo.txt
- -rw-rw-r-- 1 yumi yumi 0 Jul 3 09:20 memo.txt
- $echo 'よろしくお願いします' > memo.txt
- $cat memo.txt
- $whoami
- $id
- $sudo whoami
- yumi is not in the sudoers file. This incident will be reported.
- $exit
- $whoami
- ubuntu
- $pwd
1行目のtouch memo.txt(1-2で学んだ空ファイル作成)をyumiとして実行し、2行目でls -lを見ると、出力例のとおり所有者がyumiになっています。これは当然のことのようですが、後の2-4・2-5で「誰がファイルを作ったか」がパーミッションの理解に直結してくるので、ここでしっかり確認しておいてください。3行目のecho '...' > memo.txt(3-3で詳しく扱うリダイレクト)で実際に文字を書き込み、4行目のcatで中身を確認します。
5行目のwhoami、6行目のidで、改めて自分がyumiであり、所属グループがyumi1つだけであることを確認します。7行目、yumiのままsudo whoamiを試すと、2-1でubuntuユーザーが成功した同じコマンドが、出力例のようにyumi is not in the sudoers file.(yumiはsudoersファイルに登録されていません)と拒否されます。これは2-1で見た/etc/sudoersの%sudoグループに、yumiがまだ所属していないためです。yumiは意図的に「管理者権限を持たない、普通の利用者」として作成されていることを、ここで実感してもらうのがこのセットの狙いです。
8行目のexitで、yumiとしてのログインセッションを終えて元のubuntuユーザーに戻ります。これは2-1でrootのシェルから抜けたときと同じ考え方です。su -で「ログインし直した」のだから、抜けるときも同じくexitを使います。9行目のwhoami、10行目のpwdで、無事ubuntuユーザー・/home/ubuntuに戻れたことを確認します。
sudoが使えるかどうかは「sudoグループに入っているか」だけで決まります。同じサーバーの住人でも、ubuntuは管理者、yumiはただの利用者という役割の違いがある、というのがこの章全体の重要なテーマです。次の2-5でyumiに別の権限(devteamグループ)を与える演習をしますが、sudoグループには最後まで入れません。
SET 3 ― 権限による見え方の違いを確認する
- $ls /home/yumi
- ls: cannot open directory '/home/yumi': Permission denied
- $cat /home/yumi/memo.txt
- cat: /home/yumi/memo.txt: Permission denied
- $ls -ld /home/yumi
- drwxr-x--- 3 yumi yumi 4096 Jul 3 09:20 /home/yumi
- $sudo ls /home/yumi
- $sudo ls -la /home/yumi
- $sudo cat /home/yumi/memo.txt
- よろしくお願いします
- $whoami
- ubuntu
- $id
- $cd ~
- $pwd
1行目、ubuntuユーザーに戻った状態でls /home/yumiを実行すると、出力例のようにPermission deniedで拒否されます。2行目のように、SET 2でyumiが作成したmemo.txtを直接catで読もうとしても、同じく拒否されます。2-2の時点では気にしていなかったかもしれませんが、3行目のls -ld /home/yumiで権限を見るとdrwxr-x---となっており、末尾の3文字(その他のユーザーに対する権限)が---、つまり何も許可されていません。ubuntuユーザーであっても、yumiのホームディレクトリの中身を無条件に覗くことはできないということです。これは第1章で「管理者だから何でも見える」と思っていた人にとっては新鮮な発見のはずです(権限記号の詳しい読み方は次の2-4で扱います)。
4行目のようにsudoを付ければ、rootとして一時的に振る舞うため、パーミッションの制約を飛び越えて中身が見えます。5行目のsudo ls -la /home/yumiでは、隠しファイルも含めた詳細一覧まで、一般ユーザーのままでは絶対に覗けないyumiのホームディレクトリの中身を、sudoを付けた瞬間に丸ごと見渡せることが確認できます。6行目では、同じくsudo catでmemo.txtの中身を確認すると、出力例のとおりSET 2でyumiが書き込んだ内容がしっかり読めます。ここでもsudoが必要な理由は、他人の所有物にアクセスする操作だからです。管理者権限は「持っているから常に見える」のではなく、「必要なときにパーミッションの壁を越える力を借りる」ものだという理解を、このセットで固めておきましょう。
7行目のwhoamiに続けて8行目のidを実行し、SET 1冒頭のubuntuのidと見比べておくと、devteamグループ(2-5で登場)にはまだ入っていないシンプルな状態であることが確認できます。9行目のcd ~、10行目のpwdで改めてホームディレクトリにいることを確認し、このページを締めくくります。

ubuntuさんでもsudoなしだとあたしの部屋(/home/yumi)には入れないんだね、ちょっと安心した! これって実は大学の寮でルームメイトの部屋に勝手に入れないのと同じ感覚だよ。管理人さん(root)に頼めば合鍵で開けてもらえるけど、普段は各自のプライバシーがちゃんと守られてるってこと。次の2-4では、この「鍵」の仕組み=パーミッションを、記号の意味からきっちり読めるようになろう!
まとめ
2-3では、su - yumiで実際にユーザーを切り替え、sudo権限の有無・ホームディレクトリの違い・パーミッションによるアクセス制限を体験しました。このページで叩けるようになったコマンドを一覧にまとめます。
| コマンド | 何をするか | 覚え方 |
|---|---|---|
su - <名前> | 指定ユーザーとして完全にログインし直す | switch user(利用者を切り替える) |
su <名前> | UIDだけ切り替える(環境は引き継がれる) | ハイフンなし=中途半端な切り替え |
exit | su や sudo -i で入ったセッションから抜ける | 元のユーザーへ戻る |
echo $HOME | 現在のユーザーのホームディレクトリを表示する | 環境変数HOMEの中身を見る |
ls -ld <ディレクトリ> | ディレクトリ自体の権限を1行で確認する | 誰の部屋か鍵を見る |
sudo ls <他人のディレクトリ> | 管理者権限でパーミッションの壁を越えて閲覧する | 合鍵を借りて中を見る |
次のページ「2-4. パーミッションを読む」では、今回何度も登場したdrwxr-x---のような記号の意味を1文字ずつ読み解き、chmodで自分の手で権限を変更していきます。
- su(switch user) … 別のユーザーに切り替えるコマンド。ハイフンを付けた
su -は環境ごと完全に切り替え、付けないsuはUIDのみ切り替える。↩ - 環境変数 … シェルやプログラムが参照する、名前付きの値。
$HOME(ホームディレクトリ)や$PATH(コマンド探索先)などがあり、6-1で詳しく扱う。↩ - sudoers …
/etc/sudoersファイル、またはそこに登録されている「sudoを使える権利を持つユーザー・グループ」を指す言い方。2-1参照。↩ - パーミッション … ファイルやディレクトリに対する読み取り・書き込み・実行の許可設定。
ls -lの先頭に表示されるdrwxr-x---のような記号で表される。2-4で詳しく扱う。↩ - Permission denied … 「権限がありません」という意味のエラーメッセージ。ファイルの所有者・グループ・その他のいずれにも該当する権限がない場合に表示される。↩