chmodコマンドとは?
chmod(change mode)は、ファイルやフォルダーを誰が読み取り、書き込み、実行できるかを設定するLinuxとUnixのコマンドです。すべてのファイルには3組のパーミッションがあります:所有者用、グループ用、そしてそれ以外の全員(others、その他のユーザー)用です。上の計算機は、この9つのチェックボックスを chmod が受け付ける数字や文字に変換し、その逆の変換も行います。
chmod にモードを指定する方法は2つあります:chmod 755 script.sh のような8進数と、chmod u+x script.sh のような記号表記です。ファイルのパーミッションを変更できるのは、そのファイルの所有者かrootだけです。

Linuxのファイルパーミッションの仕組み
各パーミッションには値があります:読み取り = 4、書き込み = 2、実行 = 1。クラスごとに合計すると0〜7の数字が1つ得られ、それを所有者、グループ、その他の順に3桁並べます。つまり rwx は 4+2+1 = 7、r-x は 4+0+1 = 5、rwxr-xr-x は 755 です。
ls -l を実行すると、同じ内容が -rwxr-xr-x のように文字で表示されます。最初の1文字はファイルの種類(通常のファイルは -、ディレクトリは d、シンボリックリンクは l)で、その後に所有者、グループ、その他の rwx が3組続きます。ダッシュは、そのパーミッションがオフであることを意味します。
それぞれの文字は、ファイルとフォルダーで意味が少し異なります:
ファイル: 開いて内容を読み取れます。フォルダー: ls で中の名前を一覧表示できます。
ファイル: 内容を変更できます。フォルダー: 中のファイルを作成、削除、名前変更できます(フォルダーの実行権限も必要です)。ファイルを削除できるかどうかは、ファイルではなくフォルダーの書き込み権限で決まります。
ファイル: プログラムやスクリプトとして実行できます。フォルダー: cd で中に入り、ファイルを名前で開けます。読み取りがあって実行がない場合、フォルダー内の名前は一覧表示できますが、中のものは何も開けません。
u はファイルの所有者、g はそのグループ、o はそれ以外の全員です。Linuxは自分に一致する最初のクラスだけを使います。所有者であれば、グループやその他の権限のほうが多くを許可していても、自分には適用されません。
Advertisement
よく使うchmodのパーミッションと使いどころ
以下のモードで、実際のほとんどのケースをカバーできます。その多くは計算機のプリセットボタンにもなっています。
ほとんどのファイルのデフォルトです:Webページ、画像、秘密でない設定ファイルなど。所有者は編集でき、それ以外のユーザーは読み取りだけできます。
ディレクトリや、誰でも実行してよいプログラムやスクリプトのデフォルトです。変更できるのは所有者だけです。
所有者だけが読み書きできます。SSHの秘密鍵、.env ファイル、APIトークンなど、パスワードを含むものに使います。
所有者だけがフォルダーを開いたり一覧表示したりできます。~/.ssh や個人用スクリプトのフォルダーの標準です。
所有者が編集し、1つのグループ(たとえばWebサーバーのグループ)が読み取り、それ以外は誰もファイルを見られません。
所有者はフルアクセス、グループはフォルダーを開いて読み取りでき、その他のユーザーは締め出されます。
所有者とグループの両方が編集できます。複数のユーザーがグループを共有するチームのサーバーでよく使われます。
所有者とグループは中のファイルを作成・削除でき、その他のユーザーは見ることだけできます。
所有者だけが読み取れ、誰も書き込めません。AWSでは、ダウンロードした .pem キーペアをSSHで使う前に chmod 400 を実行するよう案内しています。
マシン上のすべてのユーザーとプロセスが読み取り、変更、実行できます。次のセクションで説明するとおり、正しい解決策であることはほとんどありません。
chmod 755・644・777の違い
755と644の違いは実行ビットだけです。755では誰でもファイルを実行したりフォルダーを開いたりできますが、644ではできません。そのため、一般的なルールはフォルダーは755、ファイルは644です。フォルダーは中に入るために実行権限が必要ですが、ほとんどのファイルは実行されるべきではありません。
777は、Webサーバーのユーザーを含め、マシン上のすべてのアカウントに書き込み権限を与えます。サーバー上のサイトやスクリプトが1つでも乗っ取られると、攻撃者はファイルを変更・置換したり、ページにマルウェアを仕込んだり、バックドアを設置したりできてしまいます。「Permission denied」で失敗したときの本当の解決策は、たいてい777ではなく、正しい所有者(chown)やグループを設定することです。
よくあるケースごとの推奨パーミッション:
Webサイトのファイル(HTML、PHP、画像):
644。Webサイトのフォルダー:755。WordPressやほとんどのホスティングのコントロールパネルが推奨している設定です。wp-config.php など、データベースのパスワードを含むファイル:WordPressは、サーバー上の他のユーザーが読めないよう
440または400を推奨しています。600や640でも、所有者が編集できる状態のまま非公開にできます。Webサーバーが書き込む必要があるアップロード用やキャッシュ用のフォルダー:
777を使うのではなく、Webサーバーのグループに書き込み権限を与える(775)か、Webサーバーのユーザーを所有者にします。~/.ssh フォルダー:
700。秘密鍵(id_ed25519、id_rsa):600または400。authorized_keys:600。公開鍵(.pub):644。実行したいシェルスクリプト:
755、自分だけが実行する場合は700。chmod +x script.shなら、他のビットはそのままで実行権限だけを追加できます。
Advertisement
SSH鍵の「Permissions 0644 are too open」を解決する
SSHは、他のユーザーが読み取れる秘密鍵を無視し、WARNING: UNPROTECTED PRIVATE KEY FILE! に続けて Permissions 0644 for '/home/you/.ssh/id_rsa' are too open と表示します。chmod 600 ~/.ssh/id_rsa(または chmod 400)を実行してから、もう一度接続してください。サーバー側でも、デフォルトの StrictModes yes 設定では、authorized_keys、~/.ssh、ホームフォルダーのいずれかがグループやその他のユーザーから書き込み可能だと、SSHデーモンは authorized_keys を無視します。
パーミッションが正しいのに接続できない場合は、サーバーのポート22が開いているか確認しましょう。
特殊なパーミッション:setuid、setgid、sticky bit(スティッキービット)
先頭に4桁目を付けると、3つの特殊ビットを追加できます:4 = setuid、2 = setgid、1 = sticky。他の桁と同じように足し算するので、6755 はsetuidとsetgidの両方です。ls -l では実行の文字の位置に表示され、所有者またはグループの位置には s、その他の位置には t が入ります。
Linuxの注意点:GNUの chmod 755 dir(および chmod 0755 dir)は、ディレクトリに設定済みのsetuidやsetgidビットをそのまま残します。消去するには、chmod g-s dir(両方のビットなら chmod a-s dir)で明示的に指定するか、chmod 00755 dir のように5桁で指定します。
setuidが付いたプログラムは、実行したユーザーではなく、ファイルの所有者の権限で動作します。多くのLinuxシステムでは /usr/bin/passwd が 4755(-rwsr-xr-x)になっており、一般ユーザーでもrootが所有するパスワードファイルを更新できます。Linuxはシェルスクリプトとディレクトリのsetuidを無視します。
プログラムに付けると、ファイルのグループの権限で動作します。フォルダーに付けるとより便利で、中に作成された新しいファイルはフォルダーのグループを受け継ぎ、新しいサブフォルダーもsetgidを継承します。2775 は、チームの共有フォルダーの定番のモードです。
フォルダーに付けると、誰でも書き込めるフォルダーであっても、ファイルの削除や名前変更ができるのはファイルの所有者、フォルダーの所有者、rootだけになります。/tmp が 1777(drwxrwxrwt)なのはこのためです。Linuxはファイルのsticky bitを無視します。
ls -l で大文字の S や T が表示されるのは、特殊ビットは設定されているが、同じ位置の実行ビットが設定されていないことを意味します。たとえば、4644 は rwSr--r--、1666 は rw-rw-rwT と表示されます。
Advertisement
記号表記:u、g、o、aと+、-、=
記号表記では、現在の設定を基準にパーミッションを変更できます。これは単純な8進数ではできないことです。記号表記は3つの部分からなります:対象(u 所有者、g グループ、o その他、a 全員)、演算子(+ 追加、- 削除、= 正確に設定)、パーミッション(r、w、x、さらに s と t)です。複数の変更は、スペースを入れずにカンマで区切ります。
対象の文字を付けない chmod +x file は3つのクラスすべてが対象になりますが、umaskでブロックされるビットは除かれます。一般的なumask 022 であれば、a+x と同じです。
chmod u+x deploy.sh:所有者がスクリプトを実行できるようにし、他は何も変更しません。chmod go-w report.txt:グループとその他のユーザーから書き込み権限を削除します。chmod o= secrets.txt:その他のユーザーからすべての権限を取り除きます。chmod a+r index.html:全員がファイルを読み取れるようにします。chmod u=rwx,g=rx,o=rx app:755を記号表記で書いたものです。計算機では、どのモードでもこの形式を表示します。chmod -R u=rwX,go=rX public_html:大文字の X は、フォルダーと、すでに実行可能なファイルにだけ実行権限を追加します。そのため、フォルダーは755、通常のファイルは644になります。
umask:新規ファイルのデフォルトのパーミッション
umaskは、新しく作成されるファイルとフォルダーのパーミッションを決めます。ほとんどのプログラムはファイルを 666(rw-rw-rw-)、フォルダーを 777 で作成し、umaskで立っているビットがすべてオフになります。一般的なumask 022 では、新しいファイルは644、新しいフォルダーは755になります。
これは引き算ではなく、ビット単位のマスクです。umask 027 ではファイルは 640 になりますが、666から027を桁ごとに引くと、有効なモードにすらなりません。計算機のUmaskタブを開けば、任意の値での結果を確認できます。
022:ファイル644、フォルダー755。通常のデフォルトです。002:ファイル664、フォルダー775。作成したものをグループのメンバーが編集できます。ユーザーごとに専用のグループがある環境でよく使われます。027:ファイル640、フォルダー750。その他のユーザーには何も許可しません。サーバーに適した選択です。077:ファイル600、フォルダー700。完全に非公開です。umaskで現在の値を、umask -Sで文字表記を確認でき、umask 027で現在のシェルの値を変更できます。設定を維持するには、このコマンドを~/.bashrcや~/.profileに追加します。
Advertisement
chmod計算機の使い方
所有者、グループ、その他のそれぞれで読み取り、書き込み、実行にチェックを入れるか、644や755などのプリセットをクリックします。各行の数字はその場で表示されます。
750 や 2775 のような8進数を入力するか、rwxr-x--- のような記号表記の文字列を貼り付けます。drwxr-sr-x のような ls -l の文字列全体にも対応しており、ファイルの種類も表示されます。
Setuid、Setgid、Stickyにチェックを入れると、4桁のモードが得られます。sticky bitなしで誰でも書き込めるモードになると、警告が表示されます。
ファイル名またはフォルダー名を入力し、ディレクトリツリー全体が対象なら再帰にチェックを入れて、数値形式または記号形式の chmod コマンドをコピーします。ページのアドレスにはモードが保存される(例:?mode=750)ため、ブックマークや共有ができます。
chmodコマンドの例
LinuxまたはmacOSのターミナルで実行します。ファイルが他のユーザーやrootのものである場合は、先頭に sudo を付けます。
chmod +x deploy.sh # 実行権限を追加
chmod 755 deploy.sh # またはモード全体を設定
./deploy.shfind /var/www/html -type d -exec chmod 755 {} +
find /var/www/html -type f -exec chmod 644 {} +chmod -R 755 folder # ファイルも実行可能になる
chmod -R u=rwX,go=rX folder # フォルダー755、ファイル644chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_ed25519 ~/.ssh/authorized_keys
chmod 644 ~/.ssh/id_ed25519.pubstat -c '%a %n' file # Linux: 644 file
stat -f '%Lp %N' file # macOS: 644 file
stat -f '%Mp%Lp %N' file # macOS(特殊ビット付き): 0644 filechgrp developers /srv/project
chmod 2775 /srv/project # 新しいファイルはdevelopersグループになるその他の開発者ツール
開発者やシステム管理者向けのその他の無料ツールです。すべてブラウザ内で動作します。ファイルやレコードに一意のIDが必要なら、UUID生成ツールをお試しください。