首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >见/etc/ agetty所分析的问题

见/etc/ agetty所分析的问题
EN

Server Fault用户
提问于 2013-01-16 22:24:59
回答 2查看 1K关注 0票数 1

如果我正确理解,/etc/issue将由阿吉蒂显示在控制台中。

我希望看到由/etc/issue解析的agetty,但我不想启动任何登录会话或任何相关的内容。我只想要一个带有解析命令的/etc/issue文本转储。

这个是可能的吗?多么?

EN

回答 2

Server Fault用户

回答已采纳

发布于 2013-03-19 22:26:59

我不认为有什么实用工具能做你想做的事。查看agetty源代码,函数do_prompt(.)基本上,打开/etc/发文件并逐字符读取它,或者显示字符读,或者如果它是\,则读取下一个字符,然后输入一个开关语句来显示相关信息。把它转换成剧本并不难.总之,这是相关的代码

代码语言:javascript
复制
void
do_prompt(op, tp)
     struct options *op;
     struct termios *tp;
{
#ifdef  ISSUE
    FILE    *fd;
    int     oflag;
    int     c;
    struct utsname uts;

    (void) uname(&uts);
#endif

    (void) write(1, "\r\n", 2);         /* start a new line */
#ifdef  ISSUE                   /* optional: show /etc/issue */
    if ((op->flags & F_ISSUE) && (fd = fopen(op->issue, "r"))) {
    oflag = tp->c_oflag;            /* save current setting */
    tp->c_oflag |= (ONLCR | OPOST);     /* map NL in output to CR-NL */
    (void) tcsetattr(0, TCSADRAIN, tp);


    while ((c = getc(fd)) != EOF)
    {
        if (c == '\\')
          {
        c = getc(fd);

        switch (c)
          {
          case 's':
            (void) printf ("%s", uts.sysname);
            break;

          case 'n':
            (void) printf ("%s", uts.nodename);
            break;

          case 'r':
            (void) printf ("%s", uts.release);
            break;

          case 'v':
            (void) printf ("%s", uts.version);
            break;

          case 'm':
            (void) printf ("%s", uts.machine);
            break;

          case 'o':
           {
             char domainname[MAXHOSTNAMELEN+1];
#ifdef HAVE_GETDOMAINNAME
             if (getdomainname(domainname, sizeof(domainname)))
#endif
             strcpy(domainname, "unknown_domain");
             domainname[sizeof(domainname)-1] = '\0';
             printf ("%s", domainname);
           }
          break;

          case 'O':
           {
            char *dom = "unknown_domain";
            char host[MAXHOSTNAMELEN+1];
            struct addrinfo hints, *info = NULL;

            memset(&hints, 0, sizeof(hints));
            hints.ai_flags = AI_CANONNAME;

            if (gethostname(host, sizeof(host)) ||
                getaddrinfo(host, NULL, &hints, &info) ||
                info == NULL)
                fputs(dom, stdout);
            else {
                char *canon;

                if (info->ai_canonname &&
                    (canon = strchr(info->ai_canonname, '.')))
                    dom = canon + 1;
                fputs(dom, stdout);
                freeaddrinfo(info);
            }
           }
          break;

          case 'd':
          case 't':
            {
              /* TODO: use nl_langinfo() */
              char *weekday[] = { "Sun", "Mon", "Tue", "Wed", "Thu",
                      "Fri", "Sat" };
              char *month[] = { "Jan", "Feb", "Mar", "Apr", "May",
                    "Jun", "Jul", "Aug", "Sep", "Oct",
                    "Nov", "Dec" };
              time_t now;
              struct tm *tm;

              (void) time (&now);
              tm = localtime(&now);

              if (c == 'd')
            (void) printf ("%s %s %d  %d",
                weekday[tm->tm_wday], month[tm->tm_mon],
                tm->tm_mday, 
                tm->tm_year < 70 ? tm->tm_year + 2000 :
                tm->tm_year + 1900);
              else
            (void) printf ("%02d:%02d:%02d",
                tm->tm_hour, tm->tm_min, tm->tm_sec);

              break;
            }

          case 'l':
              (void) printf ("%s", op->tty);
              break;

          case 'b':
            {
            int i;

            for (i = 0; speedtab[i].speed; i++) {
                if (speedtab[i].code == cfgetispeed(tp)) {
                printf("%ld", speedtab[i].speed);
                break;
                }
            }
            break;
            }
          case 'u':
          case 'U':
            {
              int users = 0;
              struct utmp *ut;
              setutent();
              while ((ut = getutent()))
                if (ut->ut_type == USER_PROCESS)
              users++;
              endutent();
              printf ("%d ", users);
              if (c == 'U')
                printf ((users == 1) ? _("user") : _("users"));
              break;
            }
          default:
            (void) putchar(c);
          }
          }
        else
          (void) putchar(c);
    }
    fflush(stdout);

    tp->c_oflag = oflag;            /* restore settings */
    (void) tcsetattr(0, TCSADRAIN, tp); /* wait till output is gone */
    (void) fclose(fd);
    }
#endif
    {
    char hn[MAXHOSTNAMELEN+1];
    if (gethostname(hn, sizeof(hn)) == 0)
        write(1, hn, strlen(hn));
    }
    (void) write(1, LOGIN, sizeof(LOGIN) - 1);  /* always show login prompt */
}
票数 2
EN

Server Fault用户

发布于 2022-04-25 00:11:53

你可以试试

代码语言:javascript
复制
agetty -8n - linux
  • 假设tty为8位清洁,-8将禁用奇偶检测。
  • -n取消登录提示。

欲了解更多细节,请访问man agetty

票数 0
EN
页面原文内容由Server Fault提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://serverfault.com/questions/469810

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档