2014-01-10 1 views
2

Я запускаю малиновый pi и хотел бы создать исполняемый файл, который просто должен перезагрузить его через несколько секунд. (Я планирую запуск его через SSH и выйти перед фактическим перезагрузка происходит)бит set-UID не работает по назначению

Я создал исполняемый файл с 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 

План my теперь должен использовать бит setuid в сочетании с корнем в качестве владельца двоичного файла, так что команда перезагрузки может быть выполнена любым пользователем.

К сожалению, это не работает, и при запуске программы она дает мне:

Failed to issue method call: Access denied 
Must be root. 

Любое объяснение, почему это не работает?

Я знаю, что могут быть более простые способы сделать это. Этот вопрос действительно направлен на понимание того, почему этот способ не работает.

Заранее спасибо и С уважением

+1

Я извиняюсь за задержку. Я попробовал ваш ответ, и это действительно сработало. Спасибо. – ben

ответ

2

Я имел аналогичный вопрос с 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; 
} 

Я надеюсь, что это тоже поможет.

0

В соответствии с документом this, system() фактически вызывает /bin/sh, который в некоторых дистрибутивах игнорирует опцию Set-UID bit.

Вы можете использовать exec(), а не system() и напрямую ссылаться на /sbin/shutdown?

1

Если вы не ответите прямо на свой вопрос, как насчет того, чтобы пользователи могли запускать shutdown с помощью sudo? Вы даже можете указать, какие параметры им разрешено использовать (см. Справочную страницу sudoers(5)). Или создайте скрипт-оболочку с соответствующими аргументами и разрешите пользователям запускать это. Он даже может проверить, имеет ли он соответствующие права и попытаться повторно выполнить себя через sudo при необходимости:

#!/bin/sh 
if test `id -u` -eq 0; then 
    # do your stuff - shutdown, poweroff, whatever 
else 
    exec sudo $0 "[email protected]" 
fi 

 Смежные вопросы

  • Нет связанных вопросов^_^