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

  •   2009-07-28/15:33
  • 从 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 等等
       关键字来搜寻修改。


    评论 {{userinfo.comments}}

    {{money}}

    {{question.question}}

    A {{question.A}}
    B {{question.B}}
    C {{question.C}}
    D {{question.D}}
    提交

    驱动号 更多