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

93

Зачем нам вообще нужна 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`

РЕДАКТИРОВАТЬ:

Бег:

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

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

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

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

GKT
источник
6
по соображениям безопасности рекомендуется избегать выполнения от имени пользователя root всего, что может сделать обычный пользователь, даже если вы можете запустить его sudoили suпотому, что это ваша машина. fakerootимеет два применения: 1) обманывает программы, заставляя их верить, что вы действительно являетесь пользователем root, что может потребоваться некоторым плохо написанным проприетарным программам, даже если в этом нет необходимости (как правило, разработчик Windows - Linux), и 2) разрешать эмуляцию режима файла и изменений владельца, которые вы не захотите. в противном случае это можно сделать, главным образом, для создания tarфайла с правильными разрешениями и владельцем, что полезно, например, при упаковке программного обеспечения.
pqnet
1
Я думаю, что примечание в выдержке из About.com подводит итог: если вы не понимаете ничего из этого, вам не нужно fakeroot! Если вы не можете придумать ситуацию, когда fakerootэто полезно, то вам это буквально не нужно. Но люди, которые действительно нуждаются в этом, полностью понимают сценарий использования.
Кристофер Шульц

Ответы:

69

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

На практике вы никогда не получите реальные rootпривилегии (в противоположном suи sudoчто вы говорите).

sakisk
источник
так я не могу использовать fakerootдля изменения настроек системы ?? Потому что команда, которую мы будем запускать, будет думать, что она работает от имени пользователя root, и делать то, что мы хотим, чтобы она делала. не так ли?
17
3
@mrid Обратите внимание: «На практике вы никогда не получите настоящих привилегий root». Так что ответ - нет
Сакиск
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 не будут работать для получения правильного владения файлом.

MortenSickel
источник
Разве Факер не опасен? Если я создам файл с битом suid и rx perm, файл будет создан с правами пользователя root, исполняемый кем-либо, как пользователь root! Или, может быть, установка бит suid не сработает?
Frizlab
7
Не хорошо. Я попробовал это сам. Основная причина для fakeroot состоит в том, чтобы получить права владения root: root в встроенные пакеты, фактически не будучи root. Установленные пакеты будут иметь правильные права доступа.
Hanetzer
2
Все было очень запутанно, пока я не прочитал комментарий @ ntzrmtthihu777!
Шахбаз
Извините, я не понимаю описание. Почему бы не исправить инструменты, чтобы они не жаловались, если вы не root? Как связанный вопрос: в конце концов, файлы, которые вы создаете в fakeroot, на самом деле не принадлежат пользователю root. Не означает ли это, что когда я устанавливаю такой .debфайл, все мои /usrфайлы принадлежат тому, кто звонил пользователю fakeroot?
Йоханнес Шауб -
@ JohannesSchaub-litb, нет, в этом все дело. Файлы не принадлежат пользователю root, но внутри fakerootоболочки они выглядят так, как они есть. Когда внутри этой оболочки создается пакет .deb, владелец файла считывается из файловой системы (которая fakerootперехватывает и возвращает root) и сохраняется в пакете. При установке пакета dpkg тогда требуется доступ с правами root, поскольку пакет указывает, что файл должен принадлежать пользователю root.
Шахбаз
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, что совершенно неэффективен, и создал 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.

Это Плохая ТМ .

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

Shahbaz
источник
5
Отличная рецензия, это проясняет.
Кристиан Лонг
1
So either you could fake the ownerships before compressing, or change them after. Debian people decided the former is easier.Это помогло мне, так как я продолжал думать «почему бы не изменить его после?».
аааааа
1
Спасибо, это устраняет путаницу,
возникшую
33

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

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

Синопсис:

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

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


источник
@MaskTheSmokin: Таким образом, fakeroot дает вам супер пользовательские полномочия только для операций с файлами, верно.
gkt
@ gkt.pro: я думаю, да.
10
На самом деле он не дает супер-пользователю полномочий, он лишь подделывает его - программа, работающая в нем, считает, что у него есть привилегии root, хотя она все еще использует обычные привилегии пользователя.
Паŭло Эберманн
2
В чем разница между the program running in it thinks it has root privilegesпрограммой и привилегиями root? Если я могу сделать a rm -rf /и программу, при запуске она думает, что у меня есть привилегии root ...
пользователь неизвестен
10
@userunknown Вы можете обойти rmпроверку наличия достаточных разрешений, но само ядро ​​не позволит вам сделать это; unlinkсистемный вызов потерпит неудачу. Не только приложение обрабатывает разрешения, либо вы сможете написать свое собственное приложение, которое не проверяет разрешения и делает с ним все, что вы хотите
Майкл Мрозек
11

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

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


источник
1
fakerootэто обходной путь для программного обеспечения с ошибочными пакетами: нет причин, по которым вам нужно быть пользователем root для создания таких пакетов, но поскольку они не позволяют указывать права доступа к файлам каким-либо иным способом, кроме как устанавливать их непосредственно в файловую систему, прежде чем у вас нет Выбор
pqnet
3

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

Ээро Кетонен
источник
1

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

gabrielhidasy
источник
2
Это не объясняет необходимость fakeroot. Вы можете удалить свой домашний каталог как вы сами.
JMCF125
1

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

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

jdmayfield
источник