2009-09-02 27 views
5

Tôi có một kho lưu trữ git cần chạy một móc hậu nhận như sudo. Nhị phân mà tôi biên soạn để kiểm tra điều này có vẻ như:chạy móc git 'sau khi nhận' với setuid không thành công

#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; 
} 

các geteuid() lấy id chủ sở hữu của post-receive, sau đó cố gắng setuid. Khi chạy ứng dụng này với bất kỳ người dùng nào (kể cả người dùng siêu dữ liệu), nó chạy tập lệnh chính xác như root. Tuy nhiên, khi được kích hoạt bởi git hook thì hệ thống không thể thiết lập uid. Tôi đã thử chạy chmod u+s post-receive Tôi cũng đã thử một số cấu hình khác, nhưng tôi đang hết ý tưởng. Bất kỳ lý do tại sao nó sẽ làm việc trong mọi trường hợp ngoại trừ khi git kích hoạt nó?

btw, nền tảng Ubuntu Server 9,04 (2.6.28-15), git1.6.0.4, gcc phiên bản 4.3.3 (Ubuntu 4.3.3-5ubuntu4)

+0

Bạn đã bao giờ tìm ra điều này chưa? – Ibrahim

+0

Một vấn đề là bạn in một thông báo lỗi nhưng sau đó tiếp tục thực hiện cuộc gọi hệ thống(). Bạn cũng bỏ qua kết quả của cuộc gọi system() và sau đó thoát với trạng thái thành công (0). –

+0

@Blake: Lỗi "-as the- with any user" không rõ ràng - chương trình có chạy đúng khi chạy khi người dùng bạn đang đẩy không? Tôi nghĩ cách gần nhất để sao chép môi trường nó được chạy bởi git sẽ là: 'ssh hostname 'cd/path/to/repo; .git/hooks/post-receive'' – Cascabel

Trả lời

0

thử chạy chương trình của bạn từ dấu nhắc lệnh

+0

Hoạt động tốt khi không kích hoạt thông qua git. –

1
  1. hệ thống tập tin mà các repo git được lưu trữ có thể được gắn kết với các tùy chọn nosuid
  2. Nếu bạn đang đẩy qua ssh khả năng suid thể bị vô hiệu cho các lệnh gọi với ssh (không CAP_SETUID)

Trong mọi trường hợp, những gì bạn đang cố gắng làm là rất khó lường.

1
  1. Chạy chương trình dưới dạng daemon.
  2. Đợi đầu vào trên ổ cắm/tên có tên/msgq.
  3. Trong móc, gửi thư đến daemon của bạn với bất kỳ thông tin nào cần để thực hiện thao tác.
  4. Nếu cần, hãy gửi thư trở lại móc với trạng thái.

Điều này có thể dễ quản lý và bảo mật hơn.

0

Thử viết tập lệnh khởi động. tức là

#/usr/bin/sh 
./your_program 

Sau đó, tạo kịch bản cho móc.

Các vấn đề liên quan