shell who命令令和whoami的区别

C语言(37)
摘要:who是一个linux下重要的系统内建指令,编写who命令,需要了解相关的数据结构struct utmp。同时进一步熟悉结构化数据的读取和访问方法。另外总结了系统调用相关的知识。
本文来源:
1.who程序的编写
#include&stdio.h&
#include&unistd.h&
#include&stdlib.h&
#include&fcntl.h&
#include&utmp.h&
#include&time.h&
#define SHOWHOST
int show_info(struct utmp *utbufp);
void showtime(long);
int main(int arv, char *arg[])
struct utmp current_
int reclen=sizeof(struct utmp);
if((utmpfd = open(UTMP_FILE,O_RDONLY))==-1)
perror(UTMP_FILE);
while(read(utmpfd,¤t_record,reclen)==reclen)
show_info(¤t_record);
close(utmpfd);
int show_info(struct utmp *utbufp)
if(utbufp-&ut_type!=USER_PROCESS)
printf(&%-8.8s&,utbufp-&ut_name);
printf(& &);
printf(&%-8.8s&,utbufp-&ut_line);
printf(& &);
showtime(utbufp-&ut_time);
printf(& &);
#ifdef SHOWHOST
printf(&%-8.8s&,utbufp-&ut_host);
printf(&\n&);
void showtime(long timeeval)
p=ctime(&timeeval );
printf(&%12.12s&,p+4);
1)从who命令的man文档可以查看到它与utmp这个文件有关,进而man utmp这个文件,可以找到这个头文件和utmp这个结构体的一些信息。
2)open,write,close,seek,creat是与文件读写有关的系统调用,我们在下一篇博客里总结它们。
3)与时间有关的函数ctime,我们将用一篇文章总结它们。
4)同样,知道了登录信息是存在UTMPFILE,那么我们可以进一步编写注销信息,实际上就是将改写该文件中的数据而已。下面是注销的代码:
2.注销程序的编写
#include&stdio.h&
#include&unistd.h&
#include&stdlib.h&
#include&utmp.h&
#include&fcntl.h&
#include&sys/types.h&
#include&string.h&
#include&time.h&
int main(int argc, char *argv[])
char *termname=argv[1];
logout(termname);
int logout(const char *ttyname)
int utmpunitlen=sizeof(struct utmp);
if ((fd=open(UTMP_FILE,O_RDWR))==-1)
perror(&can not open file:&);
return -1;
while(read(fd,&utmpunit,utmpunitlen )==utmpunitlen)
printf(&%s
%s\n&,ttyname,utmpunit.ut_line );
if(strstr(ttyname,utmpunit.ut_line)!=NULL)
printf(&find the login account\n&);
utmpunit.ut_type=DEAD_PROCESS;
utmpunit.ut_time=time(NULL);
if(lseek(fd,-utmpunitlen,SEEK_CUR)!=-1)
if(write(fd,&utmpunit,utmpunitlen)==utmpunitlen)
if(close(fd)==-1)
perror(&can not close file:&);
return -1;
注意,注销的是当前终端,当前终端的名称可以用tty获得,作为命令行参数
3.析who,whoami,who am i
先看看这三个命令的输出信息:
[rocrocket@rocrocket ~]$ whoami
[rocrocket@rocrocket ~]$ who am i
rocrocket pts/3 & & & & 13:17 (:0.0)
[rocrocket@rocrocket ~]$ who
rocrocket :0 & & & & &
rocrocket pts/0 & & & & 09:55 (:0.0)
rocrocket pts/1 & & & & 09:57 (:0.0)
rocrocket pts/3 & & & & 13:17 (:0.0)
当我用sudo su(或者sudo su -)更换到root用户之后,你再看看:
[rocrocket@rocrocket ~]$ sudo su
[root@rocrocket rocrocket]# whoami
[root@rocrocket rocrocket]# who am i
rocrocket pts/3 & & & & 13:17 (:0.0)
[root@rocrocket rocrocket]# who
rocrocket :0 & & & & &
rocrocket pts/0 & & & & 09:55 (:0.0)
rocrocket pts/1 & & & & 09:57 (:0.0)
rocrocket pts/3 & & & & 13:17 (:0.0)
看出区别来了吧,whoami显示的是当前“操作用户”的用户名,而who am i显示的是“登录用户”的用户名。
4.结构化提取utmp数据:
4.1.getutent函数
头文件:#include &utmp.h&
定义函数:struct utmp *getutent(void);
函数说明:getutent()用来从utmp 文件(/var/run/utmp)中读取一项登录数据, 该数据以utmp 结构返回. 第一次调用时会取得第一位用户数据, 之后每调用一次就会返回下一项数据, 直到已无任何数据时返回NULL。
4.2.getutmp函数
& &#define _GNU_SOURCE & & & & & & /* See feature_test_macros(7) */
& & & &#include &utmpx.h&
& & & & void getutmp(const struct utmpx *ux, struct utmp *u);
& & & & void getutmpx(const struct utmp *u, struct utmpx *ux);
DESCRIPTION
& & & &The getutmp() function copies the fields of the utmpx structure pointed
& & & &to by ux to the corresponding fields of the utmp structure &pointed &to
& & & &by u. &The getutmpx() function performs the converse operation.
5.另外一个命令w:
显示当前用户和他们正在进行的操作
&14:57:22 up 3 days, 18:35, &6 users, &load average: 0.38, 0.25, 0.22
USER & & TTY & & &FROM & & & & & & &LOGIN@ & IDLE & JCPU & PCPU WHAT
hyk & & &tty7 & & & & & & & & & & &Sun20 & &3days &1:18m &2.17s gnome-session -
hyk & & &pts/1 & &:0.0 & & & & & & Mon18 & 17:33m &5.06s &4.77s vncviewer 10.10
hyk & & &pts/2 & &:0.0 & & & & & & Mon10 & 16:57m &0.48s &0.01s ssh huangyukun@
hyk & & &pts/3 & &:0.0 & & & & & & 10:43 & &3:44m &0.83s &2:01 &gnome-terminal
hyk & & &pts/4 & &:0.0 & & & & & & 10:45 & &2.00s &0.91s &0.01s w
6.断电处理
如果系统忽然掉电,此时utmp文件里面的内容还没有来得及更改,所以下次重启的时候,init进程将会清除utmp的所有记录为空(设定为DEADPROCESS),大致如下:
init——login——getty——utmp
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:561425次
积分:8048
积分:8048
排名:第1714名
原创:244篇
转载:93篇
评论:80条
文章:10篇
阅读:16013
(2)(1)(4)(4)(5)(7)(4)(6)(6)(2)(15)(35)(22)(4)(19)(16)(30)(20)(33)(45)(19)(25)(16)(1)Linux命令who am i,who,whoami
Linux命令who am i,who,whoami
今天要说的不是成龙的电影&我是谁&,而是Linux里的who系列命令,包括
who、whoami和who am i。
先看看这三个命令的输出信息:
[rocrocket@rocrocket ~]$ whoami
[rocrocket@rocrocket ~]$ who am i
rocrocket pts/3 & & & & 13:17 (:0.0)
[rocrocket@rocrocket ~]$ who
rocrocket :0 & & & & &
rocrocket pts/0 & & & & 09:55 (:0.0)
rocrocket pts/1 & & & & 09:57 (:0.0)
rocrocket pts/3 & & & & 13:17 (:0.0)
当我用sudo su(或者sudo su -)更换到root用户之后,你再看看:
[rocrocket@rocrocket ~]$ sudo su
[root@rocrocket rocrocket]# whoami
[root@rocrocket rocrocket]# who am i
rocrocket pts/3 & & & & 13:17 (:0.0)
[root@rocrocket rocrocket]# who
rocrocket :0 & & & & &
rocrocket pts/0 & & & & 09:55 (:0.0)
rocrocket pts/1 & & & & 09:57 (:0.0)
rocrocket pts/3 & & & & 13:17 (:0.0)
看出区别来了吧,whoami显示的是当前&操作用户&的用户名,而who am i显示的是&登录用户&的用户名。
用Linux的术语来解释就是:(实际用户=uid,即user id。有效用户=euid,即effective user id)
who am i 显示的是实际用户的用户名,即用户登陆的时候的用户ID。此命令相当于who -m。
whoami & 显示的是有效用户ID. & &
好了,明白了两者区别之后,我们来说说who这个命令。
有人会问,为什么我sudo su到root之后,who里面却没有显示呢?
这是因为su过去的用户进程空间是作为一个子空间存在,他并没有得到一个登录的tty。
who这个命令重点是用来查看当前有哪些用户登录到了本台机器上。
who -m的作用和who am i的作用是一样的。
who -q用来显示当前登录用户的个数。
当你觉得who的输出信息晦涩难懂时,可以使用who -H来输出,这样可以在每列加上列名称,有助于阅读。
(window.slotbydup=window.slotbydup || []).push({
id: '2467140',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467141',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467142',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467143',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467148',
container: s,
size: '1000,90',
display: 'inlay-fix'linux whoami命令参数及用法详解(linux查看登陆用户名)
作者:佚名
字体:[ ] 来源:互联网 时间:07-21 12:59:08
whoami 命令显示登录名。与使用命令 who 并指定 am i 不同,whoami 命令在有 root 用户权限时也有效,因为它不检查 /etc/utmp 文件
命 令:whoami 或者 who am i 功能说明:先似乎用户名称。 语  法:whoami [--help][--version] 补充说明:显示自身的用户名称,本指令相当于执行&id -un&指令。 whoami 命令显示登录名。与使用命令 who 并指定 am i 不同,whoami 命令在有 root 用户权限时也有效,因为它不检查 /etc/utmp 文件。 该命令只出现在windows系列中的 windows 2000中。 参  数:  --help  在线帮助。  --version  显示版本信息。 附:whoami 与who am i 的区别 who这个命令重点是用来查看当前有哪些用户登录到了本台机器上。 who -m的作用和who am i的作用是一样的。 who -q用来显示当前登录用户的个数。 who am i 显示的是实际用户的用户名,即用户登陆的时候的用户ID。此命令相当于who -m。 who am i显示的是&登录用户&的用户名。 用Linux的术语来解释就是:(实际用户=uid,即user id。有效用户=euid,即effective user id) whoami 显示的是有效用户ID. whoami显示的是当前&操作用户&的用户名。 先看看这三个命令的输出信息: [jb51@jb51 ~]$ whoami jb51 [jb51@jb51 ~]$ who am i jb51 pts/3
13:17 (:0.0) [jb51@jb51 ~]$ who jb51 :0
09:54 jb51 pts/0
09:55 (:0.0) jb51 pts/1
09:57 (:0.0) jb51 pts/3
13:17 (:0.0) 当我用sudo su(或者sudo su -)更换到root用户之后,你再看看: [jb51@jb51 ~]$ sudo su [root@jb51 jb51]# whoami root [root@jb51 jb51]# who am i jb51 pts/3
13:17 (:0.0) [root@jb51 jb51]# who jb51 :0
09:54 jb51 pts/0
09:55 (:0.0) jb51 pts/1
09:57 (:0.0) jb51 pts/3
13:17 (:0.0)
大家感兴趣的内容
12345678910
最近更新的内容who下令的编写——登录与注销_who, whoami, who am i - 编程当前位置:& &&&who下令的编写——登录与注销_who, whoami, who am who下令的编写——登录与注销_who, whoami, who am i&&网友分享于:&&浏览:6次who命令的编写——登录与注销__who, whoami, who am i摘要:who是一个linux下重要的系统内建指令,编写who命令,需要了解相关的数据结构struct utmp。同时进一步熟悉结构化数据的读取和访问方法。另外总结了系统调用相关的知识。
本文来源:http://blog.csdn.net/trochiluses/article/details/
1.who程序的编写
#include&stdio.h&
#include&unistd.h&
#include&stdlib.h&
#include&fcntl.h&
#include&utmp.h&
#include&time.h&
#define SHOWHOST
int show_info(struct utmp *utbufp);
void showtime(long);
int main(int arv, char *arg[])
struct utmp current_
int reclen=sizeof(struct utmp);
if((utmpfd = open(UTMP_FILE,O_RDONLY))==-1)
perror(UTMP_FILE);
while(read(utmpfd,¤t_record,reclen)==reclen)
show_info(¤t_record);
close(utmpfd);
int show_info(struct utmp *utbufp)
if(utbufp-&ut_type!=USER_PROCESS)
printf(&%-8.8s&,utbufp-&ut_name);
printf(& &);
printf(&%-8.8s&,utbufp-&ut_line);
printf(& &);
showtime(utbufp-&ut_time);
printf(& &);
#ifdef SHOWHOST
printf(&%-8.8s&,utbufp-&ut_host);
printf(&\n&);
void showtime(long timeeval)
p=ctime(&timeeval );
printf(&%12.12s&,p+4);
1)从who命令的man文档可以查看到它与utmp这个文件有关,进而man utmp这个文件,可以找到这个头文件和utmp这个结构体的一些信息。
2)open,write,close,seek,creat是与文件读写有关的系统调用,我们在下一篇博客里总结它们。
3)与时间有关的函数ctime,我们将用一篇文章总结它们。
4)同样,知道了登录信息是存在UTMPFILE,那么我们可以进一步编写注销信息,实际上就是将改写该文件中的数据而已。下面是注销的代码:
2.注销程序的编写
#include&stdio.h&
#include&unistd.h&
#include&stdlib.h&
#include&utmp.h&
#include&fcntl.h&
#include&sys/types.h&
#include&string.h&
#include&time.h&
int main(int argc, char *argv[])
char *termname=argv[1];
logout(termname);
int logout(const char *ttyname)
int utmpunitlen=sizeof(struct utmp);
if ((fd=open(UTMP_FILE,O_RDWR))==-1)
perror(&can not open file:&);
return -1;
while(read(fd,&utmpunit,utmpunitlen )==utmpunitlen)
printf(&%s
%s\n&,ttyname,utmpunit.ut_line );
if(strstr(ttyname,utmpunit.ut_line)!=NULL)
printf(&find the login account\n&);
utmpunit.ut_type=DEAD_PROCESS;
utmpunit.ut_time=time(NULL);
if(lseek(fd,-utmpunitlen,SEEK_CUR)!=-1)
if(write(fd,&utmpunit,utmpunitlen)==utmpunitlen)
if(close(fd)==-1)
perror(&can not close file:&);
return -1;
注意,注销的是当前终端,当前终端的名称可以用tty获得,作为命令行参数
3.析who,whoami,who am i
先看看这三个命令的输出信息:
[ ~]$ whoami
[ ~]$ who am i
rocrocket pts/3 & & & & 13:17 (:0.0)
rocrocket :0 & & & & &
rocrocket pts/0 & & & & 09:55 (:0.0)
rocrocket pts/1 & & & & 09:57 (:0.0)
rocrocket pts/3 & & & & 13:17 (:0.0)
当我用sudo su(或者sudo su -)更换到root用户之后,你再看看:
[ ~]$ sudo su
[ rocrocket]# whoami
[ rocrocket]# who am i
rocrocket pts/3 & & & & 13:17 (:0.0)
[ rocrocket]# who
rocrocket :0 & & & & &
rocrocket pts/0 & & & & 09:55 (:0.0)
rocrocket pts/1 & & & & 09:57 (:0.0)
rocrocket pts/3 & & & & 13:17 (:0.0)
看出区别来了吧,whoami显示的是当前“操作用户”的用户名,而who am i显示的是“登录用户”的用户名。
4.结构化提取utmp数据:
4.1.getutent函数
头文件:#include &utmp.h&
定义函数:struct utmp *getutent(void);
函数说明:getutent()用来从utmp 文件(/var/run/utmp)中读取一项登录数据, 该数据以utmp 结构返回. 第一次调用时会取得第一位用户数据, 之后每调用一次就会返回下一项数据, 直到已无任何数据时返回NULL。
4.2.getutmp函数
& &#define _GNU_SOURCE & & & & & & /* See feature_test_macros(7) */
& & & &#include &utmpx.h&
& & & & void getutmp(const struct utmpx *ux, struct utmp *u);
& & & & void getutmpx(const struct utmp *u, struct utmpx *ux);
DESCRIPTION
& & & &The getutmp() function copies the fields of the utmpx structure pointed
& & & &to by ux to the corresponding fields of the utmp structure &pointed &to
& & & &by u. &The getutmpx() function performs the converse operation.
5.另外一个命令w:
显示当前用户和他们正在进行的操作
&14:57:22 up 3 days, 18:35, &6 users, &load average: 0.38, 0.25, 0.22
USER & & TTY & & &FROM & & & & & & &LOGIN@ & IDLE & JCPU & PCPU WHAT
hyk & & &tty7 & & & & & & & & & & &Sun20 & &3days &1:18m &2.17s gnome-session -
hyk & & &pts/1 & &:0.0 & & & & & & Mon18 & 17:33m &5.06s &4.77s vncviewer 10.10
hyk & & &pts/2 & &:0.0 & & & & & & Mon10 & 16:57m &0.48s &0.01s ssh huangyukun@
hyk & & &pts/3 & &:0.0 & & & & & & 10:43 & &3:44m &0.83s &2:01 &gnome-terminal
hyk & & &pts/4 & &:0.0 & & & & & & 10:45 & &2.00s &0.91s &0.01s w
6.断电处理
如果系统忽然掉电,此时utmp文件里面的内容还没有来得及更改,所以下次重启的时候,init进程将会清除utmp的所有记录为空(设定为DEADPROCESS),大致如下:
init——login——getty——utmp
12345678910
12345678910
12345678910 上一篇:下一篇:文章评论相关解决方案 12345678910 Copyright & &&版权所有

我要回帖

更多关于 linux中who命令 的文章

 

随机推荐