列出当前登录到unix服务器的所有用户

时间:2014-07-26 17:32:28

标签: bash shell unix

在unix中,我使用who - 命令列出当前登录系统的所有用户。
我希望编写一个bash shell脚本,它显示与who - 命令相同的输出 我尝试过以下方法:

  1. vi log.sh - 现在有一个文件log.sh
  2. 现在,输入who
  3. 保存并退出
  4. 授予执行权限:chmod +x log.sh
  5. 执行:sh -vx log.sh
  6. 这将提供与使用who相同的输出 但是,有没有其他方法来编写这样的shell脚本?

2 个答案:

答案 0 :(得分:3)

很难回答,因为我怀疑这是作业(并且我不希望给你完整答案)。此外,我不知道你在各种编程领域的熟练程度。所以,我只会尝试做出符合How do I ask and answer Homework Community Wiki

的答案
  

还有其他办法吗?....

是的。显然:who必须以某种方式工作。在最糟糕的情况下,您可以搜索源代码以了解 它是如何工作的。


幸运的是,这个问题不需要这么极端的解决方案。正如评论中所述,who在我的Debian系统上从/var/tmp/utmp/var/run/utmp读取。

cat /var/run/utmp

您将看到这是一个二进制“文件”。你必须以某种方式解码它。这就是man utmp可能提供帮助的地方。它将公开与utmp文件中的一条记录对应的C结构。

有了这些知识,您就可以用自己喜欢的语言处理文件了。请注意bash(或任何shell)可能是处理二进制数据结构的最佳语言。


正如我先说的那样,你没有为我(我们?)提供足够的背景来提供一些精确的建议。无论如何,如果深入研究内核数据结构......那么......远远超出了你的期望,可能是一些基于grep / awk / {{1}的“简单”解决方案} / bash 可能足以过滤输出:

whatever

答案 1 :(得分:0)

以此为挑战,我提出了这个解决方案:

#!/bin/bash

shopt -s extglob
while read record; do
    # ut_name at offset 44 size 32
    ut_name="${record:44:32}"
    # ut_line at offset 8 size 32
    ut_line="${record:8:32}"
    echo ${ut_name%%*(.)} ${ut_line%%*(.)}
done < <(hexdump -v -e '384/1 "%_p"' -e '"\n"' /var/run/utmp)
#                       ^^^
#          according to utmp.h, sizeof(struct utmp) is 384 bytes
#          so hexdump outputs here one line for each record.

由于bash不擅长处理二进制数据(特别是包含\x00),因此我不得不依赖hexdump自定义格式来“解码”utmp条记录。

当然,这远非完美,产生和输出与who给出的完全相同可能需要一些相当大的努力。但这可能是一个很好的起点...