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