AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 469810
Accepted
blueFast
blueFast
Asked: 2013-01-17 14:24:59 +0800 CST2013-01-17 14:24:59 +0800 CST 2013-01-17 14:24:59 +0800 CST

请参阅 agetty 解析的 /etc/issue

  • 772

如果我理解正确的话,/etc/issue将由agetty显示在控制台中

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

这可能吗?如何?

linux
  • 3 3 个回答
  • 871 Views

3 个回答

  • Voted
  1. Best Answer
    user9517
    2013-03-20T14:26:59+08:002013-03-20T14:26:59+08:00

    我不认为有一个实用程序可以做你想做的事。查看agetty 源代码,函数 do_prompt(...) 基本上打开 /etc/issue 文件并逐个字符地读取它,然后显示读取的字符,或者如果它是一个\,则读取下一个字符,然后输入一个 switch 语句以显示相关信息。将其转换为脚本并不难......无论如何这是相关代码

    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
  2. simonmysun
    2022-04-25T16:11:53+08:002022-04-25T16:11:53+08:00

    你可以试试

    agetty -8n - linux
    
    • -8禁用奇偶校验检测,假设 tty 是 8 位干净的
    • -n抑制登录提示

    欲了解更多详情,man agetty。

    • 0
  3. Adam Katz
    2022-07-28T13:41:26+08:002022-07-28T13:41:26+08:00

    在util-linux#828中请求了此特定功能。
    util-linux 2.35(2020-01-21 发布)为此引入了一个标志:

    $ agetty --show-issue
    Debian GNU/Linux bookworm/sid tabasco tty0
    
    $
    

    如果你使用的是旧版本的 util-linux,你可以这样做:

    $ agetty -N8nl /bin/true -f <(sed "s@\\l@$(tty |sed 's:^/dev/::')@g" /etc/issue) -
    

    这抑制了登录,尽管agetty看到用户名-,所以我们拦截issue文件并替换\l为当前 TTY(它来自tty我们删除前导后的命令/dev/),因此它不会显示为-。-N抑制前导换行符,-8禁用 tty 奇偶校验检测,-n抑制登录(但不抑制登录命令的错误),并-l /bin/true设置一个虚拟可执行文件代替/bin/login.

    • 0

相关问题

  • Linux 主机到主机迁移

  • 如何在 Linux 机器上找到有关硬件的详细信息?

  • 如何在 Linux 下监控每个进程的网络 I/O 使用情况?

  • 在 RHEL4 上修改 CUPS 中的现有打印机设置

  • 为本地网络中的名称解析添加自定义 dns 条目

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve