linux编写who命令 linux命令whoami

如何在linux下编写who命令

楼上的理解也错误

创新互联主营海南州网站建设的网络公司,主营网站建设方案,成都App制作,海南州h5小程序设计搭建,海南州网站营销推广欢迎海南州等地区企业咨询

who am i 其实运行了 who命令 am 和 i 作为参数 并没有被接受

who指令显示了当前登录在该机器上的所有用户的列表

(但是不包括su的用户,因为su过去的用户进程空间是作为一个子空间存在,他并没有得到一个登录的tty)

只有 whoami 中间不加空格 才显示我是谁

而且

su - username 事实上是切换用户 并使用被切换用户的环境变量的意思

su uesrname 是切换用户 但是使用当前用户的环境变量

linux中who命令显示的pts/0和(:0)(:0.0)是什么意思

先说pts/0吧,man里面是这样说的:ptmx

and

pts

-

pseudo-terminal

master

and

slave,pts是所谓的伪终端或虚拟终端,具体表现就是你打开一个终端,这个终端就叫pts/0,如果你再打开一个终端,这个新的终端就叫pts

/1。比如用who命令查询当前登录的用户,可以看到每个用户的TTY设备(简单来说就是用户输入命令还有显示信息的设备,比如终端),下面是我机器上的显示:

calabash

tty7

2009-12-09

20:04

(:0)

calabash

pts/0

2009-12-09

20:20

(:0.0)

calabash

pts/1

2009-12-09

20:27

(:0.0)

有一个tty7是表示图形界面,我当前登录的是GNOME,当然就是图形界面了。还有tty1-tty6表示文字界面,可以用Ctrl+Alt+F1-F6切换,+F7就是切换回图形界面。下面两行说明我当前打开了两个终端窗口,所以就有pts/0和pts/1

再说一下SSH吧,要把本机当做一个远程SSH服务器用,要先装个openssh-server,装完之后会自动启动sshd服务监听ssh连接,Ubuntu应该是预装了openssh-client的,所以启动sshd后,可以自己连接自己,最简单的命令:ssh

user@localhost

至于Windows下面可以用putty用作ssh连接客户端。然后突然想起很久以前小龚推荐我注册的一个unix-

center的账号可以登录上面的主机,就是SSH连接的。今天在公司就一直挂在unix-

center的Ubuntu上面,发现上面登录的用户还真不少:

USER

TTY

FROM

LOGIN@

IDLE

JCPU

PCPU

WHAT

k418675

pts/2

202.108.140.161

08:32

3:42

0.08s

0.06s

sshd:

k418675

[

wateran_

pts/3

222.92.112.66

08:41

8:06

0.06s

0.06s

-bash

xiaoshe

pts/4

129.192.196.5

14:17

11:17m

0.08s

0.08s

-bash

lfly

pts/5

211.144.118.166

09:33

0.00s

0.24s

0.06s

sshd:

lfly

[pri

steed.de

pts/6

119.145.41.2

11:58

4:49

0.06s

0.06s

-bash

topojuly

pts/7

218.30.165.69

15:46

10:55m

0.10s

0.10s

-bash

nwpumabi

pts/8

222.92.112.66

15:12

1:35

0.08s

0.08s

-bash

ilylm

pts/9

113.96.216.247

16:26

1:15m

0.08s

0.08s

-bash

niugao

pts/10

:1.0

09:10

7:36

0.06s

0.06s

-bash

niugao

pts/11

:2.0

09:11

7:36

0.08s

0.08s

-bash

cu911

pts/12

221.215.10.154

16:38

0.00s

0.10s

0.02s

vi

./newhead.sh

wendao4

pts/13

113.9.75.218

16:47

3.00s

0.08s

0.08s

-bash

clyet

pts/15

218.247.11.196

14:12

2:07

0.08s

0.02s

sshd:

clyet

[pr

bigarmy

pts/17

124.207.17.24

10:46

4:22m

0.10s

0.10s

-bash

tonylu

pts/16

218.18.214.166

14:19

2:13m

0.08s

0.08s

-bash

nwpumabi

pts/19

222.92.112.66

11:08

5:38

0.08s

0.08s

-bash

vector09

pts/23

:8.0

11:18

5:26

0.38s

0.10s

-bash

vector09

pts/24

:9.0

11:18

5:29

0.08s

0.08s

-bash

vector09

pts/21

:8.0

11:23

5:24

0.08s

0.08s

bash

fishruby

pts/26

118.229.195.133

15:04

1:03

0.08s

0.08s

-bash

jy016492

pts/28

218.17.152.141

15:17

7:56m

0.08s

0.00s

sshd:

jy0164921

xingzj01

pts/29

222.92.112.66

12:46

4:00

0.08s

0.08s

-bash

ls87

pts/30

192.168.1.18

13:39

4:43m

0.20s

0.04s

vim

可以看到有很多pts,就是代表每个用户用来输入输出的终端了

怎么用C语言实现linux的命令

命令是查询当前登录的每个用户,它的输出包括用户名、终端类型、登录日期及远程主机,在Linux系统中输入who命令输出如下:

我们先man一下who,在帮助文档里可以看到,who命令是读取/var/run/utmp文件来得到以上信息的。

我们再man一下utmp,知道utmp这个文件,是二进制文件,里面保存的是结构体数组,这些数组是struct utmp结构体的。

struct utmp {

short ut_type;

pid_t ut_pid;

char ut_line[UT_LINESIZE];

char ut_id[4];

char ut_user[UT_NAMESIZE];

char ut_host[UT_HOSTSIZE];

struct {

int32_t tv_sec;

int32_t tv_usec;

} ut_tv;

/***等等***/

};

要实现who只需要把utmp文件的所有结构体扫描过一遍,把需要的信息显示出来就可以了,我们需要的信息有ut_user、ut_line、ut_tv、ut_host。

老师给的初始代码:who1.c运行结果如下:

需要注意的是utmp中所保存的时间是以秒和微妙来计算的,所以我们需要把这个时间转换为我们能看懂的时间,利用命令man -k time | grep 3搜索C语言中和时间相关的函数:

经过搜索发现了一个ctime()函数,似乎可以满足我们的需求,于是对代码中关于时间的printf进行修改:

printf("%s",ctime(utbufp-ut_time));

编译运行发现出来的结果虽然已经转换成了我们能看懂的时间格式,但是很明显这个时间是错的:

搜索一下ut_time这个宏,发现它被定义为int32_t类型:

但是ctime()函数中要求参数的类型是time_t类型,所以重新定义一下类型,编译运行之后,发现时间已经改成了正确的,但是发现()中的内容被换行了,猜想ctime()函数的返回值可能自动在最后补了一个字符\n:

一开始想通过\r\b来实现“退行”,但实践后发现并不可取,最后考虑到直接修改字符串中最后一个字符为\0,让其字符串结束,使输出达到与系统who命令一样的效果,即在输出语句前添加如下代码:

cp[strlen(cp)-1] = '\0'

最后编译执行效果,发现解决了该问题:

虽然能看出基本上和who指令的执行结果一致,但是并非完全一样,主要在两点,第一是时间格式不一样,第二个是比who执行的结果多了几条,需要注意的是utmp中保存的用户,不仅仅是已经登陆的用户,还有系统的其他服务所需要的“用户”,所以在显出所有登陆用户的时候,应该过滤掉其他用户,只保留登陆用户。我们可以通过ut_type来区别,登陆用户的ut_type是USER_PROCESS。

先用if语句对执行结果进行过滤,效果如下:

接着解决时间格式问题,利用man命令收到了两个非常有用的函数:localtime()和strftime(),localtime()是把从1970-1-1零点零分到当前时间系统所偏移的秒数时间转换为本地时间,strftime()则是用来定义时间格式的,如:年-月-日,利用这两个函数对时间进行修改后,结果显示终于和系统中who命令一模一样:

最终完整的代码如下:

#include stdio.h

#include stdlib.h

#include utmp.h

#include fcntl.h

#include unistd.h

#include time.h

#define SHOWHOST

void show_time(long timeval){

char format_time[40];

struct tm *cp;

cp = localtime(timeval);

strftime(format_time,40,"%F %R",cp);

printf("%s",format_time);

}

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(" ");

show_time(utbufp-ut_time);

printf(" ");

#ifdef SHOWHOST

printf("(%s)", utbufp-ut_host);

#endif

printf("\n");

}

return 0;

}

int main()

{

struct utmp current_record;

int utmpfd;

int reclen = sizeof(current_record);

if ( (utmpfd = open(UTMP_FILE, O_RDONLY)) == -1 ){

perror( UTMP_FILE );

exit(1);

}

while ( read(utmpfd, current_record, reclen) == reclen )

show_info(current_record);

close(utmpfd);

return 0;

}

linux如何查看有多少用户登录

1、使用w命令查看登录用户正在使用的进程信息

Linux w命令用于显示目前登入系统的用户信息。

执行这项指令可得知目前登入系统的用户有哪些人,以及他们正在执行的程序。

单独执行w指令会显示所有的用户,您也可指定用户名称,仅显示某位用户的相关信息。

语法:

w [-fhlsuV][用户名称]

参数:

-f 开启或关闭显示用户从何处登入系统。

-h 不显示各栏位的标题信息列。

-l 使用详细格式列表,此为预设值。

-s 使用简洁格式列表,不显示用户登入时间等。

-u 忽略执行程序的名称,以及该程序耗费CPU时间的信息。

-V 显示版本信息。

w命令用于显示已经登录系统的用户的名称,以及他们正在做的事。该命令所使用的信息来源于/var/run/utmp文件。

w命令输出的信息包括:用户名称、用户的机器名称或tty号、远程主机地址、用户登录系统的时间、空闲时间、当前进程所用时间、用户当前正在使用的命令。

2、使用who命令查看用户名称及所启动的进程

who命令用于列举出当前已登录系统的用户名称。其输出为:用户名、tty号、时间日期、主机地址。

Linux中who命令用于显示系统中有哪些使用者正在上面,显示的资料包含了使用者ID、使用的终端机、从哪边连上来的、上线时间、呆滞时间、CPU使用量、动作等等。

语法:

who[参数]

可得知目前有那些用户登入系统,单独执行who指令会列出登入帐号,使用的终端机,登入时间以及从何处登入或正在使用哪个X显示器。

参数:

-H或--heading 显示各栏位的标题信息列。

-i或-u或-idle

显示闲置时间,若该用户在前一分钟之内有进行任何动作,将标示成.号,如果该用户已超过24小时没有任何动作,则标示出old字符串。

-m 此参数的效果和指定am i字符串相同。

-q或--count 只显示登入系统的帐号名称和总人数。

-w或-T或--mesg或--message或--writable 显示用户的信息状态栏。

-l 列出任何登录进程。

-T或-w 显示用户的信息状态栏。

linux怎么显示who命令版本号

m 和“whoam i”的作用一样,显示运行该程序的用户名。

Linux,全称GNU/Linux,是一种免费使用和自由传播的类UNIX操作系统,其内核由林纳斯·本纳第克特·托瓦兹于1991年10月5日首次发布,它主要受到Minix和Unix思想的启发,是一个基于POSIX的多用户、多任务、支持多线程和多CPU的操作系统。它能运行主要的Unix工具软件、应用程序和网络协议。它支持32位和64位硬件。Linux继承了Unix以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。Linux有上百种不同的发行版,如基于社区开发的debian、archlinux,和基于商业开发的Red Hat Enterprise Linux、SUSE、Oracle Linux等。Linux操作系统的诞生、发展和成长过程始终依赖着五个重要支柱:Unix操作系统、MINIX操作系统、GNU计划、POSIX标准和Internet网络。

20世纪80年代,计算机硬件的性能不断提高,PC的市场不断扩大,当时可供计算机选用的操作系统主要有Unix、DOS和macOS这几种。Unix价格昂贵,不能运行于PC;DOS显得简陋,且源代码被软件厂商严格保密;MacOS是一种专门用于苹果计算机的操作系统。此时,计算机科学领域迫切需要一个更加完善、强大、廉价和完全开放的操作系统。由于供教学使用的典型操作系统很少,因此当时在荷兰当教授的美国人AndrewS.Tanenbaum编写了一个操作系统,名为MINIX,为了向学生讲述操作系统内部工作原理。MINIX虽然很好,但只是一个用于教学目的的简单操作系统,而不是一个强有力的实用操作系统,然而最大的好处就是公开源代码。全世界学计算机的学生都通过钻研MINIX源代码来了解电脑里运行的MINIX操作系统,芬兰赫尔辛基大学大学二年级的学生Linus Torvalds就是其中一个,在吸收了MINIX精华的基础上,Linus于1991年写出了属于自己的Linux操作系统,版本为Linux0.01,是Linux时代开始的标志。他利用Unix的核心,去除繁杂的核心程序,改写成适用于一般计算机的x86系统,并放在网络上供大家下载,1994年推出完整的核心Version1.0,至此,Linux逐渐成为功能完善、稳定的操作系统,并被广泛使用。


网站栏目:linux编写who命令 linux命令whoami
网站网址:http://azwzsj.com/article/hhoosi.html