我可以更改“last”命令的输出格式以显示年份吗?

我可以更改“last”命令的输出格式以显示年份吗?

我正在尝试找到一种方法来报告 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/wtmpxgreptacsed

奖励:由于寻找文件末尾并仅向后移动固定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"

相关内容