在unix中,我使用who
- 命令列出当前登录系统的所有用户。
我希望编写一个bash
shell脚本,它显示与who
- 命令相同的输出
我尝试过以下方法:
vi log.sh
- 现在有一个文件log.sh
who
chmod +x log.sh
sh -vx log.sh
这将提供与使用who
相同的输出
但是,有没有其他方法来编写这样的shell脚本?
答案 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
给出的完全相同可能需要一些相当大的努力。但这可能是一个很好的起点...