web-dev-qa-db-ja.com

権限の変更に関する問題

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*

私は何かが足りないのですか?

3
Sabin Harnagea

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権限を持つファイルになります!

1
Stephen Kitt