構築手順書をせっせと作ったり()、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内で使用するためのコマンドのようです。
なので、パーミッションや所有者を指定してディレクトリを作ったりファイルをコピーしたりする機能があるんですね。
他にもバックアップを取るオプションなどもありますので気になる方は以下などをご覧ください。
それでは良きサーバー構築ライフを