Linuxでの `fakeroot`コマンドの必要性


93

なぜfakeroot命令が必要なのですか?単純にsudoor suコマンドを使用することはできませんか?

マニュアルページには次のように書かれています:

fakeroot- ファイル操作のためのルート権限を偽装する環境でコマンドを実行する

About.comのコメント:

偽のルート環境を提供します。このパッケージは、次のようなことを可能にすることを目的としています。dpkg-buildpackage -rfakerootつまり、パッケージビルドのルートになる必要をなくすことです。これは、設定することによって行われるLD_PRELOADまでlibfakeroot.soのラッパーを提供している、getuidchownchmodmknodstat、...、それによって偽のルート環境を作成します。これのいずれかを理解していない場合、あなたは必要ありませんfakeroot

私の質問は、それを単純なsuものとsudoそうでないものを解決する特別な目的は何ですか?たとえば、ubuntuにインストールされているすべてのパッケージを再パックするには、次のコマンドを使用します。

$ fakeroot -u dpkg-repack `dpkg --get-selections | grep install | cut -f1`

次のように、fakerootの代わりにsudoまたはsuを使用して上記のコマンドを実行できますか?

$ sudo dpkg-repack `dpkg --get-selections | grep install | cut -f1`

編集:

ランニング:

$ sudo dpkg-repack `dpkg --get-selections | grep install | cut -f1`

私にこのエラーを与えます:

制御ディレクトリに不正なアクセス権700があります(> = 0755および<= 0775でなければなりません)

なんで?


6
それはあなたが実行することができた場合でも、通常のユーザーとして行うことができるルートすべてとして行うことを避けるために、セキュリティ上の理由のために、良いアイデアであるsudoか、suそれはあなたのマシンですので。fakeroot2つの使用法があります1)あなたが本当にrootユーザーであると信じ込ませるようにプログラムを欺きます。それ以外の場合は、主にtar正しい許可と所有権を持つファイルを作成することができます。これは、ソフトウェアのパッケージ化などに役立ちます。
pqnet 14

1
About.comからの抜粋のメモはそれを要約していると思います。これを理解していないなら、必要はありませんfakerootfakeroot役に立つ状況を考えることができない場合、文字通りそれを必要としません。しかし、実際にそれを必要とする人々は、ユースケースを完全に理解しています。
クリストファーシュルツ

回答:


69

あなたがリモートサーバーで作業する開発者/パッケージメンテナーなどであると想像してください。パッケージの内容を更新し、それを再構築し、kernel.orgからカーネルをダウンロードしてカスタマイズし、ビルドするなどします。これらのことを行おうとすると、いくつかのステップでroot権限が必要になることがわかります(UIDそしてGID0)さまざまな理由(セキュリティ、見落とされた許可など)。ただしroot、リモートマシンで作業しているため、権利を取得することはできません(他の多くのユーザーも同じ問題を抱えています)。これはまさにあるfakerootん:それは効果的なふりをUIDし、GID0のそれらを必要とする環境に。

実際には、実際のroot特権を取得することは決してありません(あなたが言及したことsuとは反対にsudo)。


だから、私はfakerootシステム設定を変更するために使用することはできません?? 実行するコマンドは、rootとして実行されていると見なし、必要な処理を実行します。しませんか?
MRID

3
@mrid「実際には、実際のルート権限を取得することはありません」に注意してください。そのため、アンサーはありません
sakisk

53

fakerootと実際のsudo / suの違いを明確に見るには、次のようにします。

$ fakeroot
# echo "Wow I have root access" > root.tst
# ls -l root.tst
-rw-rw-r-- 1 root root   23 Oct 25 12:13 root.tst
# ls -l /root
ls: cannot open directory /root: Permission denied
# exit
$ ls -l root.tst
-rw-rw-r-- 1 ubuntu ubuntu 23 Oct 25 12:13 root.tst

fakerootシェル内にいる限り、rootであるかのように見えます-root権限を本当に必要とするものを何も試みない限り。そして、これは、パッケージングツールがパッケージを作成するために必要なものであり、あらゆるマシンで意味があります。

実際、パッケージ化にfakerootを使用する場合、達成したいことは、fakerootの下で実行するツールを作成して、ファイルがrootによって所有されていることを確認することです。これ以上でもそれ以下でもありません。そのため、実際には、suまたはsudoは適切なファイル所有権を取得するために機能しません。


偽物は危険ではありませんか?suidビットとrx permを使用してファイルを作成すると、ファイルはrootが所有し、誰でも実行できるrootとして作成されます!または、suidビットの設定が機能しない場合がありますか?
Frizlab

7
ダメ。私は自分でこれを試しました。fakerootの主な理由は、実際にrootになることなく、ビルドパッケージに所有権root:rootを取得することです。ただし、インストールされたパッケージには適切な権限があります。
hanetzer

2
@ ntzrmtthihu777のコメントを読むまでは、非常に混乱していました。
シャーバズ

申し訳ありませんが、説明がわかりません。あなたがrootでなくても文句を言わないように、なぜツールにパッチを当てないのですか?関連する質問として:結局のところ、fakerootの下で作成するファイルは実際にはrootによって所有されていません。これは、そのような.debファイルをインストールしたときに、すべての/usrファイルが呼び出されたユーザーによって所有されていることを意味しませんfakerootか?
ヨハネスシャウブ-litb

@ JohannesSchaub-litb、それはポイントです。ファイルはルートによって所有されていませんが、fakerootシェルの内部では、彼らは彼らのように見えます。このシェル内で.debパッケージが作成されると、ファイル所有者がファイルシステムから読み取られ(fakerootインターセプトして返されるroot)、パッケージに保存されます。パッケージをインストールするとき、パッケージはファイルがルートによって所有される必要があることを示すため、dpkgはルートアクセスを必要とします。
シャーバズ

45

(自分にとって)答えを理解するのは難しく、それを理解するのにいくらかの考えが必要だったので(このコメントは私を理解させてくれました)、うまくいけばもっと良い説明をします。

1. fakerootで何が起こるか

あなた自身のユーザーに何が起こるか以上です。絶対に何もない。もしfakeroot(呼び出されたときに新しいシェルを提供するようsudoに)あなたが許可を必要とするものをするふりをして、終了した場合、絶対に何も起こりません。

考えてみれば、それは時間の無駄です。実際には起こらないことをするのはなぜですか?それは非常識です。あなたは単にそれのどれもしなかったかもしれません、そして、それの痕跡がないので、違いがなかっただろう。

ちょっと待って...

2. fakerootのトレース

の痕跡が残っている可能性がありfakerootます。MortenSickelの回答にあるコマンドを見てみましょう。これは非常に素晴らしく、賛成に値します。

$ fakeroot
# echo "Wow I have root access" > root.tst
# ls -l root.tst
-rw-rw-r-- 1 root root   23 Oct 25 12:13 root.tst
# ls -l /root
ls: cannot open directory /root: Permission denied
# exit
$ ls -l root.tst
-rw-rw-r-- 1 ubuntu ubuntu 23 Oct 25 12:13 root.tst

一見したところ、使用しfakerootたことは時間の無駄でした。結局、を使用していなかった場合fakerootは、同じものが得られます。

ここで微妙なことはこれです:

$ cat root.tst
Wow I have root access

つまり、ファイルのコンテンツはルートであることをまだ覚えています。使用しないとfakeroot同じ結果になると言うかもしれません。あなたは正しい、この例は単純すぎます。

別の例を見てみましょう。

$ fakeroot
# touch x
# touch y
# chown myuser:myuser x
# ls -l > listing
# exit
$ ls -l
total 4
-rw-rw-r-- 1 myuser myuser 152 Jan  7 21:39 listing
-rw-rw-r-- 1 myuser myuser   0 Jan  7 21:39 x
-rw-rw-r-- 1 myuser myuser   0 Jan  7 21:39 y
$ cat listing
total 0
-rw-rw-r-- 1 root   root   0 Jan  7 21:39 listing
-rw-rw-r-- 1 myuser myuser 0 Jan  7 21:39 x
-rw-rw-r-- 1 root   root   0 Jan  7 21:39 y

何が起きたのか見てみましょう。私はあることをふりをroot完全に無効であると、作成したxy。私はふりxに属することmyuseryに属していますroot。彼らは実際には両方に属しますmyuser(最終的に見ることができます)が、私それをそのように見せかけました。

次に、リストを作成し、想像力をファイルに保存しました。後でファイルを振り返ると、ファイルの所有者を想像できます。繰り返しますが、彼らは私が想像した人々によって実際に所有されているのではなく、私は単にそれを想像しました。

3.だから...なぜあなたは再びそれが欲しいのですか?

そのリストを作成するために、私が本当にrootであることを偽造する必要はなかったと言うかもしれません。リストを作成してから、想像力を反映するように編集することもできます。あなたは正しい、あなたはfakerootその必要はありませんでした。実際、それfakerootが実際には何もしないことを知っていれば、以前は持っていなかった能力を獲得することはできません。

しかし、これがfakerootすべてです。リストの編集は簡単ではありません。システムにインストールできるパッケージの場合と同様に、tared、gziped、xzed、bzip2ed、またはファイルをまとめてそれらの許可と所有者を記憶しているその他の形式があります。圧縮ファイルを簡単に変更し、ファイルの所有権を編集できますか?私はあなたのことは知りませんが、方法を考えることはできません。

すべてが圧縮されると、圧縮ファイルを変更し、所有権とアクセス許可をプログラムで編集するツールを構築できますか?はい、できます。したがって、圧縮する前に所有権を偽造するか、後で変更することができます。Debianの人々は、前者のほうが簡単だと判断しました。

4.なぜ単に使用しないのsudoですか?

まず第一に、ソフトウェアを構築するのにルート権限は必要なく、それらを圧縮するのにルート権限は必要ありません。そのため、必要ない場合は、そのアクセス許可を取得することを考えるために、実際にWindowsユーザーである必要があります。しかし、皮肉なことに、rootパスワードさえ持っていないかもしれません。

また、root権限を持っているとしましょう。そして、ファイルにはルートへの読み取りアクセス権のみが必要であると仮定します。したがってsudo、実際にファイルの所有者とアクセス権をに変更するとroot、ルートシェルから抜け出し、すべてをパッケージ化しようとします。ルートアクセス権がないため、ファイルを読み取ることができないため、失敗します。したがってsudo、ルートとしてパッケージを圧縮およびビルドする必要があります。事実上、ルートとしてすべてを行う必要があります。

これはBad TMです。

パッケージャーとして、ルート権限は必要ありませんし、取得するべきではありません。パッケージをインストールするときA、rootとしてファイル()をインストールする必要がある場合があり、そこにroot権限が必要です。すべてfakerootはこれを可能にすることです。パッケージャAがアーカイバのルート所有者としてリストできるため、パッケージがユーザーによって解凍されると、アーカイバはルート権限を要求Aし、ルート所有者として作成します。


5
優れた記事、これはそれを明確にします。
クリスチャンロング

1
So either you could fake the ownerships before compressing, or change them after. Debian people decided the former is easier.これは、「後で変更しないのはなぜですか?」
aaaaaa

1
おかげで、これはモートンの答え@読んだ後、私は持っていた混乱をクリア
ヨハネス・シャウブ- litb

33

知る限り、fakerootは、ファイル操作のためのルート権限を持っているように見える環境でコマンドを実行します。これは、ユーザーがルート許可/所有権を持つファイルを使用してアーカイブ(tar、ar、.debなど)を作成できるようにするのに役立ちます。fakerootがないと、正しい権限と所有権を持つアーカイブの構成ファイルを作成してそれらを圧縮するためのルート権限が必要になります。または、アーカイバーを使用せずにアーカイブを直接構築する必要があります。

fakerootは、ファイル操作ライブラリ関数(chmod()、stat()など)を、実際のユーザーが本当にrootだった場合に実際のライブラリ関数が持つ効果をシミュレートする関数に置き換えることで機能します。

あらすじ:

 fakeroot [-l|--lib library] [--faked faked-binary] [--] [command]  

詳細はこちら:fakeroot


@MaskTheSmokin:それで、fakerootはファイル操作操作のためだけにあなたにスーパーユーザーパワーを与えます。
gkt

@ gkt.pro:はい、そうですね。

10
それは実際にスーパーユーザーのパワーを与えるのではなく、それを偽造するだけです-それで実行されているプログラムは、それが実際にユーザーの通常の特権をまだ使用している間、それはルート特権を持っていると考えます。
パエロエベルマン

2
the program running in it thinks it has root privilegesとroot権限を持つプログラムの違いはどこですか?私が行うことができた場合rm -rf /...それは私がroot権限を持っていると考えて実行し、プログラムを
ユーザー不明

10
@userunknownあなたrmは十分なパーミッションを持っていることのチェックをバイパスすることができるかもしれませんが、カーネル自体はあなたにそれをさせません。unlinkシステムコールは失敗します。これは、権限を処理するだけではアプリケーション次第ではないか、アクセス権をチェックし、あなたがそれをやりたいしない独自のアプリケーションを作成することができるだろう
マイケルMrozek

11

パッケージ構築スクリプトに使用しました。スクリプトを実行している人にルートレベルのアクセス権があるかどうかはわかりませんが、スクリプトは、たとえば、ルートに属するファイルを含むtarファイルを生成する必要がありました。最も簡単な方法は、fakerootの下でパッケージビルドスクリプトを実行することでした。これにより、アーカイバーはファイルがルートに属していると信じ込ませ、アーカイブ内にそれらをパックしました。このようにして、パッケージが(完全に別のマシン上の)宛先マシンに解凍されたとき、ファイルは奇妙なまたは存在しないユーザーに属していませんでした。

それについて考えると、私がこれを見た唯一の場所は、何らかの種類のアーカイブを構築することでした:組み込みシステムのrootfs、tar.gzアーカイブ、rpmパッケージ、.debパッケージなど。


1
fakerootバグのあるパッケージングソフトウェアの回避策です。このようなパッケージを作成するためにrootになる必要はありませんが、事前にファイルシステムに直接設定する以外の方法でファイル許可を指定することはできないため、選択
pqnet 14

3

一般的な使用法の1つは、失敗したバイナリが実際にアクセスしたいファイルを見つけることです。つまり、ハードコーディングされたパスと不適切な例外処理に起因するバグを見つけて修正または回避します。


1

実際にルート権限を持たずにfakerootを使用できます。あなたが持っていた場合su、および/またはsudo、あなたは簡単にあなたのシステムを破壊することができるだろうrm -rf /が、のfakerootで最大で、あなたのホームディレクトリを削除します。


2
それはの必要性を説明しませんfakeroot。自分のホームディレクトリを削除できます。
JMCF125

1

簡単な答え:

suおよびsudoは、rootとしてコマンドを実行します。fakerootは、部分的なサンドボックス配置の外ではありません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.