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)
Bạn đã bao giờ tìm ra điều này chưa? – Ibrahim
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). –
@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