UID是系統中用來表示用戶的標識符,啓動的進程的uid就是當前登陸用戶的uid,查看用戶uid可以使用id -u <username>
命令linux
須要注意的是,權限檢查的時候是對euid檢查,一般狀況下進程的euid是和uid相同的。shell
euid即effective user id ,有效用戶ID。編程
用於文件訪問檢查,euid和決定了進程是否有訪問某個文件的能力。例如,編寫下面代碼:ui
/* testeuid.c */ #include <stdio.h> #include <unistd.h> #include <fcntl.h> int main(int argc, char * argv[]) { if (argc != 2) return 0; printf("uid: %d\teuid: %d\n", getuid(), geteuid()); printf("trying to open %s\n", argv[1]); int fd = open(argv[1], O_RDONLY); if (fd < 0) perror("open"); else printf("success\n"); return 0; }
編譯並運行spa
上述執行過程當中,將a.file
擁有者改成root並修改訪問權限爲root只讀後,我以eureka用戶的身份沒法訪問該文件。unix
看APUE發現本身對suid不是特別瞭解,查資料以後明白了,記錄以下。code
參考文章:blog
上面連接中的文章說的很準確,SUID即(Set Owner User ID up on execution)get
在執行時設置爲全部者ID,一個例子就是/usr/bin/passwd
這個可執行文件。
$ ls /usr/bin/passwd -rwsr-xr-x 1 root root 54256 May 17 2017 /usr/bin/passwd
從上面passwd
的屬性能夠看到,權限位中有個s
,這就是suid。
passwd
這個命令是用來修改密碼的,而密碼文件是/etc/shadow
,且查看密碼文件的屬性能夠看到它的擁有者是root,root可讀寫,用戶組可讀的。
/tmp $ ls -l /etc/shadow │ -rw-r----- 1 root shadow 1711 Mar 30 17:00 /etc/shadow
既然這個文件是root可讀寫,那非root用戶修改密碼要怎麼辦呢?
這時候就要說的suid了,當非root用戶調用passwd
修改密碼時,此時的euid將會變爲passwd
的擁有者用戶,即root用戶,這樣就能夠修改密碼了。
與其說suid是一個id,不如說它是文件的一個標誌,它標誌着這個可執行文件在執行時的euid將會被修改成它擁有者的uid。
下面編程實驗:
/* testsuid.c */ #include <stdio.h> #include <unistd.h> #include <fcntl.h> int main(void) { printf("uid: %d euid:%d", getuid(), geteuid()); }
編譯後執行
上面的chmod u+s
是給文件加上usid標誌,而從上面的結果能夠看出進程的uid和euid是能夠不一樣的。