我寫了一個文件管理器,現在我想讓用戶輸入密碼,如果他想複製或編輯需要sudo
的文件。我可以用gksudo
或sudo
開始一個程序的新副本,並隱藏當前副本。但是在同一個過程中可以做到嗎?如何在程序中暫停sudo?
我讀過geteuid
和其他一些函數,但我覺得我缺乏一些基本的理解,因爲人對我沒有多大意義。
我寫了一個文件管理器,現在我想讓用戶輸入密碼,如果他想複製或編輯需要sudo
的文件。我可以用gksudo
或sudo
開始一個程序的新副本,並隱藏當前副本。但是在同一個過程中可以做到嗎?如何在程序中暫停sudo?
我讀過geteuid
和其他一些函數,但我覺得我缺乏一些基本的理解,因爲人對我沒有多大意義。
爲了執行純根操作,進程必須以有效的uid開頭,或者具有允許它模擬這種euid(CAP_SETUID)的功能。
有效UID是使用特殊的文件系統屬性設置,所謂的「setuid的」標誌:
# ls -l /bin/su
-rws--x--x 1 root root 36720 Mar 28 2013 /bin/su
記下的「在文件權限標誌。
上面的意思是,當任何用戶運行su
命令時,它將代表可執行文件的所有者運行,在本例中爲root(所以該進程將使用普通用戶標識運行,但有效的用戶標識將是root
用戶)。因此,這樣的過程將能夠做到任何事情root
可以。
另一種更現代的方法是給過程選擇功能,如CAP_SETUID
。這些可以使用命令設置和查詢,並允許更細粒度地控制過程可以做什麼和不可以做什麼。這是否會導致更安全的系統,仍然是一個懸而未決的問題。
https://wiki.archlinux.org/index.php/Using_File_Capabilities_Instead_Of_Setuid
可能出現的安全問題整潔概述:
http://forums.grsecurity.net/viewtopic.php?f=7&t=2522&sid=c6fbcf62fd5d3472562540a7e608ce4e#p10271