構築手順書をせっせと作ったり()、dockerfile書いたり、こういう記事書いたりするときに、
mkdirしたりcpやtouchしたものに対して、chmod, chown, chgrpを実行する、というのはよくやりがちだと思うのですが、
それをそれぞれ個別にやってるケースを見かけるので、一気にやる方法をまとめてみます。
(dockerfileで&&で複数コマンド繋ぐよりはスマートかな?)
(基本的にGNU系(centosで確認しました)でもBSD系(Mac OSXで確認しました)でもどちらでもいけると思ってますが、何かあればコメントいただければと思います。)
chownとchgrp
グループの変更はchownでもできます。
(なので実質chgrpって使うこと滅多にない気が……)
chown user:group path/to/file
これで、所有者がuserに、グループがgroupに変更されます。
:(コロン)は.(ドット)でもいける環境もあるようですが、これは古い形式で非推奨のようです。
以下のように、groupを省略して:だけ置けば、所有者と合わせて、グループも所有者の(プライマリ)グループに変更されます。
※これはGNU系版だけで、BSD系版では単にuserが変更されるだけのようです
chown user: path/to/file
ちなみにuserを省略して、:を前に置けば、グループだけの変更も可能です
(chgrpの立場は…
)
chown :group path/to/file
mkdirとchmod, chown, chgrp
mkdirは-mオプションでmodeを指定できます。
※-pオプションは今回の話とは関係ないですが、付けといた方いいので付けときます(以下同様)
mkdir -p -m 777 path/to/dir
# 権限を持ってない場合
sudo mkdir -p -m 777 path/to/dir
chown, chgrpもまとめてやりたい場合は2通りの方法があります。
指定するユーザーが、作成する場所の書き込み権限を持っている場合
(かつ、指定するグループが指定するユーザーのプライマリグループの場合)
この場合は、sudoで別のユーザーとして実行しちゃえばいいですよね。
sudo -u user mkdir -p -m 777 path/to/dir
ただし、この方法だと、userが書き込み権限を持っていない場合は失敗してしまいます。
なのでこの場合はもう1つの方法として、権限を持っているユーザー(主にroot)で、installコマンドを使い、オプションでモード、所有者、グループをそれぞれ指定します。
sudo install -m 777 -o user -g group -d path/to/dir
(mkdirの-pオプションと同等のことをしてくれます。)
mkdirと同じように、複数ディレクトリをまとめて作成することもできます。
(ただし、-pオプション分の部分のディレクトリは、オプションが反映されず、所有者はrootで権限は755になります><)
参考: installコマンドでコマンド数を減らす - @znz blog
ファイルとchmod, chown, chgrp
先ほど挙げた記事にも書かれていますが、installコマンドは、ファイルのコピーにも使えます。
(というかこっちが本業)
この場合は、途中までのディレクトリは作成してくれません。
cpとchmod, chown, chgrpをまとめて
sudo install -m 0644 -o user -g group other/path/to/source path/to/dist
touchとchmod, chown, chgrpをまとめて
sudo install -m 0644 -o user -g group /dev/null path/to/file
補足:installコマンドについて
なんでinstallなんて名前のコマンドでこんなことができるんだ?って感じですが、
これは元々make内で使用するためのコマンドのようです。
なので、パーミッションや所有者を指定してディレクトリを作ったりファイルをコピーしたりする機能があるんですね。
他にもバックアップを取るオプションなどもありますので気になる方は以下などをご覧ください。
それでは良きサーバー構築ライフを ![]()