Câu trả lời:
Nếu quy trình đang chạy với quyền root , bạn có thể đính kèm gdb vào quy trình và gọi seteuid từ bên trong quy trình đó.
Thí dụ:
[root@user-desktop ~]# id
uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel) context=user_u:system_r:unconfined_t
[root@user-desktop ~]# gdb /bin/bash $$
GNU gdb Fedora (6.8-27.el5)
# cut copyright & license statements
This GDB was configured as "x86_64-redhat-linux-gnu"...
# cut some initialization output
0x00000036b0a99335 in waitpid () from /lib64/libc.so.6
(gdb) call seteuid(500)
$1 = 0
(gdb) quit
The program is running. Quit anyway (and detach it)? (y or n) y
Detaching from program: /bin/bash, process 29017
[root@user-desktop ~]# id
uid=0(root) gid=0(root) euid=500(user) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel) context=user_u:system_r:unconfined_t
Nếu bạn đang nói về một quá trình thay đổi EUID của riêng mình, có rất nhiều cách để làm điều đó.
Tùy thuộc vào UID hiệu quả của chương trình và liệu có UID đã lưu hay không, bạn có thể chuyển đổi giữa hai giá trị EUID trong chương trình không root. Với một chương trình đặc quyền gốc, bạn phải cẩn thận - bạn phải quyết định xem liệu thay đổi có thể đảo ngược được không, và sử dụng đúng chức năng cho công việc. (Sử dụng setuid () làm root là không thể đảo ngược.)
Nếu bạn đang cố gắng thay đổi một quy trình đã chạy từ một quy trình riêng biệt, thì không có cách tiêu chuẩn nào để thực hiện - và tôi cũng không chắc có nhiều cách không chuẩn. Bạn có thể có thể nhận ra một số thông tin trong / dev / kmem, nhưng biểu hiện 'băng mỏng' xuất hiện trong tâm trí.
Không có cách nào để thực hiện việc này "từ dòng lệnh" đến bất kỳ quy trình đang chạy nào.
Tôi có thể nói rằng với một số chắc chắn; "có lẽ" duy nhất là / Proc và tôi chọc vào đó (theo nghĩa đen và qua google) và rơi vào ngõ cụt liên quan đến bất cứ điều gì trong / Proc cho phép thay đổi EUID. Bạn có thể TÌM HIỂU các cài đặt UID và GID trong / Proc / {pid} / status - nhưng bạn không thể thay đổi chúng bằng cách sử dụng bất cứ thứ gì trong / Proc, ít nhất là theo như tôi có thể nói.
Nhưng thật dễ dàng để làm cho một cái gì đó giống như vậy hoạt động - một cách để thay đổi EUID của một quy trình, từ dòng lệnh - nếu bạn kiểm soát mã nguồn của quy trình bạn muốn thay đổi. Bạn có thể triển khai trình xử lý tín hiệu để nói SIGUSR1 và có quy trình thay đổi EUID của chính nó tuy nhiên bạn cần khi nhận được tín hiệu đó. Sau đó, bạn chỉ cần gửi quy trình mà tín hiệu SIGUSR1, thông qua "kill" ... từ dòng lệnh, như bạn đã hỏi ... và nó sẽ thay đổi EUID cho bạn.
Đây có thể không phải là những gì bạn đã nghĩ đến, nhưng ... đó là một câu trả lời cho câu hỏi của bạn về cách thực hiện ... và đó là câu trả lời duy nhất tôi có thể nghĩ ra.