Ubuntu服务器 – 使`lastlog`显示主机名而不是IP地址

当通过SSHlogin到Ubuntu服务器时,显示以下行: Last login: Mon Jul 18 20:00:00 2016 from 111.111.111.111

在其他服务上, me.domain.com由主机名me.domain.comreplace,因为我的rDNS设置正确。

我如何configuration这个Ubuntu 16.04 LTS服务器来做同样的事情?

PAM由于/etc/pam.d/login的以下configuration行而生成该行文本

 # Prints the last login info upon succesful login # (Replaces the `LASTLOG_ENAB' option from login.defs) session optional pam_lastlog.so 

有一些configuration选项可以传递给这个pam模块,但是我没有看到解决主机名的问题。 / var / log / lastlog是存储信息的地方,这个文件存储IP地址,而不是主机名。 从安全angular度来看,这是有道理的。 我也检查了一些源代码…我无法find解决IP地址的任何问题(至less不是在pam_lastlog.c中)。 也许它隐藏在其他地方,我错过了它。

这个Perl脚本将使用lastlog来打印当前用户的最后login信息,并将IPv4地址parsing为主机名

你可以把它添加到你的/etc/profile或者/etc/bash.bashrc或者在/etc/update-motd.d/下等等来获得同样的效果。 它没有完全格式化,所以你可能需要摆弄它,让它看起来像你想要的。

 #!的/ usr / bin中/ perl的

使用警告;
使用Socket;

打开(我的$ lastLogOut,“lastlog -u $ ENV {LOGNAME} |”);

 while(my $ entry =){
        格格($input);
        我的$ ipAddress;
        我的$主机名;

         if($ entry =〜/(\d+\.\d+\.\d+\.\d+)/){
                 $ ipAddress = $&;
                 if($ hostname = gethostbyaddr(inet_aton($ ipAddress),AF_INET)){ 
                         $ entry =〜s / $ ipAddress / $ hostname / g;
                 }
         }

        打印$条目。“\ n”;

 }

示例输出

 $ perl lastlog.dns Username Port From Latest ryan pts/5 localhost Mon Jul 18 22:26:28 -0400 2016 

如果你想在login时使用上面的脚本 ,你可能想停止PAM打印出最后的login信息。 向/etc/pam.d/login的pam_lastlog行添加silent

 session optional pam_lastlog.so silent 

打开你的sshd_config文件并确保这一点

 UseDNS yes 

之后,重新启动您的SSH服务器。 我在Centos 7中尝试这个,IP成为主机名。