我正在尝试找到一种方法来报告 Solaris 10 服务器上所有用户的最近登录情况。我从命令的输出开始last
。使用该命令,我得到如下输出:
bd9439 pts/1 vpn-xxx-xx-xxx-x Fri Oct 25 10:46 still logged in
vf7854 pts/1 vpn-xxx-xx-xxx-x Fri Oct 25 10:23 - 10:38 (00:15)
根据手册页,日期和时间格式由区域设置控制。我很少使用区域设置。我可以使用某些东西来更改显示以包含日期的“年份”部分吗?我希望得到与此类似的输出行:
bd9439 pts/1 vpn-xxx-xx-xxx-x Fri Oct 25 2013 10:46 still logged in
vf7854 pts/1 vpn-xxx-xx-xxx-x Fri Oct 25 2013 10:23 - 10:38 (00:15)
我不清楚手册页是否指的是命令last
本身的输出,或者数据实际上如何存储在 /var/adm/wtmpx 中。
如果有另一种方法来获取这个“上次登录”属性,我很乐意学习。
答案1
我一半提供背景,一半咆哮
您遇到的一个例子说明了我不喜欢管理 Solaris 系统的主要原因:没有什么是简单的。
我不知道除了更改时间戳某些部分的顺序之外,语言环境是否真的会做任何事情。我很感兴趣是否有人知道如何哄骗索拉里斯公司last
提供这一年,但我不会屏住呼吸。 Sun 的软件开发口号似乎是“技术上可行”。
Sun 似乎已经开发出了一些达到他们绝对需要的东西,然后几乎就停在那里了。因此,您最终会得到像这样的普遍接受的解决方案,并且您只需保留一系列常见问题的解决方法即可。
我发现执行此操作的唯一方法是将管道/usr/lib/acct/fwtmp
的全部内容转储到我用于操作文本输出( 、、等)的其他程序。/var/adm/wtmpx
grep
tac
sed
奖励:由于寻找文件末尾并仅向后移动固定wtmpx
记录长度会要求太多,因此fwtmp
只能打印出wtmpx
文件中出现的内容。因此,您必须使用其他一些方法(可能tac
)来反转线路,除非您实际上对最旧的信息(即至少可能的用例,但我离题了)。
取决于您的系统运行了多长时间wtmpx
,可能会有点大,所以您可能想去喝杯咖啡,也许去检查一下您的轮胎是否充气不足,也许在您休息的时候读一两本书在它。
您问题的实际答案:
这是一个模拟命令,last
适用于大多数有兴趣查看登录记录的人:
# cat /var/adm/wtmpx | /usr/lib/acct/fwtmp | tac | head
您会注意到我必须通过管道输入wtmpx
,因为他们没有为您提供将文件提供给fwtmp
.这是因为在大多数用例中通过 Technically Works™ 输入它stdin
,他们就不必编写几行额外的代码。所以他们宁愿让管理员这样做。
这是我所管理的系统上的上述输出示例:
[root@atum root]# cat /var/adm/wtmpx | /usr/lib/acct/fwtmp | tac | head
jadavis6 ts/1 pts/1 19410 7 0000 0000 1382723864 157168 0 19 ditirlns01.xxx.edu Fri Oct 25 13:57:44 2013
jadavis6 sshd 19404 7 0000 0000 1382723864 133973 0 19 ditirlns01.xxx.edu Fri Oct 25 13:57:44 2013
oracle sshd 6640 8 0000 0000 1382713401 157107 0 0 Fri Oct 25 11:03:21 2013
oracle ts/1 pts/1 6647 8 0000 0000 1382713401 150489 0 0 Fri Oct 25 11:03:21 2013
oracle ts/1 pts/1 6647 7 0000 0000 1382712445 24488 0 23 a0003040148735.xxx.edu Fri Oct 25 10:47:25 2013
oracle sshd 6640 7 0000 0000 1382712442 304729 0 23 a0003040148735.xxx.edu Fri Oct 25 10:47:22 2013
jadavis6 sshd 23537 8 0000 0000 1382560970 410725 0 0 Wed Oct 23 16:42:50 2013
jadavis6 ts/1 pts/1 23544 8 0000 0000 1382560970 404795 0 0 Wed Oct 23 16:42:50 2013
jadavis6 ts/1 pts/1 23544 7 0000 0000 1382552999 619524 0 19 ditirlns01.xxx.edu Wed Oct 23 14:29:59 2013
jadavis6 sshd 23537 7 0000 0000 1382552999 602215 0 19 ditirlns01.xxx.edu Wed Oct 23 14:29:59 2013
[root@atum root]#
编辑:
我知道我在抱怨一些小事,但过了一会儿,我就厌倦了每一件小事(比如简单地问“今年是哪一年?”),变成了一个小时的谷歌节或或多或少只是部落的东西知识(例如 的存在fwtmp
)。
答案2
GNU/Linuxlast
提供了这种-F
切换。不过,如果 Solaris 这样做的话,我会感到惊讶。
在内部,该wtmp
文件应该具有纪元时间戳,因此如果您愿意用 C 或 Perl 编写一些内容,您可以创建自己的last
命令。您需要查看该结构的相应 C 头文件。这wtmp
是一个“二进制”文件,不适合使用标准解析工具进行评估。
考虑定期归档和截断您的wtmp
文件,以便您知道它适用于哪一年。
答案3
我有一个类似的案例,但需要我的自定义格式的登录日期。这对我有用:
date -d "`last -F | head -n1 | sed -r 's/.*\.[0-9]+\s+//' | sed -r 's/\s(still|-).*//'`" +"%F_%R"