Compare commits

...

12 Commits

Author SHA1 Message Date
9480a710ee Fakeroot - 0.0.1 2025-02-06 14:08:22 +03:00
b36a47b2df Fakeroot 2024-11-22 19:44:32 +03:00
c638a35432 plemya-x 2024-06-01 16:10:03 +03:00
b5c16221ff Update go.mod 2024-06-01 15:49:20 +03:00
8b34ccd530 Update go.mod 2024-06-01 15:48:58 +03:00
a407c76760 Update go.mod
module plemya-x.ru/fakeroot
2024-06-01 15:37:08 +03:00
Elara Musayelyan
b2da39c1be Add README section about nesting 2023-10-24 13:51:52 -07:00
Elara Musayelyan
d34dcaca37 Propagate exit code for nsfakeroot command 2023-10-24 13:03:22 -07:00
Elara Musayelyan
bb05559c1f Add pkgsite badge 2023-10-23 21:58:39 -07:00
Elara Musayelyan
4c69f15363 Add nsfakeroot to README 2023-10-23 21:56:50 -07:00
Elara Musayelyan
c9e6f61ce1 Rename cmd/gofakeroot to cmd/nsfakeroot 2023-10-23 21:49:32 -07:00
Elara Musayelyan
b130d64a68 Add tests 2023-10-23 17:01:08 -07:00
7 changed files with 122 additions and 16 deletions

4
.gitignore vendored
View File

@@ -1 +1,3 @@
/gofakeroot
/nsfakeroot
.idea
.gigaide

21
LICENSE
View File

@@ -1,6 +1,6 @@
MIT License
Copyright (c) 2023 Elara Musayelyan
Copyright (c) 2024 Евгений Храмов
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
@@ -19,3 +19,22 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
---
MIT License
Copyright (c) 2024 Евгений Храмов
Разрешение настоящим предоставляется, бесплатно, любому лицу, получающему копию этого программного обеспечения и
сопроводительной документации (далее "Программное обеспечение"), располагать Программным обеспечением без ограничений,
включая, но не ограничиваясь правами на использование, копирование, модификацию, объединение, публикацию,
распространение, передачу sublicenses и/или продажу копий Программного обеспечения, а также разрешать лицам,
которым Программное обеспечение предоставлено, делать это, при соблюдении следующих условий:
Вышеуказанное уведомление об авторских правах и данное уведомление о разрешении должны быть включены во все копии или
значительные части Программного обеспечения.
ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ПРЕДОСТАВЛЯЕТСЯ "КАК ЕСТЬ", БЕЗ ГАРАНТИЙ КАКОГО-ЛИБО ВИДА, ЯВНЫХ ИЛИ ПОДРАЗДЕЛЯЕМЫХ,
ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ, ГАРАНТИЯМИ ТОРГОВОЙ ПРИГОДНОСТИ, ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЕННЫХ ЦЕЛЕЙ И НАРУШЕНИЯ.
В НИКАКОМ СЛУЧАЕ АВТОРЫ ИЛИ ДЕРЖАТЕЛИ АВТОРСКИХ ПРАВ НЕ НЕСУТ ОТВЕТСТВЕННОСТИ ЗА ЛЮБЫЕ ИСКИ, УБЫТКИ ИЛИ
ИНЫЕ ОТВЕТСТВЕННОСТИ, НЕЗАВИСИМО ОТ ТОГО, ВОЗНИКЛИ ЛИ ОНИ В РЕЗУЛЬТАТЕ ДЕЙСТВИЯ ДОГОВОРА, ПРАВОНАРУШЕНИЯ ИЛИ
ИНЫМ ОБРАЗОМ, В СВЯЗИ С, ИЛИ В РЕЗУЛЬТАТЕ ИСПОЛЬЗОВАНИЯ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ ИЛИ ДРУГИХ ОТНОШЕНИЙ С НИМ.

View File

@@ -1,17 +1,40 @@
# fakeroot
A pure-Go implementation of fakeroot using Linux user namespaces.
Чистая реализация fakeroot на Go с использованием пространств имен пользователей Linux.
a
### Что такое fakeroot?
### What is fakeroot?
Fakeroot — это утилита, которая запускает команды в среде, где они кажутся имеющими права суперпользователя, хотя на самом деле это не так. [Оригинальная команда](https://salsa.debian.org/clint/fakeroot/) fakeroot делает это, перехватывая вызовы функций библиотеки libc, таких как `stat()`, `chmod()`, `chown()` и т. д., и заменяя их на функции, которые возвращают значения, делающие видимым, что пользователь является суперпользователем.
Fakeroot is a utility that runs commands in an environment where they appear to have root privileges even though they don't. The [original `fakeroot` command](https://salsa.debian.org/clint/fakeroot/) does this by intercepting calls to libc functions like `stat()`, `chmod()`, `chown()`, etc. and replacing them with ones that return values that make it seem like the user is root.
### Чем эта библиотека отличается?
### How is this library different?
Вместо внедрения собственных функций libc эта библиотека использует встроенные функции изоляции ядра Linux, чтобы создать своего рода контейнер, где пользователь является суперпользователем. Это означает, что даже программы, не использующие libc (такие как программы на Go), или программы с статически связанной libc, будут думать, что они работают от имени root.
Instead of injecting custom libc functions, this library uses the Linux kernel's built-in isolation features to make a sort of container where the user is root. That means even programs that don't use libc (such as Go programs), or programs with a statically-linked libc, will believe they're running as root. However, this approach will only work on Linux kernels new enough (3.8+) and on distros that don't disable this functionality. Most modern Linux systems support it though, so it should work in most cases.
Вы также можете вложить этот тип fakeroot до 32 раз, в отличие от оригинального варианта на основе libc, который совсем не поддерживает вложение.
### Why?
Однако этот подход будет работать только на достаточно новых ядрах Linux (3.8+) и на дистрибутивах, которые не отключают эту функциональность. Тем не менее, большинство современных систем Linux поддерживают это, так что в большинстве случаев это должно работать.
Many utilities depend on file permissions and user ownership. For instance, the tar command creates files within a tar archive with the same permissions as the original files. This means that if the files were owned by a specific user, they will retain that ownership when the tar archive is extracted. This can become problematic when building packages because it could lead to system files in a package being owned by non-root users. By making it seem as if the current user is root and therefore all the files are owned by root, fakeroot tricks utilities like `tar` into making its files owned by root.
### Почему?
Also, many utilities may require root privileges for certain operations but might return errors even when the specific task doesn't necessarily need those elevated permissions. Fakeroot can be used to execute these programs without actually granting them root privileges, which provides some extra security.
Многие утилиты зависят от прав доступа к файлам и принадлежности пользователей. Например, команда tar создает файлы в архиве tar с теми же правами, что и у оригинальных файлов. Это означает, что если файлы принадлежали конкретному пользователю, они сохранят эту принадлежность при извлечении архива tar. Это может стать проблемой при создании пакетов, поскольку это может привести к тому, что системные файлы в пакете будут принадлежать пользователям, не являющимся суперпользователями. Создавая иллюзию, что текущий пользователь является суперпользователем и поэтому все файлы принадлежат root, fakeroot обманывает утилиты, такие как tar, заставляя их создавать свои файлы с правами root.
Кроме того, многие утилиты могут требовать права суперпользователя для определенных операций, но могут возвращать ошибки, даже если конкретная задача не требует этих повышенных прав. Fakeroot можно использовать для выполнения этих программ, не предоставляя им реально права суперпользователя, что обеспечивает дополнительную безопасность.
### nsfakeroot
Этот репозиторий включает утилиту командной строки под названием `nsfakeroot`. Чтобы установить его, выполните следующую команду:
```sh
go install gitea.plemya-x.ru/Plemya-x/fakeroot/cmd/nsfakeroot@latest
```
Запуск `nsfakeroot` самостоятельно начнет вашу оболочку входа в среде fakeroot. Если вы предоставите аргументы, они будут использоваться как команда.
Примеры:
```sh
nsfakeroot # -> (login shell)
nsfakeroot whoami # -> root
nsfakeroot id -u # -> 0
nsfakeroot id -g # -> 0
```

View File

@@ -5,9 +5,10 @@ import (
"fmt"
"log"
"os"
"os/exec"
"lure.sh/fakeroot"
"lure.sh/fakeroot/loginshell"
"gitea.plemya-x.ru/Plemya-x/fakeroot"
"gitea.plemya-x.ru/Plemya-x/fakeroot/loginshell"
)
func main() {
@@ -26,7 +27,7 @@ func main() {
args []string
err error
)
if flag.NArg() > 1 {
if flag.NArg() > 0 {
cmd = flag.Arg(0)
args = flag.Args()[1:]
} else {
@@ -46,13 +47,15 @@ func main() {
c.Stderr = os.Stderr
err = c.Run()
if err != nil {
if err, ok := err.(*exec.ExitError); ok {
os.Exit(err.ExitCode())
} else if err != nil {
log.Fatalln(err)
}
}
func printHelp() {
fmt.Print("Fakeroot implementation written in Go.\n\n")
fmt.Print("Go implementation of fakeroot using Linux user namespaces.\n\n")
fmt.Print("Usage: fakeroot [cmd] [args...]\n\n")
fmt.Print("Arguments:\n")
fmt.Print(" [cmd] Command to execute in fakeroot environment. If not specified, the user's login shell will be executed.\n")

59
fakeroot_test.go Normal file
View File

@@ -0,0 +1,59 @@
package fakeroot_test
import (
"errors"
"os/exec"
"syscall"
"testing"
"gitea.plemya-x.ru/Plemya-x/fakeroot"
)
func TestCommand(t *testing.T) {
cmd, err := fakeroot.Command("whoami")
if err != nil {
t.Errorf("Unexpected error while creating command: %q", err)
}
data, err := cmd.CombinedOutput()
if err != nil {
t.Errorf("Unexpected error while executing command: %q", err)
}
if sdata := string(data); sdata != "root\n" {
t.Errorf("Expected %q, got %q", "root\n", sdata)
}
}
func TestCommandUIDError(t *testing.T) {
cmd := exec.Command("whoami")
cmd.SysProcAttr = &syscall.SysProcAttr{
UidMappings: []syscall.SysProcIDMap{
{
ContainerID: 0,
HostID: 1000,
Size: 1,
},
},
}
err := fakeroot.Apply(cmd)
if !errors.Is(err, fakeroot.ErrRootUIDAlreadyMapped) {
t.Errorf("Expected error %q, got %q", fakeroot.ErrRootUIDAlreadyMapped, err)
}
}
func TestCommandGIDError(t *testing.T) {
cmd := exec.Command("whoami")
cmd.SysProcAttr = &syscall.SysProcAttr{
GidMappings: []syscall.SysProcIDMap{
{
ContainerID: 0,
HostID: 1000,
Size: 1,
},
},
}
err := fakeroot.Apply(cmd)
if !errors.Is(err, fakeroot.ErrRootGIDAlreadyMapped) {
t.Errorf("Expected error %q, got %q", fakeroot.ErrRootGIDAlreadyMapped, err)
}
}

2
go.mod
View File

@@ -1,3 +1,3 @@
module lure.sh/fakeroot
module gitea.plemya-x.ru/Plemya-x/fakeroot
go 1.21

0
go.sum Normal file
View File