在pts登录名的“ last”输出中缺少IP信息的原因?


18

我有五个正在运行的CentOS 6 linux系统,并且遇到了一个相当奇怪的问题,在我拥有的所有linux系统中,我的用户名似乎都只发生了...这是我从last命令中删除条目的示例。 。

mpenning pts/19                        Fri Nov 16 10:32 - 10:35  (00:03)
mpenning pts/17                        Fri Nov 16 10:21 - 10:42  (00:21)
bill     pts/15       sol-bill.local   Fri Nov 16 10:19 - 10:36  (00:16)
mpenning pts/1        192.0.2.91       Fri Nov 16 10:17 - 10:49 (12+00:31)
kkim14   pts/14       192.0.2.225      Thu Nov 15 18:02 - 15:17 (4+21:15)
gduarte  pts/10       192.0.2.135      Thu Nov 15 12:33 - 08:10 (11+19:36)
gduarte  pts/9        192.0.2.135      Thu Nov 15 12:31 - 08:10 (11+19:38)
kkim14   pts/0        :0.0             Thu Nov 15 12:27 - 15:17 (5+02:49)
gduarte  pts/6        192.0.2.135      Thu Nov 15 11:44 - 08:10 (11+20:25)
kkim14   pts/13       192.0.2.225      Thu Nov 15 09:56 - 15:17 (5+05:20)
kkim14   pts/12       192.0.2.225      Thu Nov 15 08:28 - 15:17 (5+06:49)
kkim14   pts/11       192.0.2.225      Thu Nov 15 08:26 - 15:17 (5+06:50)
dspencer pts/8        192.0.2.130      Wed Nov 14 18:24   still logged in
mpenning pts/18       alpha-console-1. Mon Nov 12 14:41 - 14:46  (00:04)

您可以在上面看到我的两个pts登录条目,它们没有与之关联的源IP地址。我的CentOS机器有多达六个共享系统的其他用户。我的登录名中大约有10%看到此问题,但是没有其他用户名显示此行为。没有/var/log/secure源IP地址的条目中没有条目。

问题

考虑到我保留在这些系统上的脚本类型(这些脚本控制着我们的大部分网络基础结构),对此我感到有些惊讶,并且想了解是什么导致我的登录偶尔丢失源地址。

  • 为什么last -i显示0.0.0.0点线项目(另见这个答案
  • 除了恶意活动之外,是否有任何其他可以合理解释该行为的信息?
  • 除了为bash记录历史记录打上时间戳之外,我还能做其他事情来追踪问题吗?

信息性

自从这种情况开始发生以来,我启用了bash历史记录时间戳记(即HISTTIMEFORMAT="%y-%m-%d %T "in .bash_profile),并且还添加了其他一些bash历史记录hack;但是,这并不能提供先前事件发生时的线索。

所有系统都运行CentOS 6.3 ...

[mpenning@typo ~]$ uname -a
Linux typo.local 2.6.32-279.9.1.el6.x86_64 #1 SMP Tue Sep 25 21:43:11 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux
[mpenning@typo ~]$

编辑

如果使用last -i mpenning,我会看到类似这样的条目...

mpenning pts/19       0.0.0.0          Fri Nov 16 10:32 - 10:35  (00:03)
mpenning pts/17       0.0.0.0          Fri Nov 16 10:21 - 10:42  (00:21)

对于那些试图回答的人请注意:我尚未使用screen命令或GUI 登录。我所有的登录名都来自SSH;要获得赏金,您必须引用权威参考来解释last -i 0.0.0.0仅通过SSH来源的条目。

编辑2(关于ewwhite的问题)

/etc/resolv.conf(请注意,我.locallast上面的输出中使用了加法器来隐藏公司的信息)

[mpenning@sasmars network]$ cat /etc/resolv.conf
nameserver 192.0.2.40
nameserver 192.0.2.60
domain mycompany.com
search mycompany.com
[mpenning@sasmars network]$

/etc/hosts 信息(请注意,此自定义的主机文件仅存在于存在这些问题的计算机之一上)

[mpenning@sasmars network]$ cat /etc/hosts
127.0.0.1       localhost.localdomain localhost
192.0.2.44      sasmars.mycompany.com sasmars
::1             localhost6.localdomain6 localhost6

## Temporary kludge until I add reverse hostname mappings...
## Firewalls
192.0.2.254     a2-inet-fw1
192.0.2.253     a2-inet-fw2
192.0.2.254     a2-wan-fw1
192.0.2.253     a2-wan-fw2
192.0.2.201     a2-fab-fw1
192.0.2.202     a2-fab-fw2
192.0.2.203     t1-eds-fw1
192.0.2.42      sasvpn
192.0.2.246     sasasa1
192.0.2.10      sasoutfw1
## Wireless
192.0.2.6       saswcs1
192.0.2.2       l2wlc3
192.0.2.4       l2wlc4
192.0.2.12      f2wlc5
192.0.2.16      f2wlc6
192.0.2.14      f2wlc1
192.0.2.8       f2wlc2
[mpenning@sasmars network]$

sftp/var/log/secure*的输出

Dec 26 10:36:37 sasmars sshd[26016]: pam_sm_authenticate: called (pam_tacplus v1.3.7)
Dec 26 10:36:37 sasmars sshd[26016]: pam_sm_authenticate: user [mpenning] obtained
Dec 26 10:36:37 sasmars sshd[26016]: tacacs_get_password: called
Dec 26 10:36:37 sasmars sshd[26016]: tacacs_get_password: obtained password
Dec 26 10:36:37 sasmars sshd[26016]: pam_sm_authenticate: password obtained
Dec 26 10:36:37 sasmars sshd[26016]: pam_sm_authenticate: tty [ssh] obtained
Dec 26 10:36:37 sasmars sshd[26016]: pam_sm_authenticate: rhost [192.0.2.91] obtained
Dec 26 10:36:37 sasmars sshd[26016]: pam_sm_authenticate: trying srv 0
Dec 26 10:36:38 sasmars sshd[26016]: Accepted password for mpenning from 192.0.2.91 port 55118 ssh2
Dec 26 10:36:38 sasmars sshd[26016]: pam_sm_setcred: called (pam_tacplus v1.3.7)
Dec 26 10:36:38 sasmars sshd[26016]: pam_unix(sshd:session): session opened for user mpenning by (uid=0)
Dec 26 10:36:38 sasmars sshd[26018]: pam_sm_setcred: called (pam_tacplus v1.3.7)
Dec 26 10:36:38 sasmars sshd[26018]: subsystem request for sftp
Dec 26 10:37:20 sasmars sshd[26016]: pam_unix(sshd:session): session closed for user mpenning
Dec 26 10:37:20 sasmars sshd[26016]: pam_sm_setcred: called (pam_tacplus v1.3.7)

最终决议

请参阅下面的答案


它们都是通过ssh连接吗?我有许多大型多用户CentOS 6.x系统。我看看是否可以在那看到相同的东西。
ewwhite 2012年

@ewwhite,谢谢...所有登录名都应为ssh(偶尔通过GUI控制台登录,但我只在打开包装盒时才从GUI登录)。没有启用其他远程登录协议。
Mike Pennington

的输出是否last -i mpenning显示空白?
JeffG 2012年

哦,对..我需要在EL6.3服务器上复制它…
ewwhite

您可以从/ var / log / secure和/ var / log / messages提供登录输出吗?我相信IP值是通过PAM传递的参数。PAM是否正确显示IP?
马修·伊夫

Answers:


4

script RedHat和Debian之间的行为差​​异

链接库

CentOS 6.3-脚本(util-linux-ng 2.17.2)

#ldd /usr/bin/script

linux-vdso.so.1 =>  (0x00007fff077ff000)
libutil.so.1 => /lib64/libutil.so.1 (0x00007f309f5d1000)
libutempter.so.0 => /usr/lib64/libutempter.so.0 (0x00007f309f3cf000)
libc.so.6 => /lib64/libc.so.6 (0x00007f309f03b000)
/lib64/ld-linux-x86-64.so.2 (0x00007f309f7e1000)

Ubuntu 12.04-脚本(util-linux 2.20.1)

#ldd /usr/bin/script

linux-vdso.so.1 =>  (0x00007fff375ff000)
libutil.so.1 => /lib/x86_64-linux-gnu/libutil.so.1 (0x00007fc0d7ab0000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fc0d76f1000)
/lib64/ld-linux-x86-64.so.2 (0x00007fc0d7cdc000)

PTY

基于上游源代码script两个版本都可以打开新的pty。以下是测试。

Ubuntu 12.04

john@U64D211:~/tmp$ ls /dev/pts
0  1  5  8  ptmx
john@U64D211:~/tmp$ script
Script started, file is typescript
john@U64D211:~/tmp$ ls /dev/pts
0  1  2  5  8  ptmx
john@U64D211:~/tmp$ last -i
john     pts/0        0.0.0.0          Sat Jan  5 09:09   still logged in   
reboot   system boot  0.0.0.0          Sat Jan  5 09:08 - 09:52  (00:44)    
john     pts/0        0.0.0.0          Thu Jan  3 00:50 - 01:42  (00:52)    
reboot   system boot  0.0.0.0          Thu Jan  3 00:48 - 01:43  (00:54)    

wtmp begins Tue Jan  1 20:48:28 2013
john@U64D211:~/tmp$ exit
exit
Script done, file is typescript
john@U64D211:~/tmp$ ls /dev/pts
0  1  5  8  ptmx
john@U64D211:~/tmp$ 

Ubuntu 12.04 script确实打开了一个新的pts(2)。它只是没有更新/var/log/wtmp

CentOS的6

我已经跳过了测试,因为我们已经知道要script打开pty并向wtmp注册。

自由主义

因此,主要的区别似乎是与libutempter.so.0CentOS script链接的额外库。

使用Ubuntu 12.04测试

script用libutempter 编译

john@U64D211:~/tmp/util-linux-2.20.1$ sudo apt-get install libutempter-dev
john@U64D211:~/tmp/util-linux-2.20.1$ ./configure --with-utempter
john@U64D211:~/tmp/util-linux-2.20.1$ make
john@U64D211:~/tmp/util-linux-2.20.1$ cd term-utils/
john@U64D211:~/tmp/util-linux-2.20.1/term-utils$ ldd ./script
linux-vdso.so.1 =>  (0x00007fff54dff000)
libutil.so.1 => /lib/x86_64-linux-gnu/libutil.so.1 (0x00007f289e635000)
libutempter.so.0 => /usr/lib/libutempter.so.0 (0x00007f289e432000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f289e072000)
/lib64/ld-linux-x86-64.so.2 (0x00007f289e861000)

测试中

跑步前 script

john@U64D211:~/tmp/util-linux-2.20.1/term-utils$ ls /dev/pts
0  1  5  8  ptmx
john@U64D211:~/tmp/util-linux-2.20.1/term-utils$ last -i
john     pts/0        0.0.0.0          Sat Jan  5 09:09   still logged in   
reboot   system boot  0.0.0.0          Sat Jan  5 09:08 - 10:37  (01:28)    
john     pts/0        0.0.0.0          Thu Jan  3 00:50 - 01:42  (00:52)    
reboot   system boot  0.0.0.0          Thu Jan  3 00:48 - 01:43  (00:54)    

wtmp begins Tue Jan  1 20:48:28 2013

script

john@U64D211:~/tmp/util-linux-2.20.1/term-utils$ ./script
Script started, file is typescript
john@U64D211:~/tmp/util-linux-2.20.1/term-utils$ ls /dev/pts
0  1  2  5  8  ptmx
john@U64D211:~/tmp/util-linux-2.20.1/term-utils$ last -i
john     pts/2        0.0.0.0          Sat Jan  5 10:37   still logged in   
john     pts/0        0.0.0.0          Sat Jan  5 09:09   still logged in   
reboot   system boot  0.0.0.0          Sat Jan  5 09:08 - 10:37  (01:29)    
john     pts/0        0.0.0.0          Thu Jan  3 00:50 - 01:42  (00:52)    
reboot   system boot  0.0.0.0          Thu Jan  3 00:48 - 01:43  (00:54)    

wtmp begins Tue Jan  1 20:48:28 2013
john@U64D211:~/tmp/util-linux-2.20.1/term-utils$ exit
exit
Script done, file is typescript

script结束

john@U64D211:~/tmp/util-linux-2.20.1/term-utils$ ls /dev/pts
0  1  5  8  ptmx
john@U64D211:~/tmp/util-linux-2.20.1/term-utils$ last -i
john     pts/2        0.0.0.0          Sat Jan  5 10:37 - 10:37  (00:00)    
john     pts/0        0.0.0.0          Sat Jan  5 09:09   still logged in   
reboot   system boot  0.0.0.0          Sat Jan  5 09:08 - 10:37  (01:29)    
john     pts/0        0.0.0.0          Thu Jan  3 00:50 - 01:42  (00:52)    
reboot   system boot  0.0.0.0          Thu Jan  3 00:48 - 01:43  (00:54)    

wtmp begins Tue Jan  1 20:48:28 2013
john@U64D211:~/tmp/util-linux-2.20.1/term-utils$ last
john     pts/2                         Sat Jan  5 10:37 - 10:37  (00:00)    
john     pts/0        :0               Sat Jan  5 09:09   still logged in   
reboot   system boot  3.2.0-35-generic Sat Jan  5 09:08 - 10:38  (01:30)    
john     pts/0        :0               Thu Jan  3 00:50 - 01:42  (00:52)    
reboot   system boot  3.2.0-35-generic Thu Jan  3 00:48 - 01:43  (00:54)    

wtmp begins Tue Jan  1 20:48:28 2013

空主机名的根本原因

是的,script.cwtmp使用空的主机名创建条目。看下面的代码util-linux-2.20.1/term-utils/script.c行:245-247

#ifdef HAVE_LIBUTEMPTER
    utempter_add_record(master, NULL);
#endif

根据 libutempter-1.1.5/utempter.h

extern int utempter_add_record (int master_fd, const char *hostname);

所以,script.c实际上是通过空主机名到utempter_add_record

红帽移植

有趣的是,上游util-linux-ng-2.17.2实际上并不支持libutempter。似乎Redhat决定增加支持。

john@U64D211:~/tmp/util-linux-ng-2.17.2$ ./configure --help|grep utemp

上面的命令返回空结果。

结论

因此,两个发行版之间的行为差​​异不是错误,而是选择。RedHat决定支持该功能,而Debian跳过了该功能。


CentOS 5呢?
ewwhite

@ewwhite您能给我coreutilsCentOS 5使用的rpm版本吗?我必须检查源代码。
John Siu 2013年

没必要。libutempter在EL4中未链接(通过ldd),但在EL5和EL6 命令中链接script。自从2007年coreutils在EL4上引入RHEL 5 是5.2.1版以来,类似Red Hat的系统可能已经进行了此功能更改。在EL5上,版本为5.97。
ewwhite

我知道了。顺便说一句,script在util-linux中。
John Siu

1
@JohnSiu:是的,这就是差异的原因,在我看来,他们修复了所报告的错误并(无意间)创建了一个新错误。
user9517支持GoFundMonica

12

这让我感到非常困惑。它应该使用一些DNS名称或IP地址。我也检查了last.c文件,但仍然找不到为什么不显示任何内容。大概花一些时间,我可以算出大约0.0.0.0的部分。

int dns_lookup(char *result, int size, int useip, int32_t *a)
307 {
308     struct sockaddr_in  sin;
309     struct sockaddr_in6 sin6;
310     struct sockaddr     *sa;
311     int         salen, flags;
312     int         mapped = 0;
313 
314     flags = useip ? NI_NUMERICHOST : 0;
315 
316     /*
317      *  IPv4 or IPv6 ?
318      *  1. If last 3 4bytes are 0, must be IPv4
319      *  2. If IPv6 in IPv4, handle as IPv4
320      *  3. Anything else is IPv6
321      *
322      *  Ugly.
323      */
324     if (a[0] == 0 && a[1] == 0 && a[2] == htonl (0xffff))
325         mapped = 1;
326 
327     if (mapped || (a[1] == 0 && a[2] == 0 && a[3] == 0)) {
328         /* IPv4 */
329         sin.sin_family = AF_INET;
330         sin.sin_port = 0;
331         sin.sin_addr.s_addr = mapped ? a[3] : a[0];
332         sa = (struct sockaddr *)&sin;
333         salen = sizeof(sin);
334     } else {
335         /* IPv6 */
336         memset(&sin6, 0, sizeof(sin6));
337         sin6.sin6_family = AF_INET6;
338         sin6.sin6_port = 0;
339         memcpy(sin6.sin6_addr.s6_addr, a, 16);
340         sa = (struct sockaddr *)&sin6;
341         salen = sizeof(sin6);
342     }
343 
344     return getnameinfo(sa, salen, result, size, NULL, 0, flags);
345 }

在上下文中使用的两个全局变量是这些。

int usedns = 0;     /* Use DNS to lookup the hostname. */
72 int useip = 0;       /* Print IP address in number format */

因此,从理论上讲,它应该使用dns或IP。

我将看看是否可以进一步挖掘任何内容。但是ewwhite问的是有效的问题。


1
+1用于深入研究该命令的实际源代码。
克里斯·史密斯

很好的信息,这是我正在寻找的权威来源。感谢您为查找代码而付出的辛勤工作。
Mike Pennington

8

因此,我在调试器中运行了最后一步,希望该调试器至少可以为您提供一些答案。我的感觉是根本原因虽然更深。

为什么last -i对于pts行条目显示0.0.0.0

最好的解释方式是当您通过-i 时会发生什么。

原因是在此代码的 last.c

if (usedns || useip)
  r = dns_lookup(domain, sizeof(domain), useip, p->ut_addr_v6);
if (r < 0) {
   len = UT_HOSTSIZE;
   if (len >= sizeof(domain)) len = sizeof(domain) - 1;
   domain[0] = 0;
   strncat(domain, p->ut_host, len);
}

这两个usednsuseip(使用默认选项)不会被标记。这将导致逻辑​​从结构中复制出来,该结构p->ut_host根据man utmp包含登录到的记录所记录的远程登录名utmp

char ut_host[UT_HOSTSIZE]; /* Hostname for remote login, or
                              kernel version for run-level
                              messages */

在您的情况下,此处的值为零。这就是为什么当您运行时last什么都不会出现。

在这种情况下,last -i将调用dns_lookup。这将传递要通过DNS解析的条目(p-> ut_addr_v6)。在您的情况下,该值包含零。

大部分dns_lookup是橱窗装饰和装饰。基本上,重要的是功能getnameinfo。这是一个库调用,在这种情况下,它将尽力解决存储在中的二进制值ut_addr_v6。当此条目包含零时(例如您的情况),您实际上是将其解析0.0.0.0last -i输出所发生的情况。

除了恶意活动之外,是否有任何其他可以合理解释该行为的信息?

好吧,这可能是一个错误或疏忽。它不太可能是恶意的,因为将任何痕迹留给攻击者而不是忽略源地址似乎是愚蠢的。

到目前为止,答案的焦点一直在寻找错误的地方。last只是读utmpwtmp。但是last,利用其所拥有的数据会尽力而为。

您的根本原因在于utmp写入方式

虽然有一些应用程序直接写入到其中,但utmp我想您问题的根源在于sshd处理会话管理的方式。

除了为bash记录历史记录打上时间戳之外,我还能做其他事情来追踪问题吗?

utmp通常不是可写的,也不是应该写的。utmp由旨在登录和设置会话的应用程序编写。在你的情况是sshd

为什么sshd无法正确处理用户很奇怪,因为它应该正确复制您来自的主机名。这是调试工作可能应该集中的地方。首先将sshd的调试输出添加到您的日志中,看看是否出现异常情况。

如果您想解决该问题(或者甚至可能发现更多有关该问题的信息),可以通过将其添加到/etc/pam.d/sshd 的会话条目中来pam_lastlog进行管理。utmp

实际上,检查它是否已经存在不会有什么坏处-因为pam_lastlog其中包含一个nohost肯定可以解释您所遇到的行为的选项。

最后,您根本无法使用last。aulast通过审核子系统完成相同的工作。

值得一试,看看是否至少写了正确的地址。如果还没有,那么您的问题一定是与sshd有关,因为sshd会在utmp或audit之类的不同子系统之间传递DNS名称。


您能否pam_lastlog如上所述添加一些有关如何使用的特定说明?
Mike Pennington

8

(1)基于OP last输出

通过ssh登录后,您可以ssh到localhost并获得0.0.0.0的访问权限last -i

基于OP日志的前四行

mpenning pts/19                        Fri Nov 16 10:32 - 10:35  (00:03)
mpenning pts/17                        Fri Nov 16 10:21 - 10:42  (00:21)
bill     pts/15       sol-bill.local   Fri Nov 16 10:19 - 10:36  (00:16)
mpenning pts/1        192.0.2.91       Fri Nov 16 10:17 - 10:49 (12+00:31)

pts/19登录在pts/17登录期限内。

pts/17登录在pts/1 登录期限内。

对于这种特定情况,逻辑上是猜测192.0.2.91(pty/1)中的OP ssh ,然后在该ssh会话中,ssh localhost再次在本地()登录到服务器(pts/17),然后再次登录到服务器(pts/19)。

请检查这种重叠是否与其他情况一起发生。

以下可能有助于查明原因

  • 您是否使用ssh-key?如果是这样,您是否在服务器上设置了ssh-key以进行本地登录?
  • 检查或发布同一时间段的/ var / log / secure。它可能会提供一些提示。
  • 检查您使用的脚本
  • 检查您使用的shell别名
  • 检查您的命令历史记录

(2)附加服务

方案1-sudo和终端

  1. UserA登录X窗口
  2. 打开终端窗口,做 xhost + localhost
  3. su - UserBsudo su - UserB然后打开一个新终端(xterm,gnome-terminal等)
  4. UserB 将显示为0.0.0.0 in last -i

su - UserB不会UserB在最后一次注册为登录名,但是打开终端会。

方案2-登录

  1. SSH到服务器
  2. 类型 sudo login
  3. 自己登录
  4. 检查lastlast -i

last不显示的主机名或IP login sessionlast -i将为IP 0.0.0.0 login session

john@U64D211:~$ last -5
john     pts/0                         Sun Dec 23 20:50   still logged in   
john     pts/0                         Sun Dec 23 20:50 - 20:50  (00:00)    
john     pts/0        :0               Sun Dec 23 20:50 - 20:50  (00:00)    
reboot   system boot  3.2.0-35-generic Sun Dec 23 20:49 - 20:50  (00:01)    
john     pts/2        js.example.com   Sun Dec 23 17:14 - crash  (03:34)    

wtmp begins Sat Dec  1 06:30:46 2012
john@U64D211:~$ last -5i
john     pts/0        0.0.0.0          Sun Dec 23 20:50   still logged in   
john     pts/0        0.0.0.0          Sun Dec 23 20:50 - 20:50  (00:00)    
john     pts/0        0.0.0.0          Sun Dec 23 20:50 - 20:50  (00:00)    
reboot   system boot  0.0.0.0          Sun Dec 23 20:49 - 20:50  (00:01)    
john     pts/2        192.168.1.90     Sun Dec 23 17:14 - crash  (03:34)    

wtmp begins Sat Dec  1 06:30:46 2012

妻子的答案已经显示了的代码块last.c。之所以last显示空的主机名/ IP是因为ut_host这些记录实际上是空的。要获得完整的wtmp结构,请man wtmp在任何Linux系统上执行。

这里的2个场景表明,即使在某些情况下,标准软件包也确实会创建它们。

(3)Bash历史记录破解

仅当会话bash用作交互式外壳程序时,它才有效。

.bashrc并且.bash_profile仅由所使用bash

如果会话使用任何其他shell(sh,csh等)或直接执行程序,它们将不会自动获得,并且也不会有bash历史记录。

(4)过程核算

由于OP没有提及secure文件,因此我认为这是一个死胡同,它实际上提供了提示。

如果以下假设正确

`last` 0.0.0.0 entries are actually created with in OP own session

auth.log(debian)/ secure(CentOS)将无济于事。由于仅记录了与身份验证相关的操作。

受其数据结构限制的wtmp / utmp也是死胡同。没有有关创建它们的信息。

这使我们只能选择一种方法,即会计处理。这是一门大枪,必须谨慎使用。

  1. 可能违反公司政策
  2. 共享系统上的其他用户可能对启用它不满意/不满意
  3. 日志文件会占用大量磁盘空间。密切注意文件大小的增长率。

根据这篇文章,psacct软件包的版本应为6.3.2-56或更高。

如果要使用它并且/var/log空间有限,则将acct日志文件更改为目录下的目录(仅具有root用户访问权限)/home,该目录通常具有更多空间。

这真是大枪。OP发生率为10%时,应在一周内得到结果。如果在此期间,在last登录日志中什么都没有显示空条目,那将是一个神秘的 情况,需要采取一些严厉的措施

以下是示例输出 lastcomm

lesspipe               john     pts/8      0.02 secs Mon Dec 24 17:10
lesspipe          F    john     pts/8      0.00 secs Mon Dec 24 17:10
dirname                john     pts/8      0.00 secs Mon Dec 24 17:10
basename               john     pts/8      0.00 secs Mon Dec 24 17:10
kworker/1:2       F    root     __         0.00 secs Mon Dec 24 16:54
tty                    john     pts/6      0.01 secs Mon Dec 24 17:09
tty                    john     pts/4      0.01 secs Mon Dec 24 17:09
cron              F    root     __         0.05 secs Mon Dec 24 17:09
sh               S     root     __         0.01 secs Mon Dec 24 17:09
find                   root     __         0.01 secs Mon Dec 24 17:09
maxlifetime            root     __         0.00 secs Mon Dec 24 17:09
php5                   root     __         0.23 secs Mon Dec 24 17:09
which                  root     __         0.00 secs Mon Dec 24 17:09
lastcomm               root     pts/0      0.01 secs Mon Dec 24 17:08
tty                    john     pts/1      0.01 secs Mon Dec 24 17:08
dconf worker         X john     __         5.46 secs Mon Dec 24 16:58
lastcomm               root     pts/7      0.04 secs Mon Dec 24 17:05
mesg             S     root     pts/7      0.00 secs Mon Dec 24 17:05
bash              F    root     pts/7      0.00 secs Mon Dec 24 17:05
dircolors              root     pts/7      0.00 secs Mon Dec 24 17:05

您也可以使用'dump-acct'显示更多信息。

PS1:我尝试打开一些终端和SSH会话。目前尚不清楚(或不容易指出)什么打开了新的积分。但是,它确实显示了该点/会话中运行的所有内容。

PS2:关于Mike使用acct的博客文章。


我不知道您如何得出本地主机登录会得出0.0.0.0的结论,对于我来说它总是显示为本地主机。我只使用ssh登录,我不知道您在本地登录的意思
Mike Pennington

ssh localhost检查last -i
约翰兆

关于login locally,我的意思是ssh localhost在该ssh会话中进行。我修改了这句话,希望现在不要那么混乱。
约翰兆

添加了其他方案。
约翰兆

5

当您登录计算机时,这些可能是最后一条命令中的少量条目。

geekride   tty2                        Fri Dec 21 15:45 - 15:45  (00:00)    
geekride   pts/1                       Fri Dec 21 13:45   still logged in   
geekride   pts/1        :pts/0:S.0     Thu Dec  6 12:49 - 00:40  (11:50)    
geekride   pts/1        10.31.33.47    Thu Dec  6 12:49 - 00:40  (11:50)    

当您通过终端或控制台通过按CTRL + ALT + F1-6登录时,出现带有tty *的第一个条目。从正在使用的终端可以很清楚地看出来。

当您登录到计算机并在GUI中打开终端窗口时,通常会显示第二个条目。即使您在同一终端窗口中打开一个新的选项卡,也将有一个条目。

通过SSH登录后打开屏幕会话时,出现第三种输入类型。这还将在其中创建一个没有任何IP地址的条目。

第四项很普通,每个人都可以理解。

如果last -i使用以下条目,您将看到类似以下内容:

geekride   tty2         0.0.0.0        Fri Dec 21 15:45 - 15:45  (00:00)    
geekride   pts/9        0.0.0.0        Fri Dec 21 13:45   still logged in   
geekride   pts/1        0.0.0.0        Thu Dec  6 12:49 - 00:40  (11:50)    

我非常确定您的情况属于这两种情况中的任何一种,一种情况涉及GUI中的终端Window,另一种涉及屏幕会话。

希望对您有所帮助。


2
我没有使用GUI或screen任何0.0.0.0条目。我仅在安装机器时(大约在八月/九月)使用GUI。0.0.0.0在那之后,我看到许多积分条目。
Mike Pennington

1
这真的很有用,并消除了我的一些非常老的疑问
Rahul

3

我认为如果不调试last.c,我们将无法做到这一点,但这应该不太难,因为它易于编译...

但是,一种可能性是使用utmpdump命令转储/ var / log / wtmp文件,并查看原始记录,这可能对您有所启发。如果没有,请发布一些相关的输出

utmpdump /var/log/wtmp 

这样我们就可以重新创建您的wtmp的本地副本以进行调试

utmpdump -r <dumpfile >wtmp

这似乎不是一个答案,但实际上是,我们已经超越了仅知道这一点的人,并且确实需要进行调试。
user9517支持GoFundMonica 2012年

它是特定于环境的。我运行了足够多的这些服务器,并且无法通过正常活动的任何组合来重现该行为。
ewwhite 2012年

@ewwhite:我也有几个,我也找不到。
user9517支持GoFundMonica 2012年

@ewwhite我自己试用了几台CentOS机器,还问了一些维护约300个此类机器的同事。他们都不记得曾经见过这个。
Tonny

3

我检查了12台多用户CentOS和基于RHEL 6.3的应用程序服务器。没有人表现出这种行为。在last4-5周后的输出中没有丢失的条目。

我认为查看您的/etc/hosts文件条目以确保它符合此格式很重要

另外,您正在为DNS解析做什么?你可以发布你的/etc/resolv.conf吗?

0.0.0.0表示本地连接的其他响应正确。典型示例是重新引导和控制台登录事件:

 reboot   system boot  0.0.0.0          Sat Dec  8 06:12 - 05:57 (12+23:45)  
 reboot   system boot  0.0.0.0          Sat Dec  8 05:25 - 06:09  (00:44)    
 reboot   system boot  0.0.0.0          Fri Nov 30 14:28 - 05:22 (7+14:54)   
 root     tty1         0.0.0.0          Fri Nov 30 13:52 - 13:55  (00:03)    
 reboot   system boot  0.0.0.0          Fri Nov 30 13:51 - 14:25  (00:34)    

由于这似乎仅在命名用户中发生,因此是否有任何更改?在他们的登录脚本中有一些源于或运行的时髦东西?您是否已更改~/.bashrc~/.bash_profile默认设置?环境中是否还有其他特殊的登录脚本?

- 编辑 -

我仍然无法以任何方式重现此内容。不过,我看两个关键组成部分。该last命令稳定,并且很长时间没有更改。查看sysvinit-tools的changelog ,没有相关的错误。初始化脚本(wtmp)相同。

如果可以强制执行此操作,请使用同一源计算机上的其他用户帐户尝试。但是我看不到任何迹象表明这是操作系统问题。


关于您对本地环境的问题...请查看我的问题的最新编辑...请记住,除了我之外,没有其他用户遇到此问题...因此,全局配置(例如/etc/hosts)应该会影响每个人...不会只是我
Mike Pennington

了解这种情况发生的时间范围将很有帮助。您的日志片段已有一个月的历史了。这是可复制的吗?这是否发生在所有服务器上?也许如果wtmp文件已被旋转,则可能会有wtmp和wtmp1。您可以last -if针对这两个文件运行,并查看一段时间后是否看到相同的结果?
ewwhite

另外,您是否正在运行命令?(p)sftp(p)scp?我问,因为您的无IP会话发生在较长会话的时间范围内。在您的示例中,您是否从192.0.2.91打开了多个连接?
ewwhite 2012年

好问题...我必须为今天抵达的客人做准备,但我将在本周末努力回答这些细节
Mike Pennington

我有时通过免费的WinSCP客户端使用scp和sftp;但是,这些条目会产生有效的/var/log/secure条目...这些条目显示不0.0.0.0显示任何内容/var/log/secure
Mike Pennington 2012年

3

最终决议

我已经授予了奖金,因此这完全是针对有相同问题的未来Google员工。

之所以只在我的登录量的10%左右显示,是因为当我对路由器或交换机进行重大更改时,我会使用,script foo.log因此我拥有更改的完整终端日志。由于我仍然不明白的原因,CentOS pts在使用script命令时会创建一个条目...我将演示last -i运行前后的输出script...

[mpenning@sasmars net]$ last -i | head
kkim14   pts/13       192.0.2.225   Wed Jan  2 09:43   still logged in
kkim14   pts/12       192.0.2.225   Wed Jan  2 09:43   still logged in
kkim14   pts/10       192.0.2.225   Wed Jan  2 09:43   still logged in
kkim14   pts/9        192.0.2.225   Wed Jan  2 09:43   still logged in
kkim14   pts/5        192.0.2.225   Wed Jan  2 09:43   still logged in
mpenning pts/17       192.0.2.29    Mon Dec 31 16:45 - 16:49  (00:03)
gduarte  pts/16       192.0.2.135   Thu Dec 27 10:54   still logged in
gduarte  pts/14       192.0.2.135   Thu Dec 27 10:44   still logged in
dspencer pts/14       192.0.2.4     Thu Dec 27 09:56 - 09:57  (00:01)
mpenning pts/14       192.0.2.91    Thu Dec 27 08:31 - 08:32  (00:00)
[mpenning@sasmars net]$ script ~/something_random.log
Script started, file is /home/mpenning/something_random.log
[mpenning@sasmars net]$ date
Thu Jan  3 16:14:19 CST 2013 # <--------------------------------------------------
[mpenning@sasmars net]$ exit
exit
Script done, file is /home/mpenning/something_random.log
[mpenning@sasmars net]$ last -i | head
mpenning pts/15       0.0.0.0          Thu Jan  3 16:14 - 16:14  (00:00) # <------
kkim14   pts/13       192.0.2.225   Wed Jan  2 09:43   still logged in
kkim14   pts/12       192.0.2.225   Wed Jan  2 09:43   still logged in
kkim14   pts/10       192.0.2.225   Wed Jan  2 09:43   still logged in
kkim14   pts/9        192.0.2.225   Wed Jan  2 09:43   still logged in
kkim14   pts/5        192.0.2.225   Wed Jan  2 09:43   still logged in
mpenning pts/17       192.0.2.29    Mon Dec 31 16:45 - 16:49  (00:03)
gduarte  pts/16       192.0.2.135   Thu Dec 27 10:54   still logged in
gduarte  pts/14       192.0.2.135   Thu Dec 27 10:44   still logged in
dspencer pts/14       192.0.2.4     Thu Dec 27 09:56 - 09:57  (00:01)
[mpenning@sasmars net]$ cat /etc/redhat-release
CentOS release 6.3 (Final)
[mpenning@sasmars net]$

这种行为似乎是CentOS 6所独有的……我们实验室中有一些CentOS 4.7机器没有在其中添加空白条目wtmp……Debian / Gentoo机器也没有表现出这种行为。我们的Linux管理员正在努力思考为什么CentOS pts在执行时会故意添加另一个条目script。我怀疑这是一个RHEL错误。

编辑:我将此问题作为RHEL错误ID 892134提出

注意

有些人错误地认为我放进script我的~/.bashrc~/.bash_profile。这是一个有缺陷的论点...如果是真的,我的每一次ssh登录后都wtmp应该有一个0.0.0.0条目...

[mpenning@sasmars net]$ last -i | head
kkim14   pts/13       192.0.2.225   Wed Jan  2 09:43   still logged in
kkim14   pts/12       192.0.2.225   Wed Jan  2 09:43   still logged in
kkim14   pts/10       192.0.2.225   Wed Jan  2 09:43   still logged in
kkim14   pts/9        192.0.2.225   Wed Jan  2 09:43   still logged in
kkim14   pts/5        192.0.2.225   Wed Jan  2 09:43   still logged in
mpenning pts/18       0.0.0.0       Mon Dec 31 16:45 - 16:49  (00:03)  # <-----
mpenning pts/17       192.0.2.29    Mon Dec 31 16:45 - 16:49  (00:03)  # <-----
gduarte  pts/16       192.0.2.135   Thu Dec 27 10:54   still logged in
gduarte  pts/14       192.0.2.135   Thu Dec 27 10:44   still logged in
dspencer pts/14       192.0.2.4     Thu Dec 27 09:56 - 09:57  (00:01)
mpenning pts/15       0.0.0.0       Thu Dec 27 08:31 - 08:32  (00:00)  # <-----
mpenning pts/14       192.0.2.91    Thu Dec 27 08:31 - 08:32  (00:00)  # <-----

当然不是这样的...


3
您没有script在最初的问题中提到使用命令。
ewwhite

2
我问您是否更改了默认的〜/ .bashrc或〜/ .bash_profile?环境中是否还有其他特殊的登录脚本?。该script程序将对您终端上打印的所有内容进行打字。这是一个相关的细节。
ewwhite

2
@ewwhite是时候该停止攻击了,开始进行批判性思考了……1)您假设脚本在我的.bashrc或中.bash_profile,而不是在其中;我script foo.log在进行重大更改时执行我的更改,所以我可以拥有一个更改日志...也就是说,这就是为什么它仅影响约10%的登录信息2)如果您的指控是正确的(但事实并非如此),我将永远不会使用ssh登录信息0.0.0.0在它之后没有其他条目3)script仅在CentOS中使用过...我已经使用了十多年了,并且从未在其他发行版中看到过这种行为...在这一点上,我认为它很可能是CentOS错误
Mike Pennington

1
非常感谢您的更新。我在Ubuntu 12.04上进行了测试,script只会产生一个外壳。根据您在此处显示的内容,CentOS / Redhat版本script实际上首先要分摊。尽管有点失望(:P),它不是更通用/跨发行版的东西,但至少我不解这个谜。PS:我很惊讶您正在生产Gentoo @。@
John Siu 2013年

1
@MikePennington:Fedora BTW中也有它,Michael Hampton为我检查。
user9517支持GoFundMonica 2013年

2

伪终端从站(pts)连接是SSH或telnet连接,这意味着与系统的间接连接。所有这些连接都可以连接到外壳,该外壳将允许您向计算机发出命令。因此,当您从gui打开系统上的终端时,它会打开源ip 0.0.0.0的pts。从您提供的信息来看,这似乎是由于在此服务器上运行或调度的脚本而发生的,该脚本正在使用ssh或telnet服务或本地pt将输出扔到终端中。


我从不使用GUI
Mike Pennington

2

您使用哪个ssh客户端?一些ssh客户端可以通过一个连接多路复用多个终端,我注意到您所有没有IP的会话都属于具有已记录IP的较长会话。

我不能在这里用ssh复制这种行为。


我通常使用superputty,当前版本为1.4.0.1 ...但是我也看到了普通油灰的问题
Mike Pennington 2012年

1

也许您的IP地址在其中一台DNS服务器上解析为空白字符串,如果仅在10%的时间出现,则可能是辅助字符串(如果从中央存储库分发,则可能是主机文件)。这将说明缺少(或空白)条目的原因,并且与Soham对源的阅读相一致。


0

“ 0.0.0.0”表示是本地用户(不是远程登录名),可能由应用程序(例如cronjob)调用。


这个答案看起来不对 ...我的日志中所有0.0.0.0条目都位于pts行上
Mike Pennington

这是一个正确的答案,例如在我的系统中:# last -i |grep 0.0.0.0 \ reboot system boot 0.0.0.0 Wed Dec 5 20:09 - 17:18 (15+21:08) # last |grep reboot \ reboot system boot 2.6.32-10-pve Wed Dec 5 20:09 - 17:18 (15+21:08)
alterpub

@alterpub,再次,我只使用ssh登录;除非有人可以向我显示正式文档,否则0.0.0.0不是有效的ssh pty条目。
Mike Pennington


-1

我通过在〜/ .bashrc中添加脚本解决了该问题,该脚本找到了最后一个telnet连接源IP地址,然后您可以将IP添加到日志文件中或执行所需的任何操作。

client_ip=$(echo $(netstat -nae | grep $(netstat -nae | grep 23 | awk  '{print $8}' | sort -n | tail -n1) | awk '{print $5}') | awk -F':' '{print $1}' )

echo "client_ip=$client_ip"

沙龙


1
这个答案对我来说没有多大意义。讨论不是关于telnet。netstat -nae | grep 23这不是查找telnet连接的有用方法。此命令在我的系统上给出92个结果,但都不是telnet。
Hauke Laging
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.