Как узнать, является ли пользователь root или fakeroot?

Я хотел бы знать, является ли пользователь root, не обращая внимания, использует ли этот пользователь инструмент, подобный fakeroot, или нет.

Я попробовал функции getuid(), geteuid() а также getlogin(), но когда я запускаю fakeroot Команда каждого из них отправляет мою собственную информацию учетной записи вместо root,

Для этого кода:

printf("%d %d %s\n", getuid(), geteuid(), getlogin());

Вот что я получаю:

% fakeroot ./busybox rm 
1000 1000 julien

Когда я хотел бы получить что-то вроде:

0 0 root

(логина будет достаточно)

2 ответа

Решение

nneonneo правильно понял причину, но вот решение: Fakeroot-ng. Оно использует ptrace и перехват системных вызовов, а не LD_PRELOAD и перехват вызовов библиотеки, что делает его совместимым со статическим связыванием, намного более устойчивым и даже способным обрабатывать вызовы, сделанные из libc (которые в противном случае не были бы подключаемыми).

Это выглядит, как будто ваш бинарный (busybox) компилируется против статического libc, fakeroot использует динамическую предварительную загрузку библиотеки для перехвата и замены вызовов на различные libc функции, но это работает, только если ваш двоичный файл динамически связан с libc, Если он статически связан, вызовы функций связаны с реальными вызовами внутри двоичного файла, поэтому перехватить их невозможно.

Другие вопросы по тегам