ファイルを作成するために Linux システムのすべてのユーザーが使用できる Linux ディレクトリを作成するシナリオを考えてみてください。ユーザーは、このディレクトリで自分の都合に合わせてファイルを作成、削除、または名前変更できます。なぜそのようなディレクトリが作成されるのでしょうか?たとえば、Linux システムには、さまざまな Linux ユーザーが一時ファイルを作成するために使用できる /tmp ディレクトリが存在します。
では、ユーザーが誤ってまたは意図的にファイルを削除 (または名前変更) した場合このディレクトリ内の他のユーザーによって作成されましたか?
この種の問題を回避するために、スティッキー ビットの概念が使用されます。
スティッキー ビットは、ファイルまたはディレクトリの所有者または root ユーザーのみがファイルを削除または名前変更できるようにする、ファイルまたはディレクトリに設定される許可ビットです。他のユーザーが作成したファイルを削除する権限は、他のユーザーには与えられません。
スティッキー ビットの歴史
スティッキー ビットについてさらに説明する前に、スティッキー ビットの歴史について説明しましょう。この情報は議論する価値があります。
スティッキー ビットは新しい概念ではありません。実際、1974 年に Unix オペレーティング システムで初めて導入されました。当時のスティッキービットの目的は異なっていました。プログラムが実行されるたびに導入される時間遅延を最小限に抑えるために導入されました.
プログラムが実行されると、ユーザーが実際にプログラムを使用できるようになるまでに、プログラムをメモリにロードするのに時間がかかります。エディターなどのプログラムがユーザーによって頻繁に使用される場合、起動時間の遅延は当時のオーバーヘッドでした。
この時間遅延を改善するために、スティッキー ビットが導入されました。 OS は、実行可能ファイルのスティッキー ビットがオンの場合、実行可能ファイルのテキスト セグメントがスワップ スペースに保持されていることを確認しました。これにより、プログラムが再度実行されたときに実行可能ファイルを RAM にロードし直すことが容易になり、時間の遅延が最小限に抑えられました。
この方法により、起動時間の遅延を最小限に抑えることができましたが、この操作によって大きな問題が表面化しました。問題は、バグ修正または新機能として何らかのパッチが実行可能ファイルに適用された場合、次の手順を実行する必要があることでした:
- 最初に実行可能ファイルからスティッキー ビットを削除します
- 次に、実行可能ファイルを実行して終了し、スワップからの既存のテキスト セグメントがフラッシュされるようにします
- ここで、再度実行可能ファイルにスティッキー ビットを設定し、実行可能ファイルを再実行して、新しいテキスト セグメントがスワップ メモリに保存されるようにします
上記の手順は、実行可能ファイルに追加された新機能またはバグ修正をプログラムに反映させるために必要でした。
したがって、これが主な問題の 1 つでした。また、テクノロジーの進化に伴い、高速メモリ アクセス技術が進化し、この目的のためのスティッキー ビットの要件が時代遅れになりました。
スティッキー ビットの例
このセクションでは、いくつかの例を使用して、スティッキー ビットを設定および設定解除する方法について説明します。
基本的な例
ディレクトリを作成し、すべてのユーザーにそのディレクトリへの読み取り/書き込み/実行アクセスを提供します:
# mkdir allAccess # chmod 777 allAccess/ # ls -ld allAccess/ drwxrwxrwx 2 himanshu himanshu 4096 Oct 24 15:43 allAccess/
したがって、「allAccess」という名前のディレクトリが作成され、このディレクトリへの読み取り/書き込み/実行アクセスが chmod コマンドを通じてすべてのユーザーに付与されていることがわかります。
ここで、このディレクトリに複数のファイルを (異なるユーザーで) 作成し、すべてのユーザーが読み取り/書き込み/実行アクセス権を持つようにします。
例:
# ls -l allAccess/ total 0 -rwxrwxrwx 1 himanshu himanshu 0 Oct 24 15:48 user1 -rwxrwxrwx 1 guest guest 0 Oct 24 16:11 user_file_0 -rwxrwxrwx 1 guest-2 guest-2 0 Oct 24 16:15 user_file_1
ファイル user_file_0 と user_file_1 は異なるユーザーによって作成されていますが、すべてのユーザーに対して読み取り/書き込み/実行アクセスが許可されています。これは、ユーザー「guest」がユーザー「guest-2」によって作成されたファイルを削除または名前変更できることを意味します。
これを回避するために、ディレクトリ allAccess にスティッキー ビットを設定できます。
ここで、chmod コマンドの +t フラグを使用して、ディレクトリのスティッキー ビットをオンにします。
# chmod +t allAccess/ # ls -ld allAccess/ drwxrwxrwt 2 himanshu himanshu 4096 Oct 24 16:19 allAccess/
ご覧のとおり、ディレクトリの許可ビットに許可ビット「t」が導入されています。
ここで、ユーザー「ゲスト」がファイル「user_file_1」の名前を変更しようとすると、次のようになります:
$ mv /home/himanshu/allAccess/user_file_1 /home/himanshu/allAccess/user_file_0 mv: cannot move `/home/himanshu/allAccess/user_file_1' to `/home/himanshu/allAccess/user_file_0': Operation not permitted
したがって、操作が許可されていないことがわかります。
-t オプションを使用してスティッキー ビットを削除
スティッキー ビットは、chmod コマンドの -t オプションを使用して、ディレクトリのアクセス許可から削除できます。
以下に例を示します:
# chmod -t allAccess/ # ls -ld allAccess/ drwxrwxrwx 2 himanshu himanshu 4096 Oct 24 16:19 allAccess/
そのため、パーミッション ビット「t」がディレクトリから削除されていることがわかります。
このウィキペディアの記事で説明されているように、OS によってスティッキー ビットの動作が異なります。たとえば、ユーザーがファイルの名前を変更しようとすると、Linux はスティッキー ビットのみを検索します。ファイルが削除されている場合、スティッキー ビットはチェックされません。