it-swarm-ru.tech

Для чего нужна команда `fakeroot` в Linux?

Зачем нам вообще нужна команда fakeroot? Разве мы не можем просто использовать команды Sudo или su?

На странице руководства написано:

fakeroot - запустить команду в среде, подделывающей привилегии root для манипулирование файлами

About.com говорит:

Дает поддельную корневую среду. Этот пакет предназначен для включения чего-то вроде: dpkg-buildpackage -rfakeroot То есть, чтобы убрать необходимость получения прав root для сборки пакета. Это делается установкой LD_PRELOAD до libfakeroot.so, который предоставляет обертки вокруг getuid, chown, chmod, mknod, stat, ..., создавая тем самым подделку корневая среда. Если вы не понимаете ничего из этого, вам не нужно fakeroot!

Мой вопрос в том, что особого назначения это решает, чего не могут простые su или Sudo? Например, для перепаковки всех установленных пакетов в Ubuntu мы даем следующую команду:

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

Можем ли мы выполнить приведенную выше команду с Sudo или su вместо fakeroot следующим образом:

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

EDIT:

Бег:

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

дает мне эту ошибку:

контрольный каталог имеет неправильные разрешения 700 (должно быть> = 0755 и <= 0775)

Есть причина почему?

102
gkt

Представьте, что вы разработчик/сопровождающий пакета и т.д. Работаете на удаленном сервере. Вы хотите обновить содержимое пакета и перестроить его, загрузить и настроить ядро ​​с сайта kernel.org, собрать его и т.д. Пытаясь сделать это, вы обнаружите, что для выполнения некоторых действий требуется root права (UID и ​​GID 0) по разным причинам (безопасность, пропущенные разрешения и т. д.). Но получить права root невозможно, так как вы работаете на удаленной машине (и у многих других пользователей такая же проблема, как и у вас). Именно это и делает fakeroot: он притягивает действительные UID и ​​GID 0 к среде, которая их требует.

На практике вы никогда не получите настоящие root привилегии (в отличие от su и ​​Sudo, которые вы упомянули).

70
sakisk

Чтобы ясно увидеть разницу между 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 не будут работать для получения правильного владения файлами.

56
MortenSickel

Поскольку ответы трудно понять (для меня самого), и потребовалось некоторое время, чтобы понять их ( этот комментарий заставил меня понять это), я собираюсь дать, надеюсь, лучшее объяснение.

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, что совершенно неэффективно, и создал x и ​​y. Я сделал вид, что x принадлежит myuser, а y - root. На самом деле они оба принадлежат myuser (как мы видим в конце), но я просто сделал вид так и должно быть.

Затем я создал список и сохранил свое воображение в файл. Позже, когда я оглядываюсь назад на файл, я вижу, кому я полагал, что файлы должны принадлежать. Опять же, они на самом деле не принадлежат людям, которых я представлял, я просто представлял это.

3. Итак ... Почему вы хотите это снова?

Вы можете сказать, что мне не нужно было выдавать себя за root, чтобы создать этот список. Я мог бы просто создать список, а затем отредактировать его, чтобы отразить мое воображение. Вы правы, вам не нужно fakeroot для этого. На самом деле, зная, что fakeroot на самом деле ничего не делает, вы, возможно, не могли получить никакой способности, которой у вас не было раньше.

Но , и в этом суть fakeroot, редактирование списка может быть нетривиальным. Как и в случае пакета, который может быть установлен в вашей системе, у вас есть tared, gziped, xzed, bzip2ed или любой другой формат, который хранит ваши файлы вместе и запоминает их разрешения и владельцев. Можете ли вы легко изменить сжатый файл и отредактировать владельца файла? Я не знаю о вас, но я не могу придумать способ.

Может ли быть встроен инструмент, который, после того как все будет сжато, изменяет сжатый файл и программно редактирует права собственности и разрешения? Да, может. Так что либо вы можете подделать владения до сжатия, либо поменять их после. Люди Debian решили, что с первым легче.

4. Почему бы просто не использовать Sudo?

Прежде всего, вам не нужны привилегии root для сборки программного обеспечения, и вам не нужны привилегии root для их сжатия. Так что если вам это не нужно, вам действительно нужно быть пользователем Windows, чтобы даже подумать о получении этого разрешения. Но сарказм в стороне, у вас может даже не быть пароля root.

Кроме того, допустим, у вас есть права root. Допустим, вы хотите сделать вид, что файл должен иметь доступ только для чтения к корню. Таким образом, вы Sudo, фактически меняете владельца файла и права доступа на root, вы выходите из корневой оболочки и пытаетесь упаковать все. Вы потерпели неудачу, потому что теперь вы не можете больше читать файл, так как у вас нет прав root. Таким образом, вы должны Sudo, сжать и собрать пакет как root. По сути, вы должны делать все как root.

Это плохоTM,.

Как упаковщик, вам не нужны права root и вы не должны его получать. Когда вы устанавливаете пакет, вам может потребоваться установить некоторый файл (A) от имени пользователя root, и именно здесь вам потребуются права доступа root. Все, что делает fakeroot, - это делает это возможным. Он позволяет пакетировщику перечислить A как принадлежащего пользователю root для архиватора, так что, когда пакет распаковывается пользователем, архиватор требует разрешения root и создает A как принадлежащий root.

49
Shahbaz

AFAIK, fakeroot запускает команду в среде, в которой он имеет привилегии root для манипулирования файлами. Это полезно для того, чтобы позволить пользователям создавать архивы (tar, ar, .deb и т.д.) С файлами в них с правами root/владельцем. Без fakeroot нужно было бы иметь права суперпользователя для создания составных файлов архивов с правильными разрешениями и владельцем, а затем упаковать их, иначе придется создавать архивы напрямую, без использования архиватора.

fakeroot работает путем замены функций библиотеки управления файлами (chmod (), stat () и т. д.) на функции, имитирующие эффект, который могли бы оказать реальные функции библиотеки, если бы пользователь действительно был пользователем root.

Синопсис:

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

Проверьте больше здесь: fakeroot

33
herbalessence

Я использовал его для скриптов сборки пакетов. Я не был уверен, что тот, кто запускает скрипт, имеет доступ к корневому уровню, но скрипту все еще нужно было создать, скажем, tar-файл, который содержал файлы, принадлежащие root. Простейший способ сделать это - запустить скрипт сборки пакета в fakeroot, который обманом заставил архиватора поверить, что файлы принадлежат root, и упаковал их как таковые в архив. Таким образом, когда пакет был распакован на конечный компьютер (на другом компьютере), файлы не принадлежали странным или несуществующим пользователям.

Размышляя об этом, единственное место, где я видел это, было для создания какого-то архива: rootfs встроенных систем, архивов tar.gz, пакетов rpm, пакетов .deb и т.д.

11
Dysaster

Одно из распространенных применений - выяснить, к каким файлам действительно хотел получить доступ сбойный двоичный файл. Таким образом, обнаружение и исправление или устранение ошибок, вызванных жестко закодированными путями и неправильной обработкой исключений.

3
Eero Ketonen

Простой ответ:

su и Sudo запускают команды от имени пользователя root. fakeroot нет, за исключением его частичной песочницы.

1
jdmayfield

Вы можете использовать fakeroot, фактически не имея привилегий root. Если у вас есть su и ​​/ или Sudo, вы сможете уничтожить вашу систему с помощью простого rm -rf /, но с максимальным значением fakeroot вы удалили бы свой домашний каталог.

1
gabrielhidasy