如何查看linux root uid的uid和euid

linux用户标识UID与有效用户标识EUID
- hao32的个人日志
本文系转载,原文地址:http://keren.blog.51cto.com/908
linux系统中每个进程都有2个ID,分别为用户ID和有效用户ID,UID一般表示进程的创建者(属于哪个用户创建),而EUID表示进程对于文件和资源的访问权限(具备等同于哪个用户的权限)。可以通过函数getuid()和geteuid()或者进程的两个ID值。
当一个用户登陆系统时,系统会将UID和EUID都赋值为/etc/passwd文件中的UID,一般情况下2个ID是相同的,但是某些情况下会出现2个ID不同的情况。
以下通过一个典型问题和代码实例来说明UID和EUID的问题。
【关于linux的passwd命令】
passwd命令是用来修改用户登陆密码的,用来记录用户登陆密码的文件为/etc/shadow,该文件只有root用户具有访问权限,如下所示:
gaolu@gaolu-desktop:~$
gaolu@gaolu-desktop:~$ cd /etc
gaolu@gaolu-desktop:/etc$ ls -l shadow
-rw-r—– 1 root shadow 978
21:25 shadow
gaolu@gaolu-desktop:/etc$
这是出现了矛盾:出于安全考虑,不允许普通用户查看并修改shadow文件;但是如果这样普通用户就无法为自己修改密码。
Linux系统就是使用setuid来解决这个矛盾的问题:如果一个程序被设置了setuid位,那么它无论被哪个用户启用,都会具备程序所有者的权限。而passwd程序的所有者是root用户,passwd的权限如下所示,那么任何用户执行该程序,程序的EUID就会变成root用户的 EUID,而不是执行该程序的UID。
gaolu@gaolu-desktop:/etc$ cd /usr/bin
gaolu@gaolu-desktop:/usr/bin$ ls -l passwd
-rwsr-xr-x 1 root root -06-10 02:10 passwd
gaolu@gaolu-desktop:/usr/bin$
gaolu@gaolu-desktop:/usr/bin$
因此,普通用户可以通过passwd程序修改shadow文件内容,完成密码修改。
【让代码说明问题】
int main(void)
printf(“Current process UID: %ld\n”,(long)getuid());
printf(“Current process EUID: %ld\n”,(long)geteuid());
执行情况:
gaolu@gaolu-desktop:~$ gcc -o uid uid.c
gaolu@gaolu-desktop:~$
gaolu@gaolu-desktop:~$ chmod u+s uid
//用户主增加权限setuid
gaolu@gaolu-desktop:~$ ls -l uid
-rwsr-xr-x 1 gaolu gaolu -08 22:26 uid
gaolu@gaolu-desktop:~$
gaolu@gaolu-desktop:~$ ./uid
Current process UID: 1000
Current process EUID: 1000
gaolu@gaolu-desktop:~$
gaolu@gaolu-desktop:~$ su
//切换到root用户
root@gaolu-desktop:/home/gaolu# ls -l uid
-rwsr-xr-x 1 gaolu gaolu -08 22:26 uid
root@gaolu-desktop:/home/gaolu# ./uid
Current process UID: 0
Current process EUID: 1000
//有效用户ID为1000
root@gaolu-desktop:/home/gaolu#
root@gaolu-desktop:/home/gaolu#
| 可以转载, 转载时务必以超链接形式标明文章和作者信息及版权声明
本文发表于
属于分类 .
You can follow any responses to this entry through the
You can , or
from your own site.
有一条对 &linux用户标识UID与有效用户标识EUID& 的评论下次自动登录
现在的位置:
& 综合 & 正文
linux用户标识UID与有效用户标识EUID
linux系统中每个进程都有2个ID,分别为用户ID和有效用户ID,UID一般表示进程的创建者(属于哪个用户创建),而EUID表示进程对于文件和资源的访问权限(具备等同于哪个用户的权限)。可以通过函数getuid()和geteuid()或者进程的两个ID值。
当一个用户登陆系统时,系统会将UID和EUID都赋值为/etc/passwd文件中的UID,一般情况下2个ID是相同的,但是某些情况下会出现2个ID不同的情况。
以下通过一个典型问题和代码实例来说明UID和EUID的问题。
【关于linux的passwd命令】passwd命令是用来修改用户登陆密码的,用来记录用户登陆密码的文件为/etc/shadow,该文件只有root用户具有访问权限,如下所示:
gaolu@gaolu-desktop:~$gaolu@gaolu-desktop:~$ cd
/etcgaolu@gaolu-desktop:/etc$ ls -l shadow-rw-r----- 1 root shadow 978
shadowgaolu@gaolu-desktop:/etc$这是出现了矛盾:出于安全考虑,不允许普通用户查看并修改shadow文件;但是如果这样普通用户就无法为自己修改密码。Linux系统就是使用setuid来解决这个矛盾的问题:如果一个程序被设置了setuid位,那么它无论被哪个用户启用,都会具备程序所有者的权限。而passwd程序的所有者是root用户,passwd的权限如下所示,那么任何用户执行该程序,程序的EUID就会变成root用户的
EUID,而不是执行该程序的UID。gaolu@gaolu-desktop:/etc$ cd
/usr/bingaolu@gaolu-desktop:/usr/bin$ ls -l passwd-rwsr-xr-x 1 root root
-06-10 02:10
passwdgaolu@gaolu-desktop:/usr/bin$gaolu@gaolu-desktop:/usr/bin$因此,普通用户可以通过passwd程序修改shadow文件内容,完成密码修改。
【让代码说明问题】#include#include#include
int main(void){printf("Current process UID:
%ld/n",(long)getuid());printf("Current process EUID:
%ld/n",(long)geteuid());return 1;}
执行情况:gaolu@gaolu-desktop:~$ gcc -o uid
uid.cgaolu@gaolu-desktop:~$gaolu@gaolu-desktop:~$ chmod u+s uid
//用户主增加权限setuidgaolu@gaolu-desktop:~$ ls -l uid-rwsr-xr-x 1 gaolu gaolu
-08 22:26 uidgaolu@gaolu-desktop:~$gaolu@gaolu-desktop:~$
./uidCurrent process UID: 1000Current process EUID:
1000gaolu@gaolu-desktop:~$gaolu@gaolu-desktop:~$ su
//切换到root用户Password:root@gaolu-desktop:/home/gaolu# ls -l
uid-rwsr-xr-x 1 gaolu gaolu -08 22:26
uidroot@gaolu-desktop:/home/gaolu# ./uidCurrent process UID:
0Current process EUID: 1000
//有效用户ID为1000root@gaolu-desktop:/home/gaolu#root@gaolu-desktop:/home/gaolu#
【上篇】【下篇】博客分类:
传递euid和egid给脚本,使脚本具有特殊用户的权限
使脚本实现类似于设置了stick位的效果
作者:高鹏 &&
shell, python, perl等脚本、程序不能取得suid,因为这些脚本程序需要解释器-/bin/bash, /usr/bin/python等来执行,而这些解释器本身没有suid也不方便设置suid。碰到这种情况可以用c写一个外壳,对这个外壳设置suid,而在c程序里面把自身的uid,gid传递给实际执行任务的脚本。(这个方法是在读周鹏(Roc Zhou &roczhou.zhoup@alibaba-inc.com&)写的工具时学到的)
c程序如下:
/* # ScriptName: transeuid.c
# Author: JH Gao &&
# Create Date:
# Function: transmit euid and egid to other scripts
since shell/python/... scripts can't get suid permission in Linux
usage: transeuid xxx.sh par1 par2 par3
xxx.sh will get the euid and egid from transeuid
# ******************************************************************** */
#include &stdio.h&
#include &stdlib.h&
#include &unistd.h&
#define BUFFSIZE 1024
* usually euid is the uid who run the program
* but when stick is setted to the program
* euid is the uid or the program's owner
int main(int argc, char *argv[]) {
char *cmd = malloc(BUFFSIZE);
// set uid and gid to euid and egid
setuid(geteuid());
setgid(getegid());
cmd = argv[1];
int i = 0;
for(i = 0;i & argc - 1;i++) {
argv[i] = argv[i+1];
argv[argc-1] = NULL
// search $PATH find this cmd and run it with pars:argv
if (execvp(cmd, argv)) {
printf("error");
free(cmd);
free(cmd);
编译这个程序,在给这个程序设置希望取得的用户,再设置suid,然后就可以用这个用户的权限执行脚本或命令了:
$ gcc -t transeuid transeuid.c
$ sudo chown root transeuid
$ sudo chmod +s transeuid
$ ./transeuid ls /root /home
.directory
lost+found
.bash_history
.pulse-cookie
gaopenghigh
浏览: 206089 次
来自: 杭州
收获很大!
lixin3811是的,我也跟你是一个看法。其实在我看 ...
to gaopenghigh因为某些客观原因,我比你大一些。这 ...
To ozzzzz,谢谢你对我的浅见的回应。我还没有你的这样丰 ...
lixin3811 写道我不认识梁,也不用新浪微博。但是我对于 ...
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'Uid euid gid egid关系_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
Uid euid gid egid关系
阅读已结束,下载本文需要
想免费下载更多文档?
定制HR最喜欢的简历
你可能喜欢

我要回帖

更多关于 root uid 的文章

 

随机推荐