精华内容
下载资源
问答
  • who是指谁
    千次阅读
    2020-10-21 10:31:16

    在linux中,查询用户信息的命令有:id、who、who am i、whoami,接下来我们看一下这些命令的区别。
    至于这些命令下涉及的相关参数请移步到其他博主的文档学习。

    1、id命令

    用man命令查看id命令的帮助信息,其部分信息如下:

    #man id
    NAME
           id - print real and effective user and group IDs
    DESCRIPTION
           Print  user and group information for the specified USER, or (when USER omitted) for the current user.
           
    

    通过man命令,可以看出id命令的作用是:查询有效用户的用户id、组id信息。
    例如:当前登录用户是root用户,在root用户下使用id命令,此时有效用户为root用户,其效果如下:

    [root@localhost ~]# id
    uid=0(root) gid=0(root)=0(root) 环境=unconfined_u:unconfined_r:unconfined_t:s                                                                              0-s0:c0.c1023
    

    注意:优势我使用远程登录工具连接的虚拟机终端,故id显示的信息中心包含了“环境”,在虚拟机终端用该命令不会有“环境”。

    当我切换到我的zql用户时,此时有效用户为zql,再次使用id命令,此时查询到的是zql用户的信息,效果如下:

    [root@localhost ~]# su zql
    [zql@localhost root]$ id
    uid=1000(zql) gid=1000(zql)=1000(zql) 环境=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
    

    2、who命令

    用man命令查看who命令的帮助信息,其部分信息如下:

    [root@localhost ~]# man who
    NAME
           who - show who is logged on
    DESCRIPTION
           Print information about users who are currently logged in.
    

    由帮助手册可以看出,who命令的作用是:查询当前正在登陆的用户信息。
    例如:当前登录用户是root用户,当使用who命令时,查询的是root用户的信息,效果如下:

    [root@localhost ~]# who
    root     tty1         2020-10-20 08:49
    root     pts/0        2020-10-20 09:42 (192.168.249.1)
    

    注:
    第一列表示:用户;
    第二列表示:线路;
    第三、四列表示:用户登录的日期和时间;
    第五列表示:备注(代表:当前网络模式所对应网卡的ip地址)
    由于我是使用远程登录工具Xterm登录的linux系统,所以第二行展示的信息是我远程登录的信息,由于远程登录用到了虚拟网卡,所以第五列显示出了虚拟网卡的地址**(当前我使用NAT模式的网络,对应网卡VMnet8的ip地址为:192.168.249.1)**;第二列中,tty代表终端,也就是正在运行的虚拟机,pts代表虚拟终端,指的是我的远程登录终端。

    当我在root用户下切换到zql用户,由于who命令显示的是登录用户的信息,虽然已经切换到zql用户,但是登录用户是root,所以在zql用户下使用who命令,显示的是root用户的信息,效果如下:

    [root@localhost ~]# su zql
    [zql@localhost root]$ who
    root     tty1         2020-10-20 08:49
    root     pts/0        2020-10-20 10:29 (192.168.249.1)
    

    3、who am i命令

    用man命令查看who am i命令的帮助信息,其部分信息如下:

    [root@localhost ~]# man who am i
    NAME
           who - show who is logged on
    DESCRIPTION
           Print information about users who are currently logged in.
    

    发现who am i命令和who命令是一样的,想当于who -m命令。

    [root@localhost ~]# who am i
    root     pts/0        2020-10-20 10:29 (192.168.249.1)
    [root@localhost ~]# su zql
    [zql@localhost root]$ who am i
    root     pts/0        2020-10-20 10:29 (192.168.249.1)
    

    只不过who am i 命令展示的是当前终端(我当前是远程登录终端)的用户信息,而who是展示的所有终端(包括远程终端和虚拟机的终端)的用户信息。

    4、whoami命令

    通过man命令查询whoami命令信息,其部分信息如下:

    [root@localhost ~]# man whoami
    NAME
           whoami - print effective userid
    DESCRIPTION
           Print  the  user  name  associated  with the current effective user ID.
           Same as id -un.
    

    whoami命令的效果是显示当前有效用户的用户名。
    例如:在root用户次输入whoami命令,此时有效用户是root,其效果如下:

    [root@localhost ~]# whoami
    root
    

    当在root用户下切换到zql用户,此时有效用户是zql,使用whoami命令效果如下:

    [root@localhost ~]# su zql
    [zql@localhost root]$ whoami
    zql
    

    5、总结

    id 可以查询有效用户(当前用户)的 UID 和 GID、groups 信息。
    who 可以查询当前登录在系统上的登录用户的信息。
    who am i 等同于 who -m,只查询当前终端的登录用户的信息。
    whoami 可以查询当前有效用户的用户名。

    更多相关内容
  • 世界卫生组织ESP-WHO是一个面部检测和识别平台,当前基于Espressif Systems的... 它与MTMN模型,它是实现和 。 识别是识别特定的人,它需要检测的结果。 它通过MobileFace模型实现。 优化主要是为了提高推理的精度,
  • Unix & macOS 编写 who 命令

    千次阅读 2022-03-15 16:56:07
    macOS 编写 who 命令 作者:高玉涵 时间:2022.3.14 09:47 博客:blog.csdn.net/cg_i 环境:  HP-UX B.11.31 U ia64  macOS 12.2.1 活动老,学到老。—— 俗语 介绍  在使用 Unix 的时候,经常需要知道有哪些...

    作者:高玉涵
    时间:2022.3.14 09:47
    博客:blog.csdn.net/cg_i
    环境:
     HP-UX B.11.31 U ia64
     macOS 12.2.1

    活动老,学到老。—— 俗语

    介绍

     在使用 Unix 的时候,经常需要知道有哪些用户正在使用系统,系统是否很繁忙,某人是否正在使用系统等。为了回答这些问题,可以使用 who 命令,所有的多用户系统都会有这个命令。这个命令会显示系统中活动用户的情况。接下来的问题是,who 命令是如何工作的呢?

     本文分析 Unix 中的 who 命令,通过分析来学习 who 命令是如何工作的。除此之外,还将学习如何从 Unix 的联机帮助中得到有用的信息。

    对以下 3 个问题的解答来学习 who 命令:

    1. who 命令能做些什么?
    2. who 命令是如何工作的?
    3. 如何编写 who?

    命令也是程序

     在开始之前,需要声明的是,在 Unix 系统中,几乎所有的命令都是人为编写的程序,如 who 和 ls,而且它们中的大多数都是用 C 语言写的。当在命令行中输入 ls,Shell(命令解释器)就知道你想运行名字为 ls 的程序。如果对 ls 所提供的功能还不满意,完全可以编写和使用自己的 ls 命令。

     在 Unix 系统中增加新的命令是一件很容易的事。把程序的可执行文件放到以下任意一个目录就可以了:/bin、/usr/bin、/usr/local/bin,这些目录里面存放着很多系统命令。Unix 系统中一开始并没有这么多命令,一些人编写程序用来解决某个特定的问题,而其他人也觉得这个程序很有用,随着越来越多的使用,这个程序就逐渐成了 Unix 的标准命令。说不定哪一天,你编写的程序也会成为标准命令。

    问题 1: who 命令能做些什么

     如果想要知道都有谁在使用系统,只有输入 who 命令,输出如下:

    • HP-UX
    $who
    jstest     pts/1        Mar 14 08:30
    jstest     pts/2        Mar 14 08:45
    uatvlog    pts/5        Mar 14 09:10
    jstest     pts/6        Mar 14 09:18
    jstest     pts/7        Mar 14 08:56
    jstest     pts/8        Mar 14 08:59
    jstest     pts/9        Mar 14 09:19
    jstest     pts/10       Mar 14 09:19
    uattest    pts/13       Mar 14 09:25
    jstest     pts/14       Mar 14 09:34
    jstest     pts/15       Mar 14 09:35
    jstest     pts/16       Mar 14 09:35
    uatvlog    pts/18       Mar 14 09:40
    

     每一行代表一个已经登录的用户,第 1 列是用户名,第 2 列是终端名,第 3 列是登录时间,某些版本的 who 命令会给出第 4 列(用户的登录地址)我的版本默认状态下不给出第 4 列的内容。

    阅读手册

     通过直接运行命令,可以了解 who 的大致功能,要进一步了解 who 的用法,需要借助联机帮助。

     每一个 Unix 在发售的时候都会带上大量的有关各个命令使用方法的文档。以前,这些文档是打印出来的,现在有电子版的可供使用。查看联机帮助的命令是 man,如要查看 who 的帮助,可输入:

    $man who
    who(1)                                                               who(1)
    
     NAME
          who - who is on the system
    
     SYNOPSIS
          who [-muTlHqpdbrtasARW] [file]
    
          who am i
    
          who am I
    
     DESCRIPTION
          The who command can list the user's name, terminal line, login time,
          elapsed time since input activity occurred on the line, the user's
          host name, and the process-ID of the command interpreter (shell) for
          each current system user.  It examines the utmps database to obtain
          the information.  If file is given, that file is examined, file should
          be a utmp like file.
    
          The who command with the am i or am I option identifies the invoking
          user.
    
          Except for the default -s option, the general format for output
          entries is:
    
               name [state] line time activity pid [comment] [exit]
    
          With options, who can list logins, logoffs, reboots, and changes to
          the system clock, as well as other processes spawned by the init
          process.
    
        Options
               -m             Output only information about the current
                              terminal.  This option is equivalent to the am i
                              and am I options described above.
    
               -u             Lists only those users who are currently logged
                              in.  name is the user's login name.  line is the
                              name of the line as found in the directory /dev.
                              The time field indicates when the user logged in.
    
                              activity is the number of hours and minutes since
                              input activity last occurred on that particular
    ......
    

     所有命令的联机帮助都有相同的基本格式,从第 1 行可知这是关于哪个命令的帮助,还可以知道这个帮助是位于哪一节的。在这个例子中,从第 1 行的内容 who(1),可以知道这是 who 命令的帮助,它的小节编号是 1 。Unix 的联机帮助分为很多节,如第 1 小节中是关于用户命令的帮助,第 2 小节中是关于系统调用的帮助,第 5 小节中是关于配置文件的帮助。你可查看一下 Unix 系统的联机帮助,了解其他节讲述的内容。

     名字(NAME)部分包含命令的名字以及对这个命令的简短说明。

     概要(SYNOPSYS)部分给出了命令的用法说明,包括命令格式、参数和选项列表。选项指的是一个短线后面紧跟着一个或多个英文字母,如 -a、-Bc,命令的选项影响该命令所进行的操作。

     在联机帮助中,方括号([-a])表示该选项不是一个必要的部分。帮助中指出 who 的写法可以是 who,或者 who -a,或者 who - 加上 muTlHqpdbrtasARW 这些字母的任意组合,在命令的未尾还可以有一个文件参数。

     从帮助中可以知道 who 命令还有其他 3 种形式:

    who am i
    who am I
    whoami
    

     从联机帮助中还可以获得上述形式的进一步帮助。

     描述(DESCRIPTION)部分是关于命令功能的详细阐述,根据命令和平台的不同,描述的内容也不同,有的简洁、精确、有的包含了大量的例子。不管怎么样,它描述了命令的所有功能,而且是这个命令的权威性解释。

     选项(OPTIONS)部分给出了命令行中每一个选项的说明。早期的 Unix 命令的功能都很简单,每个命令只有一两个选项,但随着时间的推移,命令的功能越来越多,基本上每个选项用来实现一个功能,所以选项也越来越多,像 who 命令就是有很多选项。

     参阅(SEE ALSO)部分包含与这个命令相关的其他主题。有些帮助还有 BUG 部分。

    问题 2: who 命令是如何工作的

     前面看到 who 命令可以显示出当前系统中已经登录的用户信息,联机帮助中描述了 who 的功能和用法,现在的问题是:who 是如何实现这些功能的?

     你可能会认为,像 who 这样的系统程序一定会用到一些特殊的系统调用,需要高级管理员的权限,要编写这样的程序得要花很多钱来购买系统开发工具,包括光盘、参考书等。

     实际上,所需的资料都在系统中,你要知道的仅仅是如何找到这些资料。

    1. 从 Unix 中学习 Unix

     以下 4 项技巧有助于你的学习:

    • 阅读联机帮助
    • 搜索联机帮助
    • 阅读 .h 文件
    • 从参阅部分(SEE ALSO)得到启示
    1. 阅读联机帮助

     以 who 为例,在命令行输入如下命令:

    $man who
    

     翻到描述部分,可以看到如下内容:

    DESCRIPTION
          The who command can list the user's name, terminal line, login time,
          elapsed time since input activity occurred on the line, the user's
          host name, and the process-ID of the command interpreter (shell) for
          each current system user.  It examines the utmps database to obtain
          the information.  If file is given, that file is examined, file should
          be a utmp like file.
    
          The who command with the am i or am I option identifies the invoking
          user.
    
          Except for the default -s option, the general format for output
          entries is:
    
               name [state] line time activity pid [comment] [exit]
    
          With options, who can list logins, logoffs, reboots, and changes to
          the system clock, as well as other processes spawned by the init
          process.
    

     上述描述说明,注意这一句It examines the utmps database to obtain the information.(已登录用户的信息存放在 uptmps 数据库里)继续翻到 FILES 部分找到,在 /etc/utmp 这个中,who 通过读取该文件获得信息,可以通过搜索联机帮助来了解这个文件的结构信息。

     FILES
          /etc/inittab
          /etc/utmp
          /var/adm/wtmp
          /var/adm/wtmps
    
    1. 搜索联机帮助

     使用带有选项 -k 的 man 命令可以根据关键字搜索联机帮助。如果要查找 “utmp” 的信息,在命令行输入如下命令:

    $man -k utmp
    /usr/share/lib/whatis: No such file or directory
    

     报上述错误,执行 man man阅读帮助手册,得知 -k 选项必须配合 /usr/share/lib/whatis(索引库)文件方能使用。

    ......
    Searching for Entry Names by Keyword (first form)
          The first form above searches the one-line descriptions of individual
          entries for specified keywords.  Arguments are as follows:
    
               -k keyword     -k followed by one or more keywords causes man to
                              print the one-line description of each manual
                              entry whose one-line description contains text
                              matching one or more of the specified keywords
                              (similar to the behavior of grep(1)).  Keywords
                              are separated by blanks (space or tab).
    
                              Before this option can be used, file
                              /usr/share/lib/whatis must exist.
                              /usr/share/lib/whatis can be created by running
                              catman(1M).
    ......
    

     即而在命令行输入如下命令,以期能得到创建索引库的方法:

    $man whatis
    No manual entry for whatis.
    

    囧囧囧… 提示找不到对应的手册。无奈之下救助于网络搜索,得知,是由于系统没有安装扩展帮助手册导致。而最先前的问题,找到的都是关于在 Linux 下通过 makewhatis 命令创建索引库,我并没有搜索到在 HP-UX 下创建 mandb 的方法。 上述问题的解决,都依赖于安装对应的软件包,而这些我都没有,网络也未能找到有关的 HP-UX 资源,这里只好作罢 ╮( ̄▽  ̄)╭ 希望,观看此文的高人前辈指点一二,定感激不尽!

     先前阅读 who 命令手册里,提到过 utmp 这个文件,那试着用 man utmp 能否找到有用的信息呢?报着试试看的心理,在命令行里输入以下命令:

    $man utmp
    utmp(4)                                                             utmp(4)
                                   TO BE OBSOLETED
    
     NAME
          utmp, wtmp, btmp - user login record format
    
     SYNOPSIS
          #include <sys/types.h>
          #include <utmp.h>
    
     DESCRIPTION
          These files, which hold user and accounting information for such
          commands as last, who, write, and login (see last(1), who(1),
          write(1), and login(1)), have the following structure as defined by
          <utmp.h>:
    
          #define UTMP_FILE   "/etc/utmp"
          #define WTMP_FILE   "/var/adm/wtmp"
          #define BTMP_FILE   "/var/adm/btmp"
          #define ut_name     ut_user
    
          struct  utmp {
            char   ut_user[8];           /* User login name */
            char   ut_id[4];             /* /etc/inittab id(usually line#)*/
            char   ut_line[12]           /* device name (console, lnxx) */
            pid_t  ut_pid;               /* process id */
            short  ut_type;              /* type of entry */
            struct exit_status
                short  e_termination;    /* Process termination status*/
                short  e_exit;           /* Process exit status*/
                } ut_exit;               /* The exit status of a process*/
                                         /* marked as DEAD_PROCESS.*/
            unsigned short ut_reserved1; /* Reserved for future use*/
            time_t  ut_time;             /* time entry was made*/
            char    ut_host[16];         /* host name,if remote*/
            unsigned long ut_addr;       /* host Internet addr, if remote*/
          };
    
          /*  Definitions for ut_type  */
          #define EMPTY           0
          #define RUN_LVL         1
          #define BOOT_TIME       2
          #define OLD_TIME        3
          #define NEW_TIME        4
          #define INIT_PROCESS    5      /* Process spawned by "init" */
          #define LOGIN_PROCESS   6      /* getty process awaiting login */
          #define USER_PROCESS    7      /* A user process */
          #define DEAD_PROCESS    8
          #define ACCOUNTING      9
          #define UTMAXTYPE       ACCOUNTING  /* Max. legal value of ut_type */
    
          /*  Special strings or formats used in the "ut_line" field */
          /*  when  accounting for something other than a process  */
          /*  No string for the ut_line field can be more than */
    
     Hewlett-Packard Company            - 1 -       HP-UX 11i Version 3 Feb 2007
    
     utmp(4)                                                             utmp(4)
                                   TO BE OBSOLETED
    
          /*  11 chars + a NULL in length  */
    Standard input
    unsigned short ut_reserved1; /* Reserved for future use*/
            time_t  ut_time;             /* time entry was made*/
            char    ut_host[16];         /* host name,if remote*/
            unsigned long ut_addr;       /* host Internet addr, if remote*/
          };
    
          /*  Definitions for ut_type  */
          #define EMPTY           0
          #define RUN_LVL         1
          #define BOOT_TIME       2
          #define OLD_TIME        3
          #define NEW_TIME        4
          #define INIT_PROCESS    5      /* Process spawned by "init" */
          #define LOGIN_PROCESS   6      /* getty process awaiting login */
          #define USER_PROCESS    7      /* A user process */
          #define DEAD_PROCESS    8
          #define ACCOUNTING      9
          #define UTMAXTYPE       ACCOUNTING  /* Max. legal value of ut_type */
    
          /*  Special strings or formats used in the "ut_line" field */
          /*  when  accounting for something other than a process  */
          /*  No string for the ut_line field can be more than */
    
     Hewlett-Packard Company            - 1 -       HP-UX 11i Version 3 Feb 2007
    
     utmp(4)                                                             utmp(4)
                                   TO BE OBSOLETED
    
          /*  11 chars + a NULL in length  */
          #define RUNLVL_MSG      "run-level %c"
          #define BOOT_MSG        "system boot"
          #define OTIME_MSG       "old time"
          #define NTIME_MSG       "new time"
    
          File utmp contains a record of all users logged onto the system.  File
          btmp contains bad login entries for each invalid logon attempt.  File
          wtmp contains a record of all logins and logouts.
    
          Note that wtmp and btmp tend to grow without bound, and should be
          checked regularly.  Information that is no longer useful should be
          removed periodically to prevent it from becoming too large.  Also note
          that wtmp and btmp are not created by the programs that maintain them.
          Thus, if these files are removed, record-keeping is turned off.
    
     FILES
          /etc/utmp
          /var/adm/wtmp
          /var/adm/btmp
    
     AUTHOR
          utmp, wtmp, and btmp were developed by HP and the University of
          California, Berkeley.
    
     SEE ALSO
          last(1), login(1), who(1), write(1), acctcon(1M), fwtmp(1M),
          utmpd(1M), getut(3C), getuts(3C), getutx(3C).
    
     STANDARDS CONFORMANCE
          <utmp.h>: XPG2
    
    Standard input: END
    

     可以看到 utmp 结构所保存的详细登录记录。各个平台上的 utmp 结构可能不会完全相同,具体的内容由 utmp.h 来决定,它位于 /usr/include 目录里。虽然没有看过 who 的源代码,但从联机帮助以及头文件,可以知道 who 的工作原理,who 通过读文件来获得需要的信息,而每个登录的用户在文件中都有对应的记录。who 的工作流程可以用图 1.1 来表示。

    在这里插入图片描述

    (图 1.1)

     文件中的结构数组存放登录用户的信息,所以直接的想法就是把记录一个一个的读出来并显示出来,是不是就这么简单呢?是的,以前的确是这样做的(参见1)细心的朋友可能注意到了第 2 行这句 TO BE OBSOLETED(被弃用)Orz !是的,这个已不再使用,那现行用的又是那个呢?

    • macOS

     自 1969 年,贝尔实验室的计算机科学家发明了 Unix,至今在商业计算和研究机构得到很大的发展,出现了不同的方向,如 System V、BSD 乃至当今最流行的 GNU/Linux。虽然各种 Unix/Linux 不尽相同,但它们都尊循着 POSIX 标准中形式化的方法描述了 Unix 的系统接口。而我 MacBook Pro 上运行的 macOS 本身就是 Unix, 尝试着在它那里搜索答案。在命令行里输入以下命令:

    $man -k utmp
    utmp(5), wtmp(5), lastlog(5) - login records (DEPRECATED)
    utmpx(5)                 - user accounting database
    getlastlogx(3), getlastlogxbyname(3), getutmp(3), getutmpx(3), utmpxname(3) - user accounting database functions
    utmp(5), wtmp(5), lastlog(5) - login records (DEPRECATED)
    utmpx(5)                 - user accounting database
    

     以上的输出是 macOS 平台上的输出, 不同版本的 Unix 输出可能会有所不同,其中每一行都包含帮助的主题、标题和一段简短的描述。我们忽略所有带有 (DEPRECATED) 的行,注意这一行:

    utmpx(5) - user accounting database

     看起来好像就是所需要的。这一行里的“5”是小节编号,说明该帮助是位于第 5 节,在查看该帮助内容的时候,注意别把小节编号漏了:

    $man 5 utmpx
    UTMPX(5)                                   File Formats Manual                                  UTMPX(5)
    
    NAME
         utmpx – user accounting database
    
    SYNOPSIS
         #include <utmpx.h>
    
    DESCRIPTION
         In contrast to utmp and wtmp, the extended databases in utmpx and wtmpx reserve more space for
         logging hostnames, and also information on a process' ID, termination signal and exit status.
    
         The ⟨utmpx.h⟩ header defines the structures and functions for logging user.  Currently logged in
         users are tracked in /var/run/utmpx.  The interface to the utmpx file is described in endutxent(3).
         The file is not automatically created if they do not exist; it must be created manually.
    
         Traditionally, separate files would be used to store the running log of the logins and logouts
         (wtmpx), and the last login of each user (lastlogx).  With the availability of the Apple system log
         facility asl(3), these separate files can be replace with log entries, which are automatically
         generated when utmpx entries are written.  The API to access the logins and logouts is described in
         endutxent_wtmp(3) while the last login info is accessible with getlastlogx(3).
    
         For compatibility, changes to utmpx are reflected in utmp(3) (in the utmp, wtmp and lastlog files),
         but not the other way around.
    
    FILES
         /var/run/utmpx  The utmpx file.
    
    SEE ALSO
         asl(3), endutxent(3), endutxent_wtmp(3), getlastlogx(3), utmp(5)
    
    macOS 12.2                                  January 31, 2007                                  macOS 12.2
    (END)
    

     到此已经离目标不远了,联机帮助说明读取的是 /var/run/utmpx 这个文件, 头文件是 utmpx.h 。接下来的问题是:utmpx.h 这个文件在哪里?

    1. 阅读 .h 文件

     macOS 默认是没有这些头文件的,需要在命令行界面下输入 xcode-select --install来安装命令行开发工具,此过程需要联网,进度根据您的网速,我安装成功大约耗时 20 分钟左右。安装成功后,头文件保存位置在 /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include (HP-UX: /usr/include)在命令行界面下输入以下命令:

    $cd /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include
    more utmpx.h
    ......
    struct utmpx {
        char ut_user[_UTX_USERSIZE];    /* login name */
        char ut_id[_UTX_IDSIZE];    /* id */
        char ut_line[_UTX_LINESIZE];    /* tty name */
        pid_t ut_pid;           /* process id creating the entry */
        short ut_type;          /* type of this entry */
        struct timeval ut_tv;       /* time entry was created */
        char ut_host[_UTX_HOSTSIZE];    /* host name */
        __uint32_t ut_pad[16];      /* reserved for future use */
    };
    
    #if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE)
    struct lastlogx {
        struct timeval ll_tv;       /* time entry was created */
        char ll_line[_UTX_LINESIZE];    /* tty name */
        char ll_host[_UTX_HOSTSIZE];    /* host name */
    };
    #endif /* !_POSIX_C_SOURCE || _DARWIN_C_SOURCE */
    
    __BEGIN_DECLS
    
    void    endutxent(void);
    
    #if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE)
    void    endutxent_wtmp(void) __OSX_AVAILABLE_STARTING(__MAC_10_5, __IPHONE_2_0);
    struct lastlogx *
        getlastlogx(uid_t, struct lastlogx *) __OSX_AVAILABLE_STARTING(__MAC_10_5, __IPHONE_2_0);
    struct lastlogx *
        getlastlogxbyname(const char*, struct lastlogx *)__OSX_AVAILABLE_STARTING(__MAC_10_5, __IPHONE_2_0);
    struct utmp;    /* forward reference */
    void    getutmp(const struct utmpx *, struct utmp *) __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_5, __MAC_10_9, __IPHONE_2_0, __IPHONE_7_0) __WATCHOS_PROHIBITED __TVOS_PROHIBITED;
    void    getutmpx(const struct utmp *, struct utmpx *) __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_5, __MAC_10_9, __IPHONE_2_0, __IPHONE_7_0) __WATCHOS_PROHIBITED __TVOS_PROHIBITED;
    #endif /* !_POSIX_C_SOURCE || _DARWIN_C_SOURCE */
    
    struct utmpx *
        getutxent(void);
    
    #if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE)
    struct utmpx *
        getutxent_wtmp(void) __OSX_AVAILABLE_STARTING(__MAC_10_5, __IPHONE_2_0);
    #endif /* !_POSIX_C_SOURCE || _DARWIN_C_SOURCE */
    
    struct utmpx *
        getutxid(const struct utmpx *);
    struct utmpx *
        getutxline(const struct utmpx *);
    struct utmpx *
        pututxline(const struct utmpx *);
    void    setutxent(void);
    
    #if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE)
    void    setutxent_wtmp(int) __OSX_AVAILABLE_STARTING(__MAC_10_5, __IPHONE_2_0);
    int utmpxname(const char *) __OSX_AVAILABLE_STARTING(__MAC_10_5, __IPHONE_2_0);
    int wtmpxname(const char *) __OSX_AVAILABLE_STARTING(__MAC_10_5, __IPHONE_2_0);
    #endif /* !_POSIX_C_SOURCE || _DARWIN_C_SOURCE */
    ......
    

     略过所有介绍性的内容,直接来看 utmpx 结构保存的登录记录,还有定义的一组函数。

    问题3: 如何编写 who

     其实只使用 getutxent() 这个函数就够了,如果没有打开数据库的话,这个函数会自动打开,访问结束后用 endutxent() 关闭数据库。文章未尾,我给出了 C 读取旧版 utmp 的方法,记录的展示未精心设计,仅是为了显示它们的区别(参见 2)。

    #include <stdio.h>
    #include <utmpx.h>
    
    int main(void)
    {
    	struct utmpx *tmp;
    	while( (tmp = getutxent()) != NULL )
    	{
    		time_t t = tmp->ut_tv.tv_sec;
    		struct tm *p = localtime(&t);
    		char buf[55];
    		strftime(buf, sizeof(buf), "%b %d %H %M", p);
    		
    		if( tmp->ut_type == USER_PROCESS )
    			printf("%s %s %s %s\n", tmp->ut_user, tmp->ut_line, buf, tmp->ut_host);
    	}
    	endutxent();
    	return 0;
    }
    

     将上述代码编译、运行:

    • macOS
    gcc who1.c -o who1
    ./who1
    gaoyuhan console Mar 15 14 17 
    gaoyuhan ttys000 Mar 15 14 54 
    gaoyuhan ttys001 Mar 15 16 05 
    
    • HP-UX
    yztest pts/1 Mar 15 11 41 11.#.###.2
    root pts/3 Mar 15 11 57 11.#.###.38
    

     代码是不是很简单(对比旧方法),同样的代码两种平台上,编译后都能正常运行,还能自动适应平台间的差异(HP-UX 下会输出第 4 列 IP 地址)。

    引用

    1. Perl读取wtmpx日志文件
    2. 访问 utmp (HP-UX 通过)
    /*
     * who1.c - a first version of the who program
     * 	open, read UTMP file, and show results
     */
    #include <stdio.h>
    #include <stdlib.h>
    #include <utmpx.h>
    #include <fcntl.h>
    #include <unistd.h>
     
    #define SHOWHOST	/* include remote machine on output */
    void show_info( struct utmpx *utbufp );
     
    int main()
    {
    	struct utmpx current_record;	/* read info into here */
    	int utmpfd;						/* read from this descriptor */
    	int reclen = sizeof(current_record);
    	
    	if( (utmpfd = open(_PATH_UTMPX, O_RDONLY)) == -1 )
    	{
    		perror(_PATH_UTMPX);	/* _PATH_UTMPX is in utmpx.h */
    		exit(EXIT_FAILURE);
    	}
    	
    	while( read(utmpfd, &current_record, reclen) == reclen )
    	{
    			show_info(&current_record);
    	}		
    	close(utmpfd);
    	return EXIT_SUCCESS;	/* went ok */
    }
    
    /*
     * show info()
     * displays contents of the utmp struct in human readable form
     * * note * these sizes should not be hardwired
     */
    void show_info( struct utmpx *utbufp )
    {
    	printf("%s", utbufp->ut_user);		/* the logname */
    	printf(" ");							/* a space */
    	printf("%s",utbufp->ut_line);		/* the tty */
    	printf(" ");							/* a space */
    	printf("%10ld", (utbufp->ut_tv).tv_sec);		/* login time */
    	printf(" ");							/* a space */
    #ifdef SHOWHOST
    	printf("(%s)", utbufp->ut_host);		/* the host */
    #endif
    	printf("\n");							/* newline */
    }
    

     将上述代码编译、运行:

    cc who2.c -o who2
    ./who2
    system boot 1640247484 ()
     run-level 3 1640247484 ()
    vxenablevxen  1640247484 ()
    bcheckrcbrc1  1640247487 ()
    cat  1640247487 ()
    clu_spawcspd  1640247487 ()
    rm  1640247487 ()
    sh  1640247487 ()
    fsdaemonfs01  1640247489 ()
    fsdaemonfs02  1640247489 ()
    fsdaemonfs03  1640247493 ()
    sh  1640247493 ()
    rc  1640247569 ()
    getty console 1640247699 ()
    krsd  1640247569 ()
    sfd  1640247569 ()
    esmd  1640247569 ()
    cimservecim1  1640247569 ()
    sh  1640247569 ()
    p_clientems4  1640247569 ()
    iocdsfd  1640247569 ()
    clu_dsf_cdin  1640247575 ()
    utild  1640247569 ()
    init.ohah1  1640247569 ()
    init.tfahtfa  1640247569 ()
    yztest pts/0 1647245407 ()
    yztest pts/1 1647315682 (11.1.215.2)
    yztest  1647295070 ()
    fts_cs pts/2 1645671079 ()
    root pts/3 1647316658 (11.1.215.38)
    yztest pts/4 1646352277 ()
    yztest pts/5 1646299034 ()
    root pts/6 1646287693 ()
    yztest pts/7 1645698635 ()
    fts_cs pts/8 1645688929 ()
    yztest pts/9 1645690790 ()
    fts_cs pts/10 1645691774 ()
    yztest pts/11 1645692783 ()
    
    展开全文
  • 5W2H的是什么?

    千次阅读 2020-12-24 14:10:13
    3、WHO:由来做? 4、WHEN:何时?在什么时间做?什么时机最适宜? 5、WHERE:何地?在什么地方做? 6、HOW:怎么做?怎么提高效率?怎么实施?方法是什么? 7、HOW MUCH:做多少?做到什么程度?数量如何?质量...

    展开全部

    5W2H分析法又叫七问分析法,是二战中美国陆军兵器修理部首创。62616964757a686964616fe78988e69d8331333431363636

    其简单、方便、易于理解、富有启发意义,广泛用于企业管理和技术活动,对于决策和执行性的活动措施也非常有帮助,也有助于弥补考虑问题的疏漏。

    5W2H分析法的发明者用五个以W开头的英语单词和两个以H开头的英语单词进行设问,从而可以发现解决问题的线索,寻找发明思路,进行设计构思,从而搞出新的发明项目,这就叫做5W2H法。

    1、WHAT:这是什么?我的目的是什么?

    2、WHY:我为什么要做?我可不可以不做?

    3、WHO:由谁来做?

    4、WHEN:何时?在什么时间做?什么时机最适宜?

    5、WHERE:何地?在什么地方做?

    6、HOW:怎么做?怎么提高效率?怎么实施?方法是什么?

    7、HOW MUCH:做多少?做到什么程度?数量如何?质量水平如何?

    扩展资料:

    5W2H分析法的优势

    如果现行的做法或产品经过七个问题的审核已无懈可击,便可认为这一做法或产品可取。如果七个问题中有一个答复不能令人满意,则表示这方面有改进余地。如果哪方面的答复有独创的优点,则可以扩大产品这方面的效用。新产品已经克服原产品的缺点,扩大原产品独特优点的效用。

    5W2H分析法可以准确界定、清晰表述问题,提高工作效率。有效掌控事件的本质,完全地抓住了事件的主骨架,把事件打回原形思考。简单、方便,易于理解、使用,富有启发意义。有助于思路的条理化,杜绝盲目性。有助于全面思考问题,从而避免在流程设计中遗漏项目。

    展开全文
  • 今天也尝试通过what how who的方式介绍下联邦学习, (感谢这个领域的专家,老同学Dr Liu给我的输入) 灵魂三问的是: 1.联邦学习解决了什么问题 2.联邦学习怎么解决的问题 3.具备什么样条件可以实现联邦学习...

    最近沉迷于学习政治经济学无法自拔,听了很多资本论相关的课程。今天也尝试通过what how who的方式介绍下联邦学习,

    (感谢这个领域的专家,老同学Dr Liu给我的输入)

    灵魂三问指的是:

    1.联邦学习解决了什么问题

    2.联邦学习怎么解决的问题

    3.具备什么样条件可以实现联邦学习商业化

    联邦学习解决了什么问题?

    联邦学习最早是Google在差不多两年前提出的,当时我还兴奋地发了一个文章讲联邦学习。Google定义了联邦学习的概念,是通过多个终端联合建模,实现一个完整的强大的模型。

    Google提出联邦学习后呢,这个方向一直不温不火,因为仿佛联邦学习解决的是不同终端间分布式建模的问题,把联邦学习看作一种框架性的问题。

     

    但是最近,国内一些公司开始逐步实现了联邦学习的商业化,甚至有类似于FATE这样的联邦学习开源框架产生。我个人认为,联邦学习之所以能在商业化场景找到突破口,是因为一些公司成功的重新定义了联邦学习解决的问题。

    今天在机器学习领域,框架性的问题有很多解决方案,但是数据的共享问题一直没有好的答案。联邦学习被重新定义为解决数据共享的一种方案,用来解决数据孤岛问题。

    image.png

    之前在写《机器学习实践应用》的时候我做过一个调研,这个世界上92%以上的数据会保留到少数10家互联网巨头的数据库里。也就是说,普通的企业如果想做模型的训练,数据样本不足是一个很大的问题,而且数据交互在业内基本上是禁区。

    所以,如果将联邦学习重新定位为解决数据孤岛问题,在商业化方面的机会点会远比解决一些技术框架性问题的机会大得多。

    联邦学习如何解决数据孤岛问题?

    首先大家要知道一个概念,机器学习模型可以简单理解是一组权重值,在做模型训练的时候的本质目的是找到这些权重值发展的合理方向,类似于求导。这种方向性可以通过梯度表示,联邦学习就是利用了梯度的交换实现了不同终端的联合建模。

    屏幕快照 2020-03-14 下午9.58.20 1.png

    如上图讲的,公司A和B,虽然不能交换数据共同建模,但是他们可以把各自模型训练过程中的梯度做交换,因为梯度在离开数据之后是没有实际意义的,也不会有监管和法律风险。

    所以联邦学习将模型训练抽象成了利用多个模型间的模型的共享梯度进行建模,这就将联邦学习转换成了迁移学习,迁移学习接下来的技术手段就很成熟了。

    于是,联邦学习的技术难点并不在通过得到的梯度去优化模型,因为这一部分的技术很成熟。联邦学习的难点在于如何做到各个公司间的梯度共享,因为这里面涉及到许多加密传输相关的问题,是信息编码理论的范畴。编码有很多方式,最简单的可能就是哈希一下再传输(这部分没研究过,虽然我本科是通信与信息专业毕业)~

    屏幕快照 2020-03-14 下午10.05.42.png

     

    总结下,联邦学习解决问题的技术手段就是在迁移学习的基础上加上信息编码技术。这里面涉及到相当多的细节,就不展开了。

    比如我提一个课后题,联邦学习怎么做预测?假如某纵向联邦学习生成了一个10个特征的模型,是由A和B两家公司共同建模完成,每个公司贡献5个特征。A公司拿到这个模型要怎么用呢?因为A只有包含5个特征的数据样本啊~嘿嘿,这里面有很多设计,大家开通脑筋想一想。

    具备什么样的条件才能实现联邦学习?

    马克思在《资本论》里说:“社会主义革命,会首先在生产力发达的国家诞生。”那想做联邦学习这个生意需要什么样的前提条件呢?

    首先,联邦学习按照数据的X和Y问题,分为横向联邦和纵向联邦。

    纵向:

    image.png

    横向:

    image.png

     

    以中国互联网公司的情况,横向联邦是很难有大的市场的。因为横向联邦意味着两家公司需要数据格式一致,那大概率是在同一领域的相互竞争的两家公司,合作的概率不大。

    商业机会可能在纵向联邦,需要有一家数据非常全的公司,然后其它小公司跟这家公司撞库,这个商业模式是可能的。而梯度交换又要求所有使用联邦学习的公司必须数据在同一云平台。

    所以,我大胆预测,如果未来几年有谁能做好公共云联邦学习的生意,一定背靠某个国内的大的云厂商才行。这个论断纯属YY,毕竟国内还没有特别成功的关于联邦学习的范例共参考。

    展开全文
  • 一款游戏要准备上500个服务器是什么意思,这个服务器是指who?难道是那种应用商店?
  • 疑问代词which/what/who的用法

    千次阅读 2019-07-16 22:34:25
    若后接名词(即用作限定词),只用which和what,不能用who,因为who不是限定词。 Which / What train did you come on? 你是坐哪次火车来的?1、当选择的范围较小或比较明确时,多用 which,当选择的范围较较大或不...
  • whoami 命令和 who am i 命令是不同的 2 个命令,前者用来打印当前执行操作的用户名,后者则用来打印登陆当前 Linux 系统的用户名。...[Cyuyan@localhost ~]$ who am i Cyuyan pts/0 2017-10-09 15:30 (:0.0) ...
  • who命令详解(图文)

    千次阅读 2019-05-01 16:25:07
    linux下登陆用户的行为信息—w和who命令详解 查看用户的操作系统管理员若想知道某一时刻用户的行为,只需要输入命令w 即可,在SHELL终端中输入如下命令: [root@localhost ~]# w 可以看到执行w命令及显示结果。...
  • who:都有关注性能测试 where:性能测试的关注领域 when:什么时候进行性能测试(功能测试中后期) 性能测试的分类: 1、并发测试:并发测试是通过模拟用户的并发访问,测试多用户并发访问同一个应用,同一个模块...
  • 简单快速的共求解器,使用pos标签,单词性别分类器和代词列表 支持的语言:英语,葡萄牙语 安装 pip install pronomial 用法 from pronomial import replace_corefs replace_corefs ( "London has been a major ...
  • linux命令---我是谁

    2018-05-14 15:20:46
    UID,实际用户ID,的是当前用户的ID。 EUID,有效用户ID,的是当前操作的用户ID。 二、whoami、who am i、who 如果普通用户登录 MacBook-Pro:~ user$ whoami user MacBook-Pro:~ user$ who am i user ...
  • 多态的是一类事物有多种形态,如一个父类有多个子类。 在面向对象方法中一般是这样描述多态性的:向不同的对象发送同一条消息,不同的对象在接收时会产生不同的行为(即方法)。 例:多态实例。 #定义父类 class ...
  • w 命令 和 who 命令

    千次阅读 2012-07-30 16:12:27
    该命令用于显示登录到系统的用户情况,w命令功能强大,它不但可以显示有登录到系统,还可以显示出这些用户当前正在进行的工作,并且统计数据相对who命令来说更加详细和科学. w命令的显示项目按以下顺序排列:...
  •  tty一词源于Teletypes,或者teletypewriters,原来的是电传打字机,是通过串行线用打印机键盘通过阅读和发送信息的东西,后来这东西被键盘与显示器取代,所以现在叫终端比较合适。  终端是一种字符型设备,它...
  • Who(来做):数据治理的责任主体、组织机构和岗位分工。 When(什么时间做):数据治理的实施计划表。 Why(为什么做):数据治理的目标。 Where(哪里做):数据治理的应用场景,如支持系统应用集成、支持决策分析。 ...
  • 你可以认为是图灵,也可以认为是冯·诺依曼,你认为是谁就是谁。 非要叫的话可以是: 巴贝奇Charles Babbage——通用计算机之父 图灵Alan Turing——计算机科学之父 约翰·阿坦那索夫John Vincent Atana.
  • 什么是堡垒机 堡垒机,即在一个特定的网络环境下,为了保障网络和数据不受来自外部和内部用户的入侵和破坏,而运用各种...可控是权限可控、行为可控。权限可控,比如某个工程师要离职或要转岗了。如果没有一个统一..
  • 通勤时间大概在一小时四十分钟,所以到家一般都是十一点多了,我经常会在楼下的KFC买个吮原味鸡或者鸡米花,静静地坐着吃完再回去洗澡睡觉。 期间我也想过换个住处,但是想了想,现在的房子地段很好,各种生活...
  • PCPU:WHAT域的任务执行后耗费的CPU时间。 WHAT:表示当前执行的任务。 查看某用户是否登陆系统用户很多的时候,可以在w后面加上某个用户名,则会查看该用户执行任务的情况。 [root@localhost ~]# ...
  • 重放攻击(也称为重放攻击)是一个人在未经他人许可的情况下使用他人的凭据。在视网膜和虹膜扫描仪上,重放攻击的几率非常低,因为几乎不可能复制别人的视网膜和虹膜来模仿。虽然视网膜和虹膜识别系统的确能保护信息...
  • Google是如何做Code Review的

    千次阅读 多人点赞 2019-10-24 10:18:40
    当然也有些例外(比如正则表达式和复杂的算法,如果能够解释清楚他们在做什么,肯定会让阅读代码的人受益良多),但大多数注释应该代码中没有包含的信息,比如代码背后的决策。 变更中附带的其他注释也很重要,...
  • 创业101 你的客户是谁 期末答案

    千次阅读 2019-12-28 22:53:32
    创业101:你的客户是谁 期末参考答案 • 多选1. 影响客户终身价值的因素包括( )。Factors affecting the lifetime value of customers include ( ). 客户价值Customer value 客户关系生命周期Customer ...
  • ✨目前正在学习:SSM框架,算法刷题 本文收录专栏 : java刷算法牛客—剑offer 牛客网,刷算法过面试的神级网站,用牛客你也牛。 免费注册和我一起学习刷题 希望大家多多支持一起进步呀! The man who fears ...
  • 此处的敏感用户是这个用户属于多个组,或者这个用户属于的组名跟这个用户名不一样 #! /bin/bash #list user who belong to more than one group #and list user who belong to the group which isn't the same as...
  • The man who fears losing has already lost. 怕输的人已经输了。 - 《权力的游戏》 ✨今日三剑 JZ9 用两个栈实现队列 JZ10 斐波那契数列 JZ11 旋转数组的最小数字 文章目录 ✨今日三剑 JZ9 用两个栈实现队列 题目...
  • 关于情感 接下来两者进行了大量的关于情感方面的谈话,这里的情感的是情绪(emotion)和感受(feeling)。 接下来的重头戏来了,LaMDA在和研究员讨论如何理解未见过的情感时,主动进行了提问,而且问的很犀利。 Do ...
  • 什么是深度学习模型

    千次阅读 2020-09-04 00:57:58
    (Image Source: Luke Rixson) 图片来源: 卢克·里克森 ( Luke Rixson ) 对权重进行了硬编码? (Who has hardcoded the weights?) This question really unveils what Deep Learning is about: It is about ...
  • 【IPD流程学习 二】IPD主要流程

    千次阅读 2020-02-13 17:52:26
    Who:都有来参与产品的开发?When:每个阶段的时间安排,比如何时进入开发阶段?How:如何开发这个产品?How much:产品开发的投资收益是多少? 2 组建PDT MM组 组建项目组、指派一条龙的项目经理,...
  • 我们可以参考5W2H分析法,尽量做到要点不缺失: What:是什么、做什么 Why:为什么、什么原因 Where:在哪里、从哪开始 When:开始结束时间、里程碑 Who负责、来做、验收 How:怎么做、什么方法、从哪切入 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 47,401
精华内容 18,960
关键字:

who是指谁