もうPermisson deniedを恐れる必要ない


はじめに

今までコマンドを実行し、Pemission deniedの文字が表示された時には、とりあえずsudoを付ければいいんでしょという認識でいました(よくない)
今のままの状態ではまずいと思い、今回アクセス権限について学習したので自分の備忘録がてら記しておきたいと思います。

ファイルのパーミッションの確認方法

Linuxで扱われるファイルは、全てに所有者が設定されています。
確認方法については、ls -lコマンドで可能です。lsコマンドはファイルやディレクトリを一覧表示するためのコマンドですが、-lオプションを付けることで、ファイル名だけではなく、詳細情報を表示させることができます。

$ ls -l sample.txt
-rw-r--r--  1 morimorimokenpi  staff  0  4 19 22:24 sample.txt

ファイルタイプ

先頭の-はファイルタイプを表しています。
ファイルタイプには三種類あり、今回の場合は-なので通常ファイルを表しています。

記号 意味
- 通常ファイル
d ディレクトリ
l シンボリックリンク

ファイルモード

次のrw-r--r--はファイルモードと呼ばれ、ファイルのパーミッションを表しています。
rw- r-- r--と3つずつ区切られており、それぞれが「オーナー」,「グループ」,「その他のユーザ」のパーミッションを表しています。
ここではrしか出てきていませんが、パーミッションを表す記号としてもう一つxがあります。

パーミッションの記号と意味

記号 意味
r 読み取り(read)
w 書き込み(write)
x 実行(execute)

今回のsample.txtのパーミッションとしては、以下となっています。

ユーザ種別 読み取り 書き込み  実行
オーナー 許可 許可 禁止
グループ 許可 禁止 禁止
その他のユーザ 許可 禁止 禁止

パーミッションの変更方法

ファイルタイプやファイルモードの中身の見方についてはわかりましたが、パーミッションを変更するにはどうしたらいいでしょうか。
パーミッションの変更にはchmod(change modeの略)コマンドを使います。chmodコマンドの指定方法には2種類あるので、順番に紹介していきます。

シンボルモードによる変更

$ chmod [ugoa] [+-=] [rwx] ファイル名

[ugoa] はどのユーザを対象にするかを表しています。
このユーザ指定は省略することもできますが、省略した場合はaを指定したものとみなされます。

記号 意味
u オーナー
g グループ
o その他のユーザ
a ugoすべて

[+-=] は権限の追加や禁止を指定しています。

記号 意味
+ 権限を追加する
- 権限を禁止する
= 指定した権限にする

[rwx] は上記でも説明したとおり、パーミッションの意味を表しています。

ここでは例としてsample.txtにグループの書き込み権限を追加してみます。

$ chmod g+w sample.txt
実行前
$ ls -l sample.txt 
-rw-r--r--  1 morimorimokenpi  staff  0  4 19 22:45 sample.txt
実行後
$ ls -l sample.txt 
-rw-rw-r--  1 morimorimokenpi  staff  0  4 19 22:47 sample.txt

グループの書き込み権限が追加されました。

また、複数のユーザの権限をまとめて設定することも可能です。
オーナーとその他のユーザに実行権限を追加してみましょう。


$ chmod uo+x sample.txt
$ ls -l sample.txt 
-rwxr--r-x  1 morimorimokenpi  staff  0  4 19 22:50 sample.txt

オーナーとその他のユーザに実行権限が追加されました。

数値モードによる変更

数値モードでは、 rwxの中で許可する権限を以下の表の数字に置き換え、それを足し算してパーミッションを数値で表現しています。


$ chmod 8進数の数 ファイル名
数字 意味
4 読み取り(read)
2 書き込み(write)
1 実行(execute)

図に表すとこんな感じです(汚くてすいません笑)

実際にsample.txtの権限を変更してみましょう。

$ chmod 755 sample.txt
実行前
$ ls -l sample.txt
-rw-r--r--  1 morimorimokenpi  staff  0  4 19 23:14 sample.txt
実行後
$ ls -l sample.txt
-rwxr-xr-x  1 morimorimokenpi  staff  0  4 19 23:15 sample.txt

このように数値モードは、もともとのパーミッションに関わらず、新しいパーミッションへと値を変更する絶対指定となっています。それに対して、シンボルモードは指定した以外のパーミッションは変化しない相対指定となっています。変更箇所に合わせて使い分けるようにしたほうが良いかもしれません。

参考

新しいLinuxの教科書