chmodパーミッション計算機をJavaScriptで作った話|「なぜ755なのか」を0から理解する

chmodパーミッション計算機をJavaScriptで作った話|「なぜ755なのか」を0から理解する

Linuxを触り始めると、必ずこの壁にぶつかります。

chmod 755 script.sh

「755って何?なぜこの数字?」と思いながらコピペして、なんとなく動いた経験がある人は多いはずです。

この記事は、Lapis Tech Toolsの chmodパーミッション計算機 を題材に、Linuxのパーミッション(権限)の仕組みとJavaScriptによる実装を、完全初心者向けに解説します。

「数字を覚えるより、仕組みを理解する」——それがこの記事の目標です。


1. なぜLinuxには「権限」があるのか

Linuxは複数のユーザーが同時に使えるOS(マルチユーザーシステム)として設計されました。

一台のサーバーに「管理者」「一般ユーザーA」「一般ユーザーB」が同時にログインして作業していることがあります。このとき:

  • 管理者の設定ファイルを、一般ユーザーが書き換えられたら困る
  • 一般ユーザーAの個人ファイルを、ユーザーBに見られたくない
  • Webサーバー(Apache等)はHTMLファイルを読めないといけないが、書き換えられては困る

これを制御する仕組みが**パーミッション(権限)**です。

なぜWindowsには「chmod」がないのか?

Windowsにも権限管理はありますが、GUIで設定するのが基本でコマンドラインは補助的です。LinuxはもともとサーバーOSとして設計されており、コマンドラインですべてを操作する文化があります。エンジニアの仕事ではLinuxサーバーを扱う機会が多いため、chmodの理解は必須スキルです。


2. 3種類の「誰」と3種類の「何ができるか」

パーミッションは「誰が」「何をできるか」の組み合わせです。

「誰が」:3種類の対象

記号名前意味
uOwner(所有者)そのファイルを作ったユーザー
gGroup(グループ)同じグループに所属するユーザー
oOther(その他)それ以外の全員

「何ができるか」:3種類の権限

記号名前ファイルへの意味ディレクトリへの意味
rRead(読み取り)内容を見られる中のファイル一覧を見られる
wWrite(書き込み)内容を変更・削除できるファイルの作成・削除ができる
xExecute(実行)プログラムとして実行できるそのディレクトリに入れる(cdできる)

ls -l コマンドで見えるこの文字列が、全員分の権限を表しています:

-rwxr-xr-x

 └─ -        : ファイルの種類(-=ファイル、d=ディレクトリ)
    rwx      : 所有者の権限(読み・書き・実行すべて可)
       r-x   : グループの権限(読み・実行のみ可)
          r-x: その他の権限(読み・実行のみ可)

3. なぜ「r=4、w=2、x=1」なのか

ここが最重要ポイントです。なぜこの3つの数字なのでしょう?

答えは「2の累乗」です。

権限2進数(3桁)10進数
r(読み取り)1004
w(書き込み)0102
x(実行)0011

なぜ2の累乗を使うのか?

それぞれの権限を「2進数の1桁」に対応させることで、組み合わせが絶対にかぶらないという性質があります。

  • r+w = 4+2 = 6rw-
  • r+x = 4+1 = 5r-x
  • r+w+x = 4+2+1 = 7rwx

0〜7の8通りで、3つの権限の全組み合わせを一意に表現できます。これが**8進数(0〜7)**と相性が良い理由です。


4. 「755」を読み解く

755 は3桁の数字で、それぞれ「所有者/グループ/その他」の権限を表します。

755
│││
││└── その他: 5 = r-x(読み取り・実行のみ)
│└─── グループ: 5 = r-x(読み取り・実行のみ)
└──── 所有者: 7 = rwx(すべて許可)

所有者だけが書き込め、他の全員は読むだけというのが 755 の意味です。Webサーバーのディレクトリに最適な理由がこれです——Webサーバー(Apache/Nginx)はファイルを読んでブラウザに返すだけでよく、書き込む必要はありません。


5. JavaScriptの実装:3方向の同期

このツールの面白いところは、数値・記号・チェックボックスの3つが常に同期している点です。どれかを変えると他の2つが即座に更新されます。

8進数 → 記号への変換

const permMap = {
  0: '---', 1: '--x', 2: '-w-', 3: '-wx',
  4: 'r--', 5: 'r-x', 6: 'rw-', 7: 'rwx'
};

function octalToSymbolic(octal) {
  let sym = '';
  for (let i = 0; i < 3; i++) {
    sym += permMap[parseInt(octal[i], 10)];
  }
  return sym;
}

// 使用例
octalToSymbolic('755')  // → 'rwxr-xr-x'

755 の各桁(7・5・5)をそれぞれ permMap で対応する記号に変換するだけです。

なぜオブジェクト(permMap)で対応表を作ったのか?

if文で条件分岐を8回書くこともできますが、読みにくくなります。オブジェクトを辞書のように使うと「数字を渡せば記号が返ってくる」という読みやすいコードになります。対応関係が一目でわかり、将来変更するときも1か所を直すだけで済みます。

8進数 → チェックボックスへの変換

function syncFromOctal(val) {
  if (!/^[0-7]{3}$/.test(val)) return; // 不正な入力をガード

  // "755" → "111101101"(各桁を3桁の2進数に変換して連結)
  let binary = val.split('')
    .map(n => parseInt(n, 10).toString(2).padStart(3, '0'))
    .join('');

  // 9個のチェックボックスを順番に更新
  checkboxes.forEach((cb, i) => {
    cb.checked = binary[i] === '1';
  });
}

"755" → 7="111"、5="101"、5="101""111101101" という9桁の2進数に変換し、各桁が"1"かどうかでチェックボックスのON/OFFを決めます。

なぜ一度2進数に変換するのか?

9個のチェックボックスは「各権限ビットのON/OFF」そのものです。8進数の各桁を2進数3桁に展開すると、チェックボックスの並びと1対1で対応します。直接計算するより、2進数に変換してから処理する方が直感的で間違いが起きにくいです。

入力バリデーション

// 数値入力のバリデーション:0〜7の3桁のみ許可
if (!/^[0-7]{3}$/.test(val)) return;

// 記号入力のバリデーション:r/w/x/-の9文字のみ許可
if (!/^[r-][w-][x-][r-][w-][x-][r-][w-][x-]$/.test(sym)) return;

なぜ入力を制限するのか?

ユーザーが 999abc などの無効な値を入力した場合、計算が破綻します。return で早期終了することで、不正な状態のまま処理を続けることを防ぎます。「入力の検証を先に行い、問題があれば何もしない」という考え方は、すべてのプログラムの基本です。


6. UIで気をつけたこと:チェックボックスを採用した理由

数値と記号の入力欄だけにすることもできました。しかしこのツールにはチェックボックスも設けています。

なぜチェックボックスが必要なのか?

「755って何を意味するのか」を視覚的に理解できるからです。数字を打ち込むより、「所有者のWrite(書き込み)のチェックを外す」という操作の方が直感的です。初めてパーミッションを学ぶ人には、チェックのON/OFFと権限の関係を体で覚えてもらいたいという意図があります。

さらに、コマンドプレビューをリアルタイムで表示しています:

chmod 755 file.txt

なぜコマンドをリアルタイムで表示するのか?

このツールの最終的なゴールは「ターミナルで打つコマンドを正確に得ること」です。計算結果の数字を見て自分でコマンドを組み立てるのではなく、そのままコピペできる状態で表示することで、1ステップ手間を省けます。ユーザーがツールを使い終わった後の行動(ターミナルに貼り付ける)まで想像してUIを設計しました。


7. 絶対に覚えておきたい:777は使ってはいけない

chmod 777 /var/www/html  # ← 絶対NG

777 は「所有者・グループ・その他の全員が、読み・書き・実行すべて可能」という意味です。

Webサーバーに 777 を設定するということは、インターネット越しにアクセスしてくる不特定多数の誰かが、サーバーのファイルを書き換えられる状態になります。

「エラーが出たからとりあえず777にしたら直った」——これはドアを全開にして鍵を捨てるのと同じです。エラーの根本原因は別にあります(多くの場合、所有者の設定ミス)。

正解のアプローチ:

# まず現在の所有者を確認
ls -la /var/www/html/

# 所有者をWebサーバーのユーザーに変更(権限ではなく所有者を直す)
# chownコマンドについては → https://tool.lapis-tech.jp/dictionary/linux-cmd-chown
chown -R www-data:www-data /var/www/html/

# 適切な権限を設定
chmod -R 755 /var/www/html/
find /var/www/html/ -type f -exec chmod 644 {} \;

8. まとめ:chmod計算機から学べること

知識の種類学べる内容
OS・システムの基礎マルチユーザーの概念・所有者とグループの関係
数学・進数2進数・8進数・2の累乗の性質
JavaScriptオブジェクトの辞書的活用・正規表現・複数のDOM要素の同期
UI設計複数の入力形式を同期させる設計・コピペしやすいプレビュー表示
セキュリティ最小権限の原則・777の危険性

小さなツールの裏側に、これだけの知識が詰まっています。

パーミッションは最初は難しく感じますが、「3人 × 3権限 = 9ビット = 3桁の8進数」という構造さえ掴めば、あとは計算するだけです。ツールを使いながら、数字と記号とチェックボックスの連動を体で覚えてください。

サーバー上のバックアップスクリプトを定期実行したい場合は、Cronジェネレーターでスケジュール式を作成するのがおすすめです。

→ chmodパーミッション計算機を使ってみる


ツール解説シリーズ:第1回・IP計算機 | 第2回・Base64エンコーダー | 今ここ(第3回・chmod計算機) | 第4回・JSONフォーマッター | 第5回・Cronジェネレーター

この記事をシェアする

関連記事


CHECK IT OUT

Members Only

サブスク加入者限定の コンテンツを配信中

  • 毎月のAI・自動化トレンドレポート
  • クリエイター向け業務効率化テンプレート
  • ツール選定・SaaS比較まとめ(限定公開)
Discord サーバー & LINE 公式の両方で通知します
クリエイター・個人事業主向け 受付中

「これ自動化できないかな?」 そのアイデア、ITで実現できます。

業務の自動化・お客様向けツール開発・AI活用まで、クリエイター・個人事業主専門のITコンサルタントが対応します。まずは気軽にご相談ください。

LINEで相談 フォームで相談