打 last 显示 IP 而不是 hostname,Why ?

王朝other·作者佚名  2006-11-23
宽屏版  字体: |||超大  

从 FreeBSD-2.2/3.0 起,如果登入的 FQDN 长度 > 16 个字元 (UT_HOSTSIZE)

则系统会以 IP 纪录,因此你打 last 就会看到一堆 IP 而不是"不完整"的

hostname,有些系统如 bbs 也会受影响。当然,这个 feature 有些人不喜欢

,毕竟人还是看 FQDN 比较习惯,因此你可以自己拿掉这个 feature。

1. 修改 telnetd 的程式码

telnetd 的程式码放在 /usr/src/libexec/telnetd/ 或是 ftp://freebsd

.csie.nctu.edu.tw/pub/FreeBSD-current/src/libexec/telnetd/,

取回来後,你可以先修改 8bit 的支援,再来拿掉判断 UT_HOSTSIZE

的地方。修改 telnetd.c 把以下这段 (搜寻 hp->h_name)

>> } else if (hp &&

>> (strlen(hp->h_name) <= ((utmp_len < 0) ? -utmp_len : utmp_len))) {

host = hp->h_name;

} else {

host = inet_ntoa(who->sin_addr);

}

改成

>> } else if (hp) {

host = hp->h_name;

} else {

host = inet_ntoa(who->sin_addr);

}

2. 修改 login 的程式码

login 的程式码放在 /usr/src/usr.bin/login/ 或是 ftp://freebsd

.csie.nctu.edu.tw/pub/FreeBSD-current/src/usr.bin/login/,

取回来後,修改 login.c 把以下这段 (搜寻 UT_HOSTSIZE) 完全删除。

>> if (strlen(optarg) > UT_HOSTSIZE) {

>> struct hostent *hp = gethostbyname(optarg);

>>

>> if (hp != NULL) {

>> struct in_addr in;

>>

>> memmove(&in, hp->h_addr, sizeof(in));

>> optarg = strdup(inet_ntoa(in));

>> } else

>> optarg = "invalid hostname";

>> }

3. 其他的程式

还有其他的程式会做写入 utmp 或 wtmp 的动作,你必须自行修改,

你可以从 logwtmp(), UT_HOSTSIZE, hp->h_name, utmp, wtmp 等等

关键字来搜寻修改。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
© 2005- 王朝网络 版权所有