
chmod
runコマンドを使用すると、なぜユーザー権限が変更されないのか理解できません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*
私は何を逃したことがありませんか?
答え1
Fakerootはすべてのファイルメタデータ変更を実行せず、これが重要です。つまり、Fakerootはその下で実行されるプログラムであるふりをします。 Fakerootは、所有者の変更など、実行できない変更を行いません。また、失敗を引き起こす可能性のある変更は行われません。たとえば、rootは権限に関係なく常にファイルを開くことができるため、rootとして実行すると次のコードが成功します。
chmod 111 a.txt
cp a.txt b.txt
ただし、root以外のユーザーとして実行するとcp
読み取れないため失敗しますa.txt
。これを防ぐために、chmod
fakerootからユーザーの権限は削除されません。
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呼び出しを作成します。
答え2
fakeroot
これは、ルート迷彩機能を実装するために必要な珍しい点です。コードコメントに文書化:
ファイルに書き込めない場合でも、ルートはファイルの所有者に関係なくファイルに書き込むことができます。私たちがfakerootの場合、これをだます唯一の方法は、実際のユーザー(fakerootを起動したユーザー)が常にファイルを書き込み、読み取り可能にすることです。ディレクトリの exec ビットも適用されます。
したがって、内部状態で要求された実際の権限はfakeroot
常に設定され記録されます(このオプションを使用してファイルに保存し、結果ファイルを人間が読み取ることができます)。実際、u=rwx
-s
chmod 155 a.txt
fakeroot chmod 111 a.txt
711
権限のあるファイルが作成されます。