Edited at

permission deniedで悩まされたので勉強してみた


最初に

ことあるごとにコマンドの実行結果がpermission deniedとなり、こやつは何ぞや、、、となっておりました。パーミション? なんか難しそう。。敷居高そうだと。

しかし、しっかり勉強したらなんてことなかったです。難しくなかったです。ただの先入観だということがわかったので同じ悩みをお持ちの方のためになればと思い、本記事を投稿します。


パーミッションて何?

linuxコマンドはプログラムを書く人とって切っても切り離せないものですよね。

そもそもLINUXは、サーバーでよく使われるOSですが、そのため1つのマシンへ複数のユーザーが同時にログインして操作することを前提として作られています。この際に、秘密のファイルを他のユーザーに見られてしまったり、誤って他のユーザのファイルを上書きしてしまうことを防ぐため、アクセス権限が必要でした。したがって一つ一つのファイルには、「誰に、どのような操作を許可するのか」という権限を規定する情報が設定されています。この情報のことを、パーミッションと呼びます。


パーミッションを確認しよう

Linuxで扱われるファイルは、自分で作成したメモのテキストファイルから、システムが提供するライブラリや実行コマンドまで、全てに所有者(オーナー)が設定されています。ファイルのオーナーは、ファイルへのアクセス権限を自由に設定できます。

lsコマンドを-lオプションで実行します。

$ ls -l 

drwxr-xr-x. 20 root root 2077 Jul 5 14:34 bin/cat

lsコマンドを-lオプションで実行すると、上記のように出力されます。

左から順に、

表示
意味

d
ファイルタイプ

rwxr-xr-x.
ファイルモード

20
リンク数

root
ファイルの所有者(オーナー)

root
ファイルが所属する所有グループ

2077
サイズ

Jul 5  4:34
タイムスタンプ

bin/cat
ファイル名もしくはディレクトリ名

という意味です。

ここでは、簡単にそれぞれの説明をした後に、本題である、ファイルモード(permissionの状態)についてふれていきたいと思います。


ファイルタイプ

ファイルタイプには3種類あります。

記号
ファイルタイプ

-
通常ファイル

d
ディレクトリ

l
シンボリックリンク

通常ファイルや、ディレクトリは言葉の意味そのままですので、シンボリックリンクについて少し説明します。


シンボリックリンクとは

リンク先のパス名が書かれた小さな特殊ファイルです。

どういうことでしょうか。

例で確認しましょう。

$ pwd

/Users/takuya/example

$ touch file1

$ ln -s file1 file2

$ ls -l
total 8
-rw-r--r-- 1 takuya staff 6 Jul 12 16:45 file1
lrwxr-xr-x 1 takuya staff 13 Jul 12 16:48 file2@ -> example/file1

$ cat file1
File1

$ cat file2
File1

exampleディレクトリにtouchコマンドでfile1作成したのちに、file1というファイルに対して、file2という名前でシンボリックリンクを作成しました。

そしてシンボリックリンクのリンク先を確認するために、lsコマンド-lオプションを指定します。矢印で表示されているのが確認できると思います。コマンドでファイル名の代わりにシンボリックリンクを指定すると、そのリンク先のファイルにアクセスできます。上の例では、catコマンドでfile2を指定すると、file1がアクセスされその中身が出力されています。

このように、シンボリックリンクのリンク先がファイルの実体であり本物のファイルです。

また、次のように長いパス名を持つファイルやディレクトリへリンクを作成しておけば、簡単にアクセスできて便利になります。

ln -s local/work/code/projects/source source

cd source


リンク数

簡単に言えば、ファイルであれば1、ディレクトリであればその一つ下の階層のファイルまたはディレクトリ数(あくまで一つ下の階層までで、その下のファイルなどは含まない)。

$ ls -la

.
.
.
drwxr-xr-x+ 5 takuya staff 160 Oct 7 2017 Public/
.
.

$ ls -la Public/
total 0
drwxr-xr-x+ 5 takuya staff 160 Oct 7 2017 ./
drwxr-xr-x+ 70 takuya staff 2240 Jul 12 17:13 ../
-rw-r--r-- 1 takuya staff 0 Oct 7 2017 .com.apple.timemachine.supported
-rw-r--r-- 1 takuya staff 0 Oct 7 2017 .localized
drwx-wx-wx+ 3 takuya staff 96 Oct 7 2017 Drop Box/

といった具合である。


オーナー

Linuxで扱われるファイルは、自分で作成したテキストファイルから、システムが提供するライブラリや実行コマンドまで、全てに所有者(オーナー)が設定されています。ファイルのオーナーは、ファイルへのアクセス権限を自由に設定できる。


グループ

ユーザーをまとめた集まりのことです。例えばシステム管理を行うwheelというグループに複数の管理者ユーザを所属させ、wheelグループに対して許可を与えることで、同じ役割を持つ複数のユーザに同一の権限を与えることができます。ユーザは同時にいくつものグループに所属できます。また、どのユーザも最低一つのグループに所属していないといけません。ユーザを新規作成する際に特に指定しないと、ユーザー名と同一のグループに所属します。

自分がどのグループに所属しているかは、 groupsコマンドで確認できます。次の例では、現在のログインユーザtakuyaは「staff」と「everyone」という2つのグループに所属しています。

$ groups

staff everyone


また、

サイズは、そのファイル容量、タイムスタンプは最後に編集した日時です。

それでは、いよいよファイルモードについて説明します。


ファイルモード

$ ls -l 

drwxr-xr-x. 20 root root 2077 Jul 5 14:34 bin/cat

ファイルタイプの後ろの9文字rwxr-xr-xの部分はファイルモードと呼ばれます。

この9文字はrwxr-xr-xというように3文字ごとに1つのブロックになっていて、それぞれがオーナーグループその他のユーザに対するパーミッションを意味しています。

下の表にパーミッションの記号の意味を示しています。

記号
意味

r
読み取り(read)

w
書き込み(write)

x
実行(execute)

先ほどの例では「-」という表示が見られますが、こちらは「未許可」ということを表します。

ユーザ種別
読み取り
書き込み
実行  

オーナー   
許可
許可
許可

rootグループに所属するユーザ
許可
未許可
許可

その他のユーザ
許可
未許可
許可

このファイルはオーナーにしか書き込み権限がありませんから、その他のユーザはファイルを上書きすおることができません。また、どのユーザにも実行権限がついているため、誰でも実行可能です。

注)ディレクトリのパーミッション表示も同じ記号を使いますが、ファイルの場合とは違った意味を持ちます。

記号
意味

r
読み取り:ディレクトリに含まれるファイル一覧の取得

w
書き込み:ディレクトリの下にあるファイル・ディレクトリの作成・削除

x
実行:ディレクトリをカレントディレクトリにする


ファイルモードを変更する

ファイルモードの変更にはchmodコマンドを指定するわけですが、「シンボルモード」による指定と「数値モード」による指定の2種類の方法があり、どちらもよく使われます。


*シンボルモード

次のような書式で実行します。

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

シンボルモードによる指定では「誰に、どのような権限を追加したい(もしくは禁止)するのか」というのがわかりやすくなっています。


例)

$ chmod u+w file.txt


u(誰に)+(どうする)w(何を)

また[ugoa]と[+-=]の意味はそれぞれ次のようになっています。

記号
意味

u(user)
オーナー

g(group)
グループ

o(other)
その他のユーザー

a(all)
ugo全て

記号
意味

+
権限を追加する

-
権限を禁止する

=
指定した権限と等しくする

例えば、現在の権限が「r--r--r--」であるファイルfile.txtに対して、オーナーの書き込み権限を追加したい時、以下のコマンドを実行します

$ chmod u+w file.txt

現在「rwxrwxrwx」であるファイルfile.txtにたいして、「グループ」と「その他のユーザー」には「読み取り」だけの権限に抑えたい時、次のコマンドを実行すると良いでしょう。

$ chmod go=r file.txt

以上のように、シンボルモードは、相対的な指定方法です。つまり、指定したパーミッション以外は変化しません。これは、「オーナー権限のみ」などパーミッションの一部だけを変更したいときに便利です。


*数値モード

書式は以下のようになります。

chmod <8進数の数値> <ファイル名>

数値モードは元のパーミッションに関わらず新しいパーミッションの値へと変更する、絶対指定の方法です。

例を確認した方が早いですね。

$ ls -l file.txt

-rw-r--r-- 1 takuya staff 0 Jul 12 18:58 file.txt

$ chmod 755 file.txt

$ ls -l file.txt
-rwxr-xr-x 1 takuya staff 0 Jul 12 18:58 file.txt*

パーミッションが変更されているのが確認できますね。

では「755」という、よくわからない(今の段階では)ものについて説明します。

意味 
数字

読み取り(r)
4

書き込み(w)
2

実行(x)
1

つまり、「755」というのは「7(4+2+1)5(4+1)5(4+1)」であり、ユーザには全てに権限を、グループとそののユーザには「書き込み」と「実行」する権限を与えているわけです。


スーパーユーザ

ありとあらゆる操作が許可された強い権限を持つユーザがスーパーユーザです。ユーザ名がrootであることから「rootユーザ」とも呼ばれます。スーパーユーザはあらゆる操作が許可された強い権限をもつユーザであり、システムの設定ファイルを変更したり、新しいアプリケーションをインストールしたりすることができますが、強い権限をもつだけにリスクも伴いますので、通常は一般ユーザでログインして操作し、必要な時だけスーパーユーザとして作業するといったことが大切になります。

コマンドとしてsuコマンドとsudoコマンドがありますが、違いは、suコマンドを実行したのちには、exitコマンドでsuperuser状態から抜ける必要があります。ここでは少し題意から外れますので詳しいことは割愛させていただきます。


終わりに

とりあえずpermissionによってエラーが出たら権限を確認し、臨機応変に対処していきたいですね。パーミッションが曖昧だった方の一助になれば幸いです。