AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / ubuntu / Perguntas / 1510466
Accepted
Manuel Jordan
Manuel Jordan
Asked: 2024-04-15 07:46:26 +0800 CST2024-04-15 07:46:26 +0800 CST 2024-04-15 07:46:26 +0800 CST

Por que a coluna GECOS em /etc/passwd representa 4 campos vazios e não 5 de acordo com o comando adduser?

  • 772

Apenas por curiosidade sobre a seguinte situação

Quando o addusercomando é executado da seguinte forma:

sudo adduser optimusprime
Adding user `optimusprime' ...
Adding new group `optimusprime' (1015) ...
Adding new user `optimusprime' (1013) with group `optimusprime' ...
Creating home directory `/home/optimusprime' ...
Copying files from `/etc/skel' ...
New password: 
Retype new password: 
passwd: password updated successfully
Changing the user information for optimusprime
Enter the new value, or press ENTER for the default
    Full Name []: 
    Room Number []: 
    Work Phone []: 
    Home Phone []: 
    Other []: 
Is the information correct? [Y/n]

Observe que existem 5 campos opcionais disponíveis para gravar dados. Se eles forem deixados vazios como padrão quando o cat /etc/passwdcomando for executado, o registro desse usuário aparecerá da seguinte forma:

optimusprime:x:1013:1015:,,,:/home/optimusprime:/bin/bash

Observe a ,,,parte GECOS. Representa 4 campos como A,B,C,De não 5 como A,B,C,D,E. Por que essa diferença ou incompatibilidade entre eles? Para ser honesto, eu esperava

optimusprime:x:1013:1015:,,,,:/home/optimusprime:/bin/bash

O que representa também os 5 campos disponíveis através do addusercomando.

E se for usado o usermodcomando da seguinte forma:

sudo usermod -c "A,B,C,D,E" optimusprime

O usuário aparece como:

optimusprime:x:1013:1015:A,B,C,D,E:/home/optimusprime:/bin/bash

Eu sei que é possível até adicionar mais campos através do usermodcomando da seguinte forma:

sudo usermod -c "A,B,C,D,E,F" optimusprime
sudo usermod -c "A,B,C,D,E,F,G" optimusprime

Portanto, as execuções desses comandos são refletidas da seguinte forma, respectivamente

optimusprime:x:1013:1015:A,B,C,D,E,F:/home/optimusprime:/bin/bash
optimusprime:x:1013:1015:A,B,C,D,E,F,G:/home/optimusprime:/bin/bash

À primeira vista não está claro se o GECOS se baseia no mínimo em 4 ou 5 campos.

users
  • 1 1 respostas
  • 28 Views

1 respostas

  • Voted
  1. Best Answer
    steeldriver
    2024-04-16T00:20:29+08:002024-04-16T00:20:29+08:00

    A página de manual do arquivo /etc/passwd, man 5 passwd, é particularmente concisa a esse respeito:

    O campo de comentários é usado por vários utilitários do sistema, como o finger(1).

    POSIX também não ajuda em nada - na verdade, o padrão POSIX para a estrutura de senha, pwd.h , não exige nenhum GECOS ou campo de comentário:

    O cabeçalho <pwd.h> deve definir a struct passwd, estrutura, que deve incluir pelo menos os seguintes membros:

    char    *pw_name   User's login name. 
    uid_t    pw_uid    Numerical user ID. 
    gid_t    pw_gid    Numerical group ID. 
    char    *pw_dir    Initial working directory. 
    char    *pw_shell  Program to use as shell.
    

    Se olharmos para a implementação da glibc, ou seja, /usr/include/pwd.hconforme fornecida pelo libc-devpacote, vemos que seu pw_gecosmembro é uma string C simples (ou ponteiro para char ):

    /* A record in the user database.  */
    struct passwd
    {
      char *pw_name;                /* Username.  */
      char *pw_passwd;              /* Hashed passphrase, if shadow database
                                       not in use (see shadow.h).  */
      __uid_t pw_uid;               /* User ID.  */
      __gid_t pw_gid;               /* Group ID.  */
      char *pw_gecos;               /* Real name.  */
      char *pw_dir;                 /* Home directory.  */
      char *pw_shell;               /* Shell program.  */
    };
    

    portanto, qualquer aplicativo que obtenha informações do banco de dados de senhas usando a família de funções glibc getpwentobterá o resultado como uma única string - depende essencialmente do aplicativo como ele escolhe analisá-lo. Em particular, a implementação BSD do fingercomando - que é o que você obtém se instalar a partir do repositório do universofinger Ubuntu - tokeniza a string usando strsep mas atribui apenas no máximo quatro subcampos separados por vírgula:

    /*
     * fields[0] -> real name
     * fields[1] -> office
     * fields[2] -> officephone
     * fields[3] -> homephone
     */
    nfields = 0;
    while ((p = strsep(&bp, ","))) {
            if (nfields < 4) fields[nfields++] = *p ? p : NULL;
    }
    while (nfields<4) fields[nfields++] = NULL;
    

    No Ubuntu, /usr/sbin/adduseré um script perl que usa o arquivo chfn. Se você olhar para a fonte chfn(do conjunto shadow passwd), ele tokeniza os primeiros quatro subcampos de forma semelhante e depois atribui o restante como " slop":

        /*
         * Anything left over is "slop".
         */
        if ((NULL != cp) && !oflg) {
                if ('\0' != slop[0]) {
                        strcat (slop, ",");
                }
    
                strcat (slop, cp);
        }
    

    Então eu acho que a conclusão é

    • não existe um padrão para o campo GECOS

    • os primeiros 4 subcampos têm interpretações convencionais baseadas no fingercomando histórico

    • qualquer coisa depois disso é opcional e está sujeita a interpretação dependente da aplicação.

    • 2

relate perguntas

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Existe um comando para listar todos os usuários? Também para adicionar, excluir, modificar usuários, no terminal?

    • 9 respostas
  • Marko Smith

    Como excluir um diretório não vazio no Terminal?

    • 4 respostas
  • Marko Smith

    Como descompactar um arquivo zip do Terminal?

    • 9 respostas
  • Marko Smith

    Como instalo um arquivo .deb por meio da linha de comando?

    • 11 respostas
  • Marko Smith

    Como instalo um arquivo .tar.gz (ou .tar.bz2)?

    • 14 respostas
  • Marko Smith

    Como listar todos os pacotes instalados

    • 24 respostas
  • Martin Hope
    Flimm Como posso usar o docker sem sudo? 2014-06-07 00:17:43 +0800 CST
  • Martin Hope
    led-Zepp Como faço para salvar a saída do terminal em um arquivo? 2014-02-15 11:49:07 +0800 CST
  • Martin Hope
    ubuntu-nerd Como descompactar um arquivo zip do Terminal? 2011-12-11 20:37:54 +0800 CST
  • Martin Hope
    TheXed Como instalo um arquivo .deb por meio da linha de comando? 2011-05-07 09:40:28 +0800 CST
  • Martin Hope
    Ivan Como listar todos os pacotes instalados 2010-12-17 18:08:49 +0800 CST
  • Martin Hope
    David Barry Como determino o tamanho total de um diretório (pasta) na linha de comando? 2010-08-06 10:20:23 +0800 CST
  • Martin Hope
    jfoucher "Os seguintes pacotes foram retidos:" Por que e como resolvo isso? 2010-08-01 13:59:22 +0800 CST
  • Martin Hope
    David Ashford Como os PPAs podem ser removidos? 2010-07-30 01:09:42 +0800 CST

Hot tag

10.10 10.04 gnome networking server command-line package-management software-recommendation sound xorg

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve