2012-12-19 53 views
1

我有一個post-receive掛鉤,它調用我的bash腳本(這將拉動本地repo並重新啓動Java服務器)。Git後接收掛鉤失敗:不允許操作

這裏的後收到鉤的所有者信息:

-rwsr-x--x 1 cyril devs 676 19 dec. 14:45 post-receive 

正如你所看到的,我設置此腳本setuid bit才能辦成cyril/devs也爲其他用戶。

這個腳本的內容很簡單:

echo "Running post-receive hook" 
echo "Server will be up and running in about 1 minute" 
/home/project/start_dev restart & 

我的腳本start_dev擁有這些權利:

-rwsr-x--- 1 cyril devs 1515 19 dec. 14:41 start_dev 

注:也setuid.

如果我把東西給服務器帳戶cyril,它完美運作。

如果是別人,與其他賬戶,發送到服務器中,他們得到了:

remote: /home/project/start_dev: line 52: kill: (11490) - Operation not allowed 

(壓井用於停止實例。)

爲什麼他們有這樣的錯誤,腳本應該運行爲cyril,而不是用戶,因此他們應該有權殺死這個實例,對吧?

我在做什麼錯?

感謝您的幫助!

回答

1

顯然,大多數Linux發行版因爲可能導致的巨大安全漏洞而對shell腳本禁用setuid。更多信息heresetuid Wikipedia page

雖然setuid的特點是在許多情況下是非常有用的,如果設置了setuid屬性分配給那些沒有仔細 設計的可執行程序的使用不當會帶來安全風險 。由於潛在的安全問題,當應用於可執行shell腳本時,許多操作系統忽略setuid 屬性。從Tuxation頁面

一個可能的解決方案是做到以下幾點:

#include <stdio.h> 
#include <stdlib.h> 
#include <sys/types.h> 
#include <unistd.h> 

int main() 
{ 
    setuid(0); 
    system("/path/to/script.sh"); 

    return 0; 
} 

然後setuid,得到的C程序,並使用它作爲你的鉤子。還有我寫這篇文章後,該Tuxation頁面上雖然:

與所有的說,運行shell腳本使用setuid不是很安全,而且發行 設計師們的他們在做什麼時,一個不錯的主意其中許多人禁用它。

+0

哇:我該怎麼辦呢?你有好主意嗎? –

+0

添加Tuxation的解決方案。 – asm

+0

感謝您的提示! :) –