Tôi có một quy trình với quyền 4750. Hai người dùng tồn tại trong hệ thống Linux của tôi. Người dùng root và người dùng appz. Quá trình kế thừa quyền của người quản lý quy trình chạy dưới dạng người dùng "appz".cách chính xác để chạy các chương trình setuid trong C
Tôi có hai thói quen cơ bản:
void do_root (void)
{
int status;
status = seteuid (euid);
if (status < 0) {
exit (status);
}
}
/* undo root permissions */
void undo_root (void)
{
int status;
status = seteuid (ruid);
if (status < 0) {
exit (status);
}
status = setuid(ruid);
if (status < 0) {
exit (status);
}
}
dòng chảy của tôi là như sau:
int main() {
undo_root();
do some stuff;
do_root();
bind(port 80); //needs root perm
undo_root();
while(1) {
accept commads()
if (commands needs root user access)
{
do_root();
execute();
undo_root();
}
}
Như bạn có thể thấy tôi muốn thực hiện một số lệnh như root. Tôi đang cố gắng để giảm quyền tạm thời và nếu các nhiệm vụ cần truy cập root tôi quấn lệnh giữa một cuộc gọi do_root và undo_root.
Tuy nhiên có vẻ như chương trình của tôi không hoạt động.
Cách kinh điển để làm điều đó là gì?
Thay vì thoát khi seteuid không thành công, hãy gọi perror() và chương trình của bạn sẽ cho bạn biết tại sao nó không thành công. –
Khi bạn thả quyền root, bạn không thể lấy lại chúng !! – Petesh
Về mặt kỹ thuật, đó là tệp giữ chương trình có quyền 4750, không phải là quá trình. Bạn không trực tiếp nói rằng các điều khoản là 'root: group: 4750' - đó có phải là suy luận an toàn không? –