こんにちは、フルスタックエンジニアのryuです。
Linuxでファイルを編集しようとしたら、
Permission deniedと表示された。 所有者がrootになっていて、一般ユーザーでは変更できない。
そんなときに使うのが、chownコマンドです。
chownでは、ファイルやディレクトリの所有ユーザーと所有グループを変更できます。
この記事では、基本的な書式、再帰的な変更、シンボリックリンクの注意点まで初心者向けに解説します。
chownコマンドとは?¶
chownは、ファイルやディレクトリの所有ユーザーと所有グループを変更するコマンドです。
名前はchange ownerに由来します。
所有者と所有グループの違い¶
Linuxのファイルには、所有ユーザーと所有グループが設定されています。
ls -l sample.txt
実行結果の例です。
-rw-r----- 1 user1 developers 1200 Jul 15 10:00 sample.txt
この場合、所有ユーザーはuser1、所有グループはdevelopersです。
所有者やグループごとに、読み込み・書き込み・実行の権限を設定できます。
chownが必要になる場面¶
chownは、次のような場面で使います。
- rootで作成したファイルを一般ユーザーへ渡す
- Webサーバーが読み書きするディレクトリを調整する
- 複数ユーザーで共有するファイルのグループを変更する
- バックアップから戻したファイルの所有者を修正する
所有者を変えれば必ず動くわけではありません。
chmodで設定する権限や、親ディレクトリの権限も合わせて確認します。
【関連記事】Linuxのファイル権限とchmodの使い方
chownの基本的な使い方¶
chownの基本書式は以下です。
chown [オプション] 所有者[:グループ] ファイル
所有者の変更には、通常root権限が必要です。
所有者だけを変更する¶
ファイルの所有者をuser1へ変更します。
sudo chown user1 sample.txt
変更後は、ls -lで確認します。
ls -l sample.txt
グループを指定していないため、所有グループは変更されません。
所有者とグループを同時に変更する¶
所有者をuser1、所有グループをdevelopersへ変更します。
sudo chown user1:developers sample.txt
所有者とグループの間は、コロンで区切ります。
古い手順ではドットを使った書き方を見かける場合がありますが、新しく書く場合はコロンを使いましょう。
グループだけを変更する¶
所有者を変えず、所有グループだけを変更する場合は、コロンの後ろへグループ名を指定します。
sudo chown :developers sample.txt
chgrpを使っても同じ目的を達成できます。
sudo chgrp developers sample.txt
グループだけを変更することが明確な場合は、chgrpの方が意図を読み取りやすいこともあります。
実際にchownで所有者を変更する¶
ここでは、ファイルを作成し、所有者が変わる流れを確認します。
変更前の所有者を確認する¶
ファイルを作成します。
touch a.txt
ls -l a.txt

実行したユーザーによって、表示される所有者とグループは異なります。
現在のユーザーは、idやwhoamiで確認できます。
whoami
id
chownを実行して確認する¶
所有者をuserへ変更します。
sudo chown user a.txt
ls -l a.txt

所有者の部分がuserへ変わっていれば完了です。
変更後に、対象ユーザーで読み書きできるかも確認しましょう。
ディレクトリの所有者を変更する¶
ディレクトリも、ファイルと同じ書式で変更できます。
sudo chown user1:developers project/
ただし、このコマンドだけでは、ディレクトリの中にあるファイルまでは変更されません。
-Rで中身をまとめて変更する¶
ディレクトリ以下を再帰的に変更する場合は、-Rを付けます。
sudo chown -R user1:developers project/
project/の中にあるファイルやサブディレクトリも対象になります。
実行前に、対象範囲を確認しましょう。
find project -maxdepth 2 -ls
-Rのパス指定に注意する¶
sudo chown -Rは、広い範囲の所有者を一度に変更できます。
パスを間違えると、OSやアプリケーションが必要とする所有者まで変えてしまいます。
私は実行前に、現在地と対象を確認します。
pwd
ls -ld project/
変数を含むスクリプトでは、変数が空になっていないかも確認してください。
chownの便利なオプション¶
chownには、変更内容の確認や安全性を高めるオプションがあります。
-vと-cで変更内容を表示する¶
すべての対象について処理内容を表示する場合は、-vを使います。
sudo chown -v user1 sample.txt
実際に所有者が変わったファイルだけを表示する場合は、-cです。
sudo chown -c -R user1:developers project/
大量のファイルを変更するときは、-cの方が結果を確認しやすい場合があります。
--referenceで別ファイルと同じ所有者にする¶
既存ファイルと同じ所有者・グループへそろえる場合は、--referenceを使えます。
sudo chown --reference=reference.txt target.txt
ユーザー名やグループ名を手入力しなくても、reference.txtと同じ状態になります。
設定ファイルを置き換えたあと、周囲のファイルと所有者をそろえたい場合に便利です。
--fromで変更前の所有者を限定する¶
現在の所有者が一致するファイルだけを変更する場合は、--fromを使います。
sudo chown -R \
--from=olduser:oldgroup \
newuser:newgroup \
project/
想定外の所有者まで変更することを減らせます。
ただし、実行前後の確認が不要になるわけではありません。
シンボリックリンクとchown¶
シンボリックリンクが含まれる場合は、リンク自体とリンク先のどちらを変更するのか注意が必要です。
通常はリンク先が対象になる¶
再帰指定をしていない通常のchownでは、シンボリックリンクそのものではなく、リンク先の所有者を変更するのが基本です。
sudo chown user1 link-file
リンク先の重要なファイルを意図せず変更しないよう、事前に確認します。
ls -l link-file
readlink -f link-file
-hでリンク自体を変更する¶
シンボリックリンクそのものの所有者を変更する場合は、-hを使います。
sudo chown -h user1:developers link-file
OSやファイルシステムによっては、シンボリックリンク自体の所有者変更に制約があります。
-Rとシンボリックリンクを組み合わせる場合は、対象範囲が広がらないよう特に注意しましょう。
chownでPermission deniedになる原因¶
chown自体を実行したときに、Operation not permittedやPermission deniedが表示される場合があります。
原因を分けて確認しましょう。
所有者を変更する権限がない¶
一般ユーザーは、自由にファイルの所有者を変更できません。
必要な権限がある場合は、sudoを使います。
sudo chown user1 sample.txt
sudoを使えない環境では、管理者へ依頼してください。
指定したユーザーやグループが存在しない¶
ユーザーが存在するか確認します。
id user1
グループはgetentで確認できます。
getent group developers
入力ミスや、別サーバーにしか存在しないアカウントを指定していないか確認しましょう。
読み取り専用のファイルシステムになっている¶
ファイルシステムが読み取り専用でマウントされていると、所有者を変更できません。
findmnt -T sample.txt
マウントオプションにroがないか確認します。
障害によって読み取り専用になった可能性もあるため、原因を調べずに再マウントしないようにしましょう。
chmodとchownの違い¶
chmodとchownは、どちらもファイル管理で使いますが、変更する対象が異なります。
| コマンド | 変更するもの |
|---|---|
chmod |
読み込み・書き込み・実行の権限 |
chown |
所有ユーザーと所有グループ |
chgrp |
所有グループ |
例えば、所有者を変更しても、所有者に書き込み権限がなければ編集できません。
sudo chown user1 sample.txt
chmod u+w sample.txt
権限エラーでは、所有者だけでなくls -lの権限表示も確認してください。
chownコマンドの使い方まとめ¶
所有者だけを変更する場合は、次のように実行します。
sudo chown user1 sample.txt
所有者とグループを同時に変更する場合は、コロンで区切ります。
sudo chown user1:developers sample.txt
ディレクトリ以下を変更する場合は、-Rを使います。
sudo chown -R user1:developers project/
エンジニアとして10年以上Linuxを扱っていますが、私はchown -Rを実行する前に、必ず対象パスと現在の所有者を確認します。
所有者を変更すること自体は簡単ですが、範囲を間違えるとサービスが起動しなくなることもあります。
エラーを消すために所有者を変えるのではなく、どのユーザーがそのファイルを管理するべきか考えることが大切です。
chownを実際に練習したい方へ¶
InfraAcademyでは、ブラウザ上のLinux環境でファイルを作成し、chownやchmodを実行しながら学習できます。
基本操作から学びたい方は、Linux入門講座を確認してみてください。
ユーザー、グループ、権限管理まで学びたい方は、Linux中級講座がおすすめです。