chmod
コマンドをfakeroot
で実行したときに、ユーザーの権限が変更されない理由がわかりません。
最初、ファイルには次の権限があります。
-rwxr-xr-x a.txt*
Chmodを使用してファイルの権限を変更しようとすると、正常に機能します。
chmod 111 a.txt
---x--x--x a.txt*
fakeroot
で実行すると、うまく機能しないようです。グループやその他の権限を正しく設定しますが、ユーザーの権限は設定しません。 chmod
コマンドの最初の値に関係なく、読み取りと書き込みのアクセス許可が設定されます。
fakeroot chmod 111 a.txt
-rwx--x--x a.txt*
私は何かが足りないのですか?
Fakerootは、すべてのファイルメタデータの変更を実行するわけではありません。それがポイントです。それは、その下で実行されるプログラムのふりをするだけです。 Fakerootは、所有者の変更など、実行できない変更を実行しません。また、将来的に障害を引き起こすような変更も実行しません。たとえば、rootは権限に関係なく常にファイルを開くことができるため、rootとして実行すると、次のコードは成功します。
chmod 111 a.txt
cp a.txt b.txt
ただし、root以外のユーザーとして実行すると、a.txt
を読み取れないため、cp
は失敗します。これを回避するために、fakerootの下のchmod
はユーザーから権限を削除しません。
Fakerootは、実行中のプログラムの変更を実行するふりをします。
$ stat -c "Before: %A" a.txt; fakeroot sh -c 'chmod 111 a.txt; stat -c "In fakeroot: %A" a.txt'; stat -c "After: %A" a.txt
Before: -rwx--x--x
In fakeroot: ---x--x--x
After: -rwx--x--x
一般的に、fakeroot内で行われたファイルメタデータの変更は、fakeroot呼び出しに耐えることが保証されていません。それがポイントです。メタデータの変更と、変更されたメタデータで実行する操作(アーカイブのパッキングなど)の両方を実行する単一のfakeroot呼び出しを行います。
これはfakeroot
の癖であり、ルートマスカレード機能を実装するために必要です。 as コードコメントに記載 :
ファイルが書き込み可能でない場合でも、rootは(ファイルの所有者に関係なく)そのファイルに書き込むことができます。私たちがfakerootである場合、これを偽造する唯一の方法は、実際のユーザー(fakerootを開始した)がファイルを常に書き込み可能、読み取り可能などにすることです。ディレクトリのexecビットにも当てはまります。
したがって、fakeroot
は常にu=rwx
を設定し、要求された実際のアクセス許可を内部状態で記録します(これは、-s
オプションを使用してファイルに保存できます。結果のファイルは人間です-読み取り可能)。実際には、
chmod 155 a.txt
fakeroot chmod 111 a.txt
711
権限を持つファイルになります!