linux命令实现:whoami
来源:互联网 发布:莎莎源码网 编辑:程序博客网 时间:2024/05/14 08:21
#whoami
-->root
要实现的就是这个命令,很简单,稍微分析一下:
1.通过系统调用getuid取得执行该程序的UID
2.检索/etc/passwd文件,通过UID寻找到对应的USER_NAME.(/etc/passwd格式 "USER_NAME:x:UID:GID:DESCRIPTION:HOME_DIR:SHELL ")
3.打印USER_NAME
整个过程没什么复杂的,也就检索/etc/passwd,通过UID查找USER_NAME的时候花费了一些时间去想。这算得上我第一次在linux下编程,代码写的有点乱,还有各种不优化的地方,欢迎各位指点。
附上代码:
//2015.5.6#include<stdio.h>#include<string.h>#include<unistd.h>#include<fcntl.h>#include<errno.h>#include<sys/types.h>#define PASSWD "/etc/passwd"#define MAXLEN 1000char swp[MAXLEN];int find(int,char *);void int_to_char(int ,char*);int main(int ac,char *av[]){int w_uid,flag;//UID number;char name_id[30];w_uid = geteuid();if(find(w_uid,name_id) != 1){perror("find error:");return -1;}printf("%s\n",name_id);return 1;}int find(int w_uid,char *name_id){char usr[10],swp_name[30];int fd,lslp,i,j; off_t k;ssize_t rd; int_to_char(w_uid,usr);fd = open(PASSWD,O_RDONLY);if(fd == -1 ){perror("file open error:");return -1;}while((rd=read(fd,swp,MAXLEN))!=0){if(rd == -1 ){perror("read error:");return -2;}lslp=0;j=0;k=0;for(i=0;i<rd;i++){k++;if(swp[i] == ':') lslp++;else if(swp[i] == '\n') {lslp=0;j=0;k=0;}else if(lslp == 0) {swp_name[j++]=swp[i];swp_name[j]=0;}else if(lslp == 2){if(strncmp(swp+i,usr,strlen(usr)) == 0) {strcpy(name_id,swp_name);return 1;}}}int mov;if((mov=lseek(fd,-k,SEEK_CUR))==-1){perror("lseek error");return -3;}//printf("mov----->%d\n",mov);}printf("no find that\n");return 0;}void int_to_char(int x,char *b){char a[10];int i,len=0;for(i=0;x;x/=10,i++){a[i]=x%10+48;}a[i]=0;while(i--)b[len++]=a[i];b[len]='\0';return ;}
后面发现,查找/etc/passwd文件太繁琐了,原来有专门记录uid与username的函数,struct passwd *getpwuid(uid_t uid)
可以直接在shell下执行
$ man getpwuid
查看这个函数及其相关用法,很详细
修改过的代码:
/*2015.5.11 *whoami02.c * */#include<stdio.h>#include<sys/types.h>#include<pwd.h>int main(int ac,char *av[]){ struct passwd *pw=NULL; pw=getpwuid(getuid()); if(pw == NULL){ perror(*av); return -1; } printf("%s\n",pw->pw_name);}
0 0
- linux命令实现:whoami
- Linux命令简单实现 -- whoami
- 实现Linux的whoami命令
- Linux whoami 命令
- linux命令之whoami
- Linux命令——whoami
- Linux命令源代码阅读whoami
- Linux命令who am i,who,whoami
- 每天回顾linux命令(whoami)
- linux whoami cp mv mesg 命令 c语言实现(部分功能)
- whoami实现
- Linux下的whoami,whereis,which,alias命令
- 菜鸟的Linux学习笔记之命令whoami
- Linux命令 whoami 和 who am i 的区别
- Linux入门:常用命令:man、which、whereis、whatis、whoami命令帮助
- Linux常用基本命令 -用户、权限管理who,whoami,exit
- Linux常用命令:whoami
- Linux基础1——控制台、Who命令与Whoami命令比较
- 安卓实习期间整理知识点(十二)
- JSONModel解析数据成Model
- Xcode6文档注释下载地址
- PHP设计模式 三 (适配器 代理模式 数据映射)
- JS技巧:兼容性导出表格为Excel文件
- linux命令实现:whoami
- android shape的使用详解以及常用效果(渐变色、分割线、边框、半透明阴影效果等)
- 我的android studio学习日记
- 阿里巴巴暑期实习用户体验研究员 面试经验+总结
- Android中基于HTTP的通信技术(3)使用HttpClient进行Get方式通信
- Google Map API
- Android eclipse打包提示代码错误解决方法
- Javascript WebSocket使用实例介绍
- leetcode--sqrt(x)