Tiện ích mở rộng Python mà tôi đã viết yêu cầu quyền truy cập gốc để thực hiện cuộc gọi khởi tạo phần cứng đơn. Tôi không muốn chạy toàn bộ kịch bản như là root chỉ cho một cuộc gọi này trong phần mở rộng của tôi, vì vậy tôi muốn viết một wrapper để làm điều này initialisation trước khi rơi vào quyền người dùng và chạy kịch bản thực tế.Cân nhắc về trình bao bọc setuid
tôi có ý định cho wrapper này để được chạy qua sudo
, ví dụ:
$ sudo devwrap python somescript.py
Tôi đã xem xét một cái gì đó tương tự (cập nhật để sửa chữa một vài lỗi):
int main(int argc, char * argv[])
{
if(argc < 2) return 0;
int res = do_hardware_init();
if(res != OK_VALUE)
{
// Print error message
return HW_ERR;
}
const char *sudo_uid = getenv("SUDO_UID");
if(sudo_uid)
{
int real_uid = (int) strtol(sudo_uid, NULL, 0);
setuid(real_uid);
}
return execvp(argv[1], &argv[1]); // No return if successful
}
Vì vậy, tôi có ba câu hỏi:
- Điều này có vẻ lành mạnh không? Tôi thường không cần phải gây rối với các cuộc gọi * uid(), vì vậy tôi không quen với những cạm bẫy thông thường. Cuộc gọi
execvp
cũng có vẻ kỳ lạ một chút, nhưng theo như tôi có thể thấy nó có đối số ở đúng nơi). - Trang
execvp
trang người đàn ông nói rằng "Mảng môi trường không được truy cập trực tiếp bởi ứng dụng" - điều này có làm cho ý tưởng không đúng làgetenv
không? - Có một cuộc gọi tốt hơn so với
execvp
, vì vậy tôi có thể làmsudo devwrap somescript.py
(lưu ý sự vắng mặt của "trăn")
* Bạn có chắc chắn không có cách nào khác để đạt được nó? * Không, tôi không, nhưng tôi không thể nghĩ ra cách khác. Nếu cuộc gọi khởi tạo không chạy như gốc, nó không thành công, dừng hoàn toàn. Tôi không * nghĩ * rằng nó được yêu cầu cho mỗi quá trình – detly
... nhưng đó không phải là tài liệu. Tôi sẽ ngạc nhiên, mặc dù, nó chỉ có vẻ là bộ nhớ kiểm soát đăng ký bản đồ. – detly
Xin lỗi vì đã quá lâu để chấp nhận điều này. Tôi đã quyết định nhận lời khuyên của bạn và đi theo lộ trình SUID. – detly