lsのファイルパーミッションを8進表記にする

7-1.管理
~$ ls -l
合計 16
drwxr-xr-x 2 takk takk 4096  5月  8 17:41 dir1
drw------- 2 takk takk 4096  5月  8 14:50 dir2
-rwx------ 1 root root   23  5月  8 18:01 file1
-rwxr-xr-x 1 root root   23  5月  8 14:51 file2
~$ 

ls -lで表示される情報には、ファイルパーミッションがあります。
各ユーザからのアクセス権限を表している情報です。

ls

rは、リード可能(readable)
wは、ライト可能(writable)
xは、実行可能(executable)
dは、ディレクトリの意味です。
drwxの順序で表します。

ls表示の上から見ていきます。
dir1は、drwxr-xr-xで、所有者の権限としてdrwx、つまりすべての権限が与えられています。所有者は、takkとなっていますので、dir1に関しては、ユーザtakkは何でもできるわけです。
グループユーザと他ユーザに関してはr-xとなっています。つまり所有者以外のユーザはライトができません。また、xは実行権限の意味ですが、付与先がディレクトリの場合は、ディレクトリ切り替え可能の意味となります。
次に、dir2は、所有者の権限としてdrw-となっています。xがついていませんので、所有者であっても、このディレクトリにcdすることはできません。

~$ cd dir2
-su: cd: dir2: 許可がありません
~$ 

このディレクトリに所有者なのにcdできないのは困りますね。
でも大丈夫です。所有者の権限にwがついています。ライト可能ですから、dir2のパーミッションを変更することができます。では、このディレクトリへcd可能となるようにファイルパーミッションを変更してみましょう。
ファイルパーミッションを変更するには、chmodコマンドを使います。ch(チェンジ)mod(モード)の略です。

~$ chmod 700 dir2
~$ cd dir2
~/dir2$ 

700と指定しましたが、rwx各パーミッションの状態を8進数に読み替えて指定しました。
突然8進数が出てきましたが、コマンドラインにおいて8進数を大いに使うのはこの時ぐらいです。しかも実運用上で、8進数のすべての組み合わせが使われるわけではありません。
ユーザが作成したファイルにおいて、書き込み可能であれば、読み込みも当然可能でしょうし、実行可能なら、リード可能でもあるはずです。パターンとして以下の5種類ぐらいでしょうか。8進表記は覚えてしまいましょう。

よくあるパーミッションパターン
— 2進で000、8進で0
r– 2進で100、8進で4
r-x 2進で101、8進で5
rw- 2進で110、8進で6
rwx 2進で111、8進で7


所有者、グループユーザ、他ユーザ
-rwx—— 700 所有者のみ全権限
-rw-r–r– 644 全員が閲覧可能、書き換えは所有者のみ
-rwxr-xr-x 655 全員が実行可能、書き換えは所有者のみ
-rwxrwx— 770 他ユーザだけ何もできない

前置きが長くなりましたが、8進数なら3桁で表現できるのに、ls -lのrwxの表現は9文字。文字数が多いです。
あくまで私見ですが、ほんの少しだけ読み取りづらく感じます。そこで、このパーミッション表記を8進表現するlsを作ってみたいと思います。

~$ ls -l | perl -pe '
s|---|0|g;
s|r--|4|g;
s|r-x|5|g;
s|rw-|6|g;
s|rwx|7|g;
'
合計 16
d755 2 takk takk 4096  5月  8 17:41 dir1
d700 2 takk takk 4096  5月  8 14:50 dir2
-700 1 root root   23  5月  8 18:01 file1
-755 1 root root   23  5月  8 14:51 file2
~$ 

rwx-の各文字を01に置換して、2進から8進変換する方法もありますが、
パターンが少ないので、置換を並べる形にしました。

置換前文字に-(ハイフン)が使われていますので、s///gの形ではなく、以下のスタイルをとっています。

s|置換前|置換後|g;

コマンドラインの入力を見て分かるように、s|||を使うと、|が罫線に見えて、視認性アップです。

上記ではlsを整形しましたが、statのフォーマット出力を使っても、lsと似たような表示が行えます。
しかもパーミッションの情報はオプションのみで8進指定ができます。
(以下でsedを使っているのは日時の簡潔化のためです)

~$ stat -c"%a %U %G %s %y %n" * | sed s/\\..*900//
755 takk takk 4096 2016-05-08 17:41:17 dir1
700 takk takk 4096 2016-05-08 14:50:53 dir2
700 root root 23 2016-05-08 18:01:12 file1
755 root root 23 2016-05-08 14:51:38 file2
~$ 

後は、エイリアスや関数等で、ll等で実行できるようにしておいて、
ls -lの代わりに使えば良いです。

ちなみに、オプションを指定せずにstatを使うと以下のようにたくさんの情報が表示されます。

~$ stat dir1
  File: `dir1'
  Size: 4096      	Blocks: 8          IO Block: 4096   ディレクトリ
Device: 821h/2081d	Inode: 786437      Links: 2
Access: (0755/drwxr-xr-x)  Uid: ( 1004/    takk)   Gid: ( 1004/    takk)
Access: 2016-05-08 17:41:24.981708750 +0900
Modify: 2016-05-08 17:41:17.125709019 +0900
Change: 2016-05-08 17:41:17.125709019 +0900
 Birth: -

コメント

タイトルとURLをコピーしました