2009-09-02 57 views
5

我有一個git倉庫需要運行post-receive鉤子作爲sudo。我編譯測試這個二進制樣子:運行git'post-receive'鉤子setuid失敗

#include <stdlib.h> 
#include <unistd.h> 
#include <stdio.h> 

int main() { 
    int ret; 
    ret = setuid(geteuid()); 
    if(!ret) { 
     fprintf(stderr, "error setting uid %d \n", ret); 
    }  
    system("[...command only sudo can access...]"); 

    return 0; 
} 

geteuid()檢索的post-receive所有者ID,然後試圖對setuid。當與任何用戶(包括超級用戶)一起運行時,它以root用戶身份正確運行腳本。但是,當由git鉤子觸發時,系統無法設置uid。我試過運行chmod u+s post-receive我也嘗試了一些其他配置,但我的想法已經不多了。任何理由爲什麼它會在所有情況下工作,除非當git觸發它?

順便說一句,平臺Ubuntu服務器9.04(2.6.28-15),git1.6.0.4,gcc版本4.3.3(Ubuntu的4.3.3-5ubuntu4)

+0

你有沒有想過這個? – Ibrahim 2009-12-23 07:09:21

+0

一個問題是,您打印一條錯誤消息,但繼續執行system()調用。您也可以忽略system()調用的結果,然後以成功(0)狀態退出。 – 2010-02-06 04:18:04

+0

@Blake:「與任何用戶一起使用」的位都不清楚 - 當你像用戶那樣運行時,程序是否正確運行?我認爲最好的方式來複制git所運行的環境:'ssh hostname'cd/path/to/repo; .git/hooks/post-receive'' – Cascabel 2010-04-03 16:53:00

回答

0

嘗試從命令提示符

運行程序
+0

未通過git激活時可正常工作。 – 2010-07-31 00:10:05

1
  1. 在git倉庫存儲可以安裝與nosuid選項
  2. 如果你正在推動通過ssh的SUID能力可能與SSH(不CAP_SETUID)
調用的命令禁用文件系統0

無論如何,你試圖做的事情是非常不明智的。

1
  1. 將程序作爲守護程序運行。
  2. 等待套接字/命名管道/ msgq上的輸入。
  3. 在掛鉤中,發送一條消息給你的守護進程,無論它需要什麼信息來執行操作。
  4. 如果需要,發送消息回到掛鉤狀態。

這可能會更容易妥善管理和保護。

0

嘗試編寫引導腳本。即

#/usr/bin/sh 
./your_program 

然後讓腳本成爲鉤子。