2014-09-04 41 views
2

...我是在Ubuntu上進行C編程的新手,所以請耐心等待,如果我太過分了。使用u + s權限重新啓動的C程序

我有一個C文件,它在編譯時分配給一個特定的用戶(testUser),並在他們作爲shell登錄時運行。用戶沒有sudo權限的系統有問題。基本上這個shell允許用戶在登錄時更新一個文件(/ var/wwww/testfile),然後重啓系統。當然,重啓會給我一些問題,因爲它們沒有超級用戶權限。

//file: testShell.c 
#include <unistd.h> 
//#include <linux/reboot.h> 

int main(void) 
{ 
    execl("/usr/bin/nano", "nano", "/var/www/testfile", NULL); 
    execl("/usr/bin/shutdown", "shutdown", "-h 0", NULL); 
    //reboot(LINUX_REBOOT_CMD_RESTART); 
    return 0; 
} 
  1. 該文件編譯蠻好testShell
  2. CHOWN根:根testShell
  3. 格蘭特的setuid使用CHMODü+ S testShell
  4. 將文件複製CP testShell/bin
  5. 更新用戶帳號使用shell CHSH -s /斌/ testShell爲testUser

我讀過關於關閉手冊頁和使用重啓程序本身內進行審判(你可以在的這個特定版本見文件,我已經註釋掉了頭文件和調用),但我仍然無法讓這個用戶重啓系統(目前是Ubuntu 12.04)。我甚至嘗試過發佈的「init 6」系統調用here,但都無濟於事。我也讀過使用system()調用並不是一個特別好的主意:我已經嘗試過它,但仍然沒有快樂。

這是我的理解,如果我正確地分配權限,然後SetUID文件,運行該文件的任何人都會隱式地在所有者權限下運行它,在這種情況下是root。實際上,testUser正在更新的/ var/www/testfile屬於root用戶,所以一切正常。

任何想法我錯了嗎?

+0

(我也意識到了shutdown命令不會重新啓動系統,只需將其關閉。在這個時間點,我這等後一個完整的例子m只是試圖讓某些東西起作用,然後從這一點開始向前推進) – bnoeafk 2014-09-04 15:34:59

+0

我認爲應該不可能這樣做,並且沒有sudo權利的人引用明智的命令。該文件由root擁有沒有任何區別。 – Ashalynd 2014-09-04 15:38:40

+0

所以@Ashalynd,你是說我想要達到的是不可能的?我認爲擁有「提升」權限是爲什麼chmod u + s存在? – bnoeafk 2014-09-04 15:53:00

回答

3

這真的很簡單:你直接使用execl來啓動nano並且......如果它正常工作,永遠不會從它返回!

您應該使用fork - exec- wait。

你會發現從SO https://stackoverflow.com/a/19099707/3545273

+0

我剛剛意識到這一點! (我確實說我是一個新手)當我把重新啓動之前,所有其他的,然後我可以重新啓動沒有任何問題... – bnoeafk 2014-09-04 20:08:49

+0

'系統'調用聲譽不好,因爲如果是非常明智的改變環境變量。但我剛剛添加了一個使用'fork-exec-wait'的示例的引用 – 2014-09-04 20:46:50