ユーザーとグループ

INPUT · スライド

グループを作って人を入れる

01 / 08

2人で1つのファイルを触りたい

前のレッスンで taro を作ったね。そして分かったことがあるよ。taro はあなたの部屋に書けない

それは安全でいいことだけれど、困る場面もあるよ。

2人で同じ資料を書き足していきたいとき。あなたと taro の両方が読み書きできる場所が欲しいよね。

方法は3つ考えられるよ。

  • その他の枠に w を付ける(chmod 777)→ 全員に開けてしまう
  • 片方の持ち主にする → もう片方が書けない
  • 2人を同じグループに入れて、グループに w を付ける ← これ

3つ目がグループの使いどころだよ。必要な人にだけ開けることができるんだ。

章6で「9文字の真ん中の3文字はグループ」と覚えたよね。あの3文字を活かすのが今日の回だよ。

02 / 08

addgroup で箱を作る

グループを作るのは1行だよ。もちろん root でね。

~ $ suPassword:~ $ addgroup team~ $ grep team /etc/groupteam:x:1002:

4つの区切りのうち、4列目が空だね。まだ誰も入っていない箱ができただけだよ。

番号は 1000 以上が振られるよ。ユーザーと同じ考え方だね。

ここで気をつけてほしいのは、グループを作っただけでは何も変わらないということだよ。箱を用意しただけで、

  • 誰かを入れる
  • ファイルのグループをその箱にする
  • グループの3文字に w を付ける

この3つをやって、はじめて共有ができるんだ。今日は前半(人を入れる)をやって、次のレッスンで後半(ファイル側)をやるよ。

03 / 08

入れ方は2つある

人をグループに入れる方法は、その人を作るときか、あとからの2つだよ。

作るときに決めるなら -G だよ。

~ $ adduser -D -G team hanako~ $ id hanakouid=1001(hanako) gid=1002(team)  groups=1002(team)

hanako は最初から team の人になったね。同じ名前のグループ(hanako)は作られていないよ。team がこの人の主なグループになったからだよ。

では、すでにいる taro をあとから入れるには? ここで少し面倒なことが起きるんだ。

本物の Linux には usermod -aG team taro という道具があるよ。でもこの環境には入っていない。中身を小さくした BusyBox だからね。

どうしよう。実は困らないんだ。名簿はテキストファイルだからね。

04 / 08

名簿を直せば入る

/etc/group の4列目に名前を書けば、その人はそのグループの人になるよ。

~ $ sed -i \    '/^team:.*:$/s/$/taro/' \    /etc/group~ $ grep team /etc/groupteam:x:1002:taro

章5でやった sed だね。読み解いてみよう。

部分意味
-iファイルをその場で書きかえる
/^team:.*:$/team: で始まり : で終わる行だけ
s/$/taro/行の終わりtaro を足す

^$ が行の先頭と終わりを表すのは章3の正規表現だね。行末に足す = 4列目の後ろに書くということだよ。

: で終わる行だけを選んでいるのには理由があるよ。まだ誰も入っていない行だけを狙うためだよ。こうしておくと、うっかり2回打っても tarotaro にならないんだ。

2人目を足すときはコンマが必要だよ。s/$/,hanako/ のように書くんだ。4列目は taro,hanako のようにコンマで並べる決まりだからね。

そして id taro を打つと、もう team が付いているよ。名簿を読み直しているだけだから、書いた瞬間に効くんだ。

05 / 08

主グループと、あとから入れたグループ

ここが今日いちばんの落とし穴だよ。hanakotaro を見比べてみよう。

~ $ grep team /etc/groupteam:x:1002:taro

taro しか書かれていないね。でも hanakoteam の人なんだ。名簿に名前が無いのに、グループに入っている——なぜだろう。

書かれる場所が違うんだよ。

種類書かれる場所
主グループ/etc/passwd の4列目(番号で)
あとから入れた/etc/group の4列目(名前で)

hanako-G team で作ったので前者、tarosed で足したので後者なんだ。

だから /etc/group を見るだけでは、そのグループの全員が分からない。両方を合わせて見る必要があるんだ。

面倒だよね。だから道具があるよ。idgroups は両方を合わせて答えてくれるんだ。人が2か所を突き合わせなくていいようにね。

06 / 08

idgroups で確かめる

確かめる道具を並べておこう。

~ $ groups tarotaro team~ $ id tarouid=1000(taro) gid=1000(taro)  groups=1000(taro),1002(team)
書き方出るもの
groups 名前入っているグループの名前だけ
id 名前番号と名前を全部
id -gn 名前主グループの名前だけ

id の出方に注目してほしいな。gid= が主グループで、groups= が全部だよ。taro は主が taro で、そこに team が足されているね。

hanako はこうなるよ。

gid=1002(team) groups=1002(team)

主グループが team そのものだね。同じ「team の人」でも成り立ちが違うんだ。

どちらでも共有はできるよ。違いが出るのは新しく作るファイルのグループで、そこは主グループになるんだ。次のレッスンで実際に見てみよう。

07 / 08

消すときの決まり

グループを消すのは delgroup だよ。でも断られることがあるんだ。

~ $ delgroup shopdelgroup: 'kenji' still has  'shop' as their primary group!

主グループにしている人がいると消せないんだ。

なぜだろう。消せてしまったら、kenji は「存在しないグループに属する人」になってしまうからだよ。ls -lkenji のファイルを見ると、グループが番号だけになる——前のレッスンで見た、名前を引けない状態だね。

そういう壊れた状態を作らせないために、先に断ってくれるんだ。

一方、sed で足しただけの人がいるグループは消せるよ。その人には主グループが別にあるので、消えても行き場があるからね。

delgroup team    → 通る(taro の主は taro)

消したあとに id taro を打つと team が消えているよ。グループを消すと、そこへの所属も一緒に消えるんだ。

08 / 08

さあ、打ってみよう

今日打つのは4つだよ。

やること打つもの
箱を作るaddgroup team
作るときに入れるadduser -D -G team 名前
あとから入れるsed -i/etc/group の4列目に
確かめるid 名前 groups 名前

作る側は root、確かめる側は誰でもだよ。/etc/group は誰でも読めるからね。

だから今日の問題では「root で作って exit、それから確かめる」という流れが多くなるよ。root でいる時間は短いほうがいいからね。

sed の1行は少し長いよ。落ち着いて写してみて。中身は章3と章5でやったものしかないからね。