2014-01-10 29 views
2

我正在運行一個樹莓派,並希望創建一個可執行文件,只需幾秒鐘就可以重新啓動它。 (我打算通過ssh觸發它和註銷實際重新啓動發生之前)設置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 

我的計劃是現在將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位選項。

您可以嘗試使用exec()而不是system()並直接調用/sbin/shutdown

1

雖然沒有直接回答你的問題,但如何讓用戶運行shutdownsudo?您甚至可以指定允許使用哪些選項(請參閱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