бит set-UID не работает должным образом
-
26-12-2019 - |
Вопрос
Я использую Raspberry Pi и хотел бы создать исполняемый файл, который просто должен перезагрузить его через несколько секунд.(Я планирую запустить его через ssh и выйти из системы до того, как произойдет фактическая перезагрузка)
Я создал исполняемый файл на C++ с содержимым:
#include <cstdlib>
int main () {
system("sleep 5");
system("reboot");
return 0;
}
ls -l полученного исполняемого файла:
---s--x--x 1 root ben 6191 Jan 10 15:42 reboot
Мой план заключался в том, чтобы использовать бит setuid в сочетании с root в качестве владельца двоичного файла, чтобы команду перезагрузки мог выполнить любой пользователь.
К сожалению, это не работает, и при запуске программы выдает:
Failed to issue method call: Access denied
Must be root.
Любое объяснение, почему это не работает?
Я знаю, что могут быть более простые способы сделать это.Этот вопрос действительно направлен на то, чтобы понять, почему этот способ не работает.
Заранее спасибо и с уважением
Решение
У меня была похожая проблема с битом setuid
и некоторыми версиями bash
.В моем случае решение было написать такую программу:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv)
{
// circumvent busybox ash dropping privileges
uid_t uid = geteuid();
setreuid(uid, uid);
system("do something....");
return 0;
}
.
Я надеюсь, что это тоже поможет вам.
Другие советы
Пока не напрямую отвечайте на ваш вопрос, как насчет разрешения пользователей запускать shutdown
с sudo
?Вы даже можете указать, какие параметры им разрешено использовать (см. Страницу MAN sudoers(5)
).Или создайте скрипт обертки с соответствующими аргументами и позвольте пользователям запускать это.Это может даже проверить, имеет ли он соответствующие права и попытаться повторно выполнить себя через sudo
при необходимости:
#!/bin/sh
if test `id -u` -eq 0; then
# do your stuff - shutdown, poweroff, whatever
else
exec sudo $0 "$@"
fi
. В соответствии с этот документ, system()
на самом деле звонит /bin/sh
, который в некоторых дистрибутивах игнорирует параметр Set-UID bit.
Вы можете попробовать использовать exec()
скорее, чем system()
и напрямую вызывать /sbin/shutdown
?