15%

Poupe 15% em todos os serviços

Teste as suas habilidades e obtenha Desconto em qualquer plano

Utilizar o código:

Skills
Começar a trabalhar
09.10.2024

useradd vs adduser: Diferenças Técnicas, Casos de Uso e Quando Usar Cada Um

`useradd` é um utilitário binário de baixo nível disponível em praticamente todas as distribuições Linux que cria contas de utilizador escrevendo diretamente em `/etc/passwd`, `/etc/shadow` e `/etc/group`. `adduser` é um script wrapper de nível superior — tipicamente escrito em Perl em sistemas baseados em Debian — que chama `useradd` internamente enquanto automatiza a criação do diretório home, o preenchimento de ficheiros skeleton, a solicitação de palavra-passe e a recolha de campos GECOS. A diferença prática não é apenas ergonómica: escolher a ferramenta errada num pipeline de provisionamento automatizado ou num sistema não-Debian pode produzir silenciosamente contas de utilizador incompletas.

Ambos os comandos registam em última análise um utilizador na base de dados de autenticação do sistema, mas o seu comportamento diverge significativamente em termos de predefinições, interatividade, portabilidade e capacidade de scripting. Este guia abrange todas as distinções técnicas que um administrador precisa para tomar uma decisão informada.

O Que o useradd Realmente Faz Internamente

`useradd` faz parte do pacote shadow-utils (por vezes chamado `passwd` em distribuições mais antigas). Quando invocado, executa uma série de operações atómicas:

  1. Lê `/etc/login.defs` para determinar intervalos de UID predefinidos, políticas de envelhecimento de palavras-passe e se deve criar um diretório home por predefinição.
  2. Lê `/etc/default/useradd` para o shell predefinido, caminho do diretório skeleton e comportamento de grupo.
  3. Escreve uma nova entrada em `/etc/passwd` e `/etc/shadow`.
  4. Opcionalmente cria um diretório home e copia ficheiros de `/etc/skel` se `-m` for explicitamente passado.
  5. Opcionalmente cria um grupo privado correspondente ao nome de utilizador se `USERGROUPS_ENAB` estiver definido como `yes` em `/etc/login.defs`.

Um ponto crítico que muitos guias omitem: nas distribuições baseadas em Red Hat (RHEL, CentOS, Rocky Linux, AlmaLinux), `useradd` cria o diretório home por predefinição porque `/etc/login.defs` define `CREATE_HOME yes`. No Debian e Ubuntu, não o faz — o sinalizador `-m` é obrigatório a menos que modifique `/etc/default/useradd`. Esta assimetria de comportamento é uma fonte frequente de confusão quando os administradores migram entre famílias de distribuições.

Sinalizadores Principais e o Seu Comportamento

SinalizadorPropósitoNotas
———————-
`-m`Criar diretório homeObrigatório no Debian/Ubuntu sem alteração de configuração
`-d /path`Definir caminho personalizado do diretório homeNão cria o diretório a menos que `-m` seja também utilizado
`-s /bin/bash`Definir shell de loginPredefinição para `/bin/sh` ou valor em `/etc/default/useradd`
`-u UID`Atribuir UID específicoDeve ser único; use `-o` para permitir duplicados
`-g GID`Definir grupo primárioO grupo já deve existir
`-G group1,group2`Adicionar grupos suplementaresSeparados por vírgula, sem espaços
`-e YYYY-MM-DD`Data de expiração da contaEscrito no campo 8 de `/etc/shadow`
`-f days`Período de inatividade da palavra-passeDias após expiração antes de a conta ser bloqueada
`-r`Criar conta de sistemaUID abaixo de `SYS_UID_MAX` em `/etc/login.defs`, sem diretório home por predefinição
`-M`Explicitamente não criar diretório homeSubstitui as predefinições da distribuição
`-N`Não criar um grupo privado de utilizadorO grupo primário do utilizador torna-se o grupo predefinido
`-k /path`Especificar diretório skeleton alternativoSubstitui `/etc/skel`

Exemplo Prático de useradd com Opções Completas

“`bash

useradd

-m

-d /srv/appuser

-s /bin/bash

-u 1500

-g developers

-G sudo,docker

-e 2025-12-31

-c "Application Service Account"

appuser

passwd appuser

“`

Nenhuma palavra-passe é definida até que `passwd` seja chamado. Até então, a conta existe mas está bloqueada — a entrada shadow contém `!` como hash da palavra-passe, impedindo o login via autenticação por palavra-passe. O login baseado em chave SSH, no entanto, não é afetado por este estado.

O Que o adduser Realmente Faz Internamente

No Debian e Ubuntu, `adduser` é um script Perl localizado em `/usr/sbin/adduser`. Lê a sua própria configuração de `/etc/adduser.conf` — um ficheiro separado de `/etc/login.defs` — e depois chama `useradd` com os sinalizadores apropriados com base nessa configuração mais a entrada do utilizador.

O script executa passos adicionais que `useradd` sozinho não faz:

  • Solicita interativamente uma palavra-passe e confirma-a com uma segunda entrada.
  • Recolhe campos GECOS (nome completo, número de sala, telefone do trabalho, telefone de casa, outros) através de prompts guiados.
  • Copia ficheiros skeleton de `/etc/skel` automaticamente sem requerer `-m`.
  • Define a propriedade e permissões corretas no diretório home.
  • Opcionalmente adiciona o utilizador a grupos suplementares definidos em `/etc/adduser.conf`.

Em sistemas baseados em Red Hat, `adduser` é tipicamente um symlink para `useradd`, o que significa que se comporta de forma idêntica ao binário de baixo nível — não existe wrapper interativo. Este é o problema de portabilidade mais importante ao escrever scripts para múltiplas distribuições.

Ficheiro de Configuração do adduser: /etc/adduser.conf

Diretivas principais em `/etc/adduser.conf` que afetam o comportamento:

“`

DSHELL=/bin/bash # Default shell

DHOME=/home # Parent directory for home directories

GROUPHOMES=no # Whether to create group-named subdirectories

LETTERHOMES=no # Whether to use first-letter subdirectories

USERGROUPS=yes # Create a group with the same name as the user

USERS_GID=100 # Default GID if USERGROUPS=no

DIR_MODE=0755 # Permissions on new home directories

SETGID_HOME=no

QUOTAUSER=""

SKEL=/etc/skel

SKEL_IGNORE_REGEX="dpkg-(old|new|dist|tmp)"

“`

Modificar este ficheiro permite-lhe padronizar a criação de utilizadores numa frota de servidores Debian/Ubuntu sem passar sinalizadores de cada vez.

Exemplo Prático de adduser

“`bash

adduser customuser

“`

A sessão interativa tem este aspeto:

“`

Adding user 'customuser' …

Adding new group 'customuser' (1001) …

Adding new user 'customuser' (1001) with group 'customuser' …

Creating home directory '/home/customuser' …

Copying files from '/etc/skel' …

New password:

Retype new password:

passwd: password updated successfully

Changing the user information for customuser

Enter the new value, or press ENTER for the default

Full Name []: Jane Smith

Room Number []:

Work Phone []:

Home Phone []:

Other []:

Is the information correct? [Y/n] Y

“`

Para adicionar um utilizador existente a um grupo de forma não interativa com `adduser`:

“`bash

adduser customuser sudo

“`

Esta é uma funcionalidade notável: `adduser` funciona também como ferramenta de gestão de membros de grupos, o que `useradd` não replica num único comando.

Comparação Lado a Lado

Funcionalidade`useradd``adduser`
TipoBinário (programa C)Script (Perl no Debian, symlink no RHEL)
InteratividadeNão interativo; todas as opções via sinalizadoresPrompts interativos por predefinição
Diretório homeNão criado a menos que `-m` seja passado (Debian)Criado automaticamente
Configuração de palavra-passeRequer comando `passwd` separadoSolicitado durante a criação
Campos GECOSDefinidos via sinalizador `-c` como uma única stringRecolhidos campo a campo interativamente
Ficheiros skeletonCopiados apenas com o sinalizador `-m`Sempre copiados
Ficheiro de configuração`/etc/login.defs`, `/etc/default/useradd``/etc/adduser.conf`
Disponibilidade entre distribuiçõesTodas as distribuições LinuxApenas Debian/Ubuntu (como script wrapper)
Adequação para scriptingExcelente — totalmente não interativoFraca — requer sinalizadores `–disabled-password` e `–gecos` para evitar prompts
Contas de sistemaSuportado via sinalizador `-r`Suportado via sinalizador `–system`
Gestão de gruposApenas no momento da criaçãoPode adicionar utilizador a grupo existente após criação
GranularidadeControlo total sobre cada parâmetroPredefinições opinativas, menos granular

Quando Usar o useradd

Automação e Infraestrutura-como-Código

`useradd` é a escolha correta em qualquer contexto não interativo: playbooks Ansible, provisioners Terraform, instruções `RUN` do Docker, scripts cloud-init e pipelines CI/CD. Produz resultados determinísticos sem dependência de stdin.

“`bash

Ansible task equivalent

useradd -m -s /bin/bash -G sudo -c "Deploy User" deployuser

echo "deployuser:$(openssl passwd -6 'securepassword')" | chpasswd

“`

Portabilidade Entre Distribuições

Qualquer script shell destinado a correr tanto em sistemas baseados em Debian como em RHEL deve usar `useradd`. Depender do comportamento de `adduser` produzirá falhas silenciosas ou comportamento inesperado no CentOS, Fedora, Rocky Linux ou Alpine Linux.

Contas de Sistema e de Serviço

Criar contas de serviço bloqueadas e sem shell de login para daemons é uma especialidade do `useradd`:

“`bash

useradd -r -s /usr/sbin/nologin -d /var/lib/myservice -m myservice

“`

O sinalizador `-r` atribui um UID abaixo do limiar de contas de sistema, sinaliza aos administradores que esta não é uma conta de utilizador humano, e é o padrão standard para implementação de aplicações em ambientes de VPS Hosting onde o isolamento de serviços é crítico.

Controlo Preciso de UID/GID

Em ambientes NFS, orquestração de contentores ou ao sincronizar bases de dados de utilizadores entre múltiplos servidores, UIDs e GIDs consistentes são obrigatórios. `useradd -u 1500 -g 1500` garante isso; `adduser` não oferece o mesmo controlo determinístico sem configuração significativa.

Quando Usar o adduser

Configuração Interativa de Servidor

Ao provisionar manualmente um novo Servidor Dedicado e adicionar as primeiras contas de utilizadores humanos, `adduser` reduz o risco de configuração incompleta. Os prompts guiados tornam quase impossível esquecer o passo da palavra-passe.

Ambientes Debian/Ubuntu com Predefinições Standard

Se toda a sua infraestrutura corre Debian ou Ubuntu e está a criar utilizadores standard com diretório home, `adduser` produz resultados corretos mais rapidamente com menos sinalizadores para memorizar.

Gestão de Grupos Após Criação

A sintaxe `adduser username groupname` para adicionar um utilizador existente a um grupo existente é mais limpa do que `usermod -aG groupname username`, embora ambas sejam válidas.

Integração de Administradores Júnior

A natureza interativa do `adduser` torna-o uma melhor ferramenta de ensino. Apresenta os campos que importam (palavra-passe, nome completo) e oculta a complexidade dos intervalos de UID e diretórios skeleton até o administrador estar pronto para os aprender.

Casos Extremos Críticos e Armadilhas

A Armadilha do Diretório Home em Falta

No Debian/Ubuntu, executar `useradd username` sem `-m` cria o utilizador mas não o diretório home. O utilizador pode fazer login (uma vez definida uma palavra-passe), mas `$HOME` não existirá, causando falhas em qualquer aplicação que escreva no diretório home no primeiro login — incluindo `.bash_history`, `.ssh/authorized_keys` e muitos diretórios de configuração de aplicações.

“`bash

Verify home directory existence after creation

ls -la /home/newuser || echo "Home directory missing — run: mkhomedir_helper newuser"

“`

Bloqueio do Ficheiro Shadow

Ambos os comandos bloqueiam `/etc/shadow` durante as escritas. Em scripts de provisionamento de alta concorrência que criam dezenas de utilizadores simultaneamente, isto causa condições de corrida. Use uma fila ou execução sequencial ao criar utilizadores em massa.

Colisão de UID em Ambientes Contentorizados

Ao implementar aplicações em VPS com cPanel ou outros ambientes de painel de controlo, o próprio painel gere a alocação de UID. Executar `useradd` manualmente com um UID codificado pode colidir com UIDs atribuídos pelo painel, causando erros de permissão em múltiplas contas. Verifique sempre `getent passwd | awk -F: '{print $3}' | sort -n` antes de especificar um UID manualmente.

adduser –disabled-password para Scripting

Se tiver de usar `adduser` num script (por exemplo, para aproveitar as suas predefinições de `/etc/adduser.conf`), suprima os prompts interativos:

“`bash

adduser –disabled-password –gecos "Automated User,,," scriptuser

echo "scriptuser:$(openssl passwd -6 'password')" | chpasswd

“`

O sinalizador `–gecos` aceita uma string separada por vírgulas correspondente aos campos GECOS, eliminando todos os prompts interativos.

Integração PAM e NSS

Nem `useradd` nem `adduser` configuram módulos PAM ou entradas NSS (Name Service Switch) para LDAP, Active Directory ou outros sistemas de autenticação centralizados. Em servidores integrados com `sssd` ou `winbind`, a criação de utilizadores locais com qualquer um dos comandos cria contas que podem entrar em conflito com ou ser substituídas por contas de serviços de diretório. Verifique `/etc/nsswitch.conf` antes de criar utilizadores locais em sistemas associados a domínio.

Personalização de Ficheiros Skeleton

Ambos os comandos copiam de `/etc/skel` por predefinição. Para equipas que gerem ambientes de Alojamento Web Partilhado onde cada utilizador precisa de um `.bashrc`, `.vimrc` ou configuração SSH pré-configurados, preencher `/etc/skel` antes de executar qualquer um dos comandos é a abordagem correta — não modificar ficheiros após a criação da conta.

Verificar a Criação de Utilizadores

Independentemente do comando que utilizar, verifique o resultado:

“`bash

Check passwd entry

getent passwd newuser

Check shadow entry (requires root)

getent shadow newuser

Check group memberships

groups newuser

id newuser

Verify home directory and permissions

ls -la /home/newuser

Test login shell

su -s /bin/bash – newuser -c "echo login successful"

“`

Modificar e Eliminar Utilizadores

`useradd` e `adduser` apenas criam contas. A gestão pós-criação utiliza comandos diferentes:

  • `usermod` — Modificar atributos de utilizador existentes (shell, grupos, diretório home, expiração).
  • `userdel` / `deluser` — Remover contas. `deluser –remove-home username` no Debian também remove o diretório home e o spool de correio.
  • `passwd` — Definir ou alterar palavras-passe, bloquear/desbloquear contas.
  • `chage` — Gerir políticas de envelhecimento e expiração de palavras-passe.

“`bash

Lock an account without deleting it

usermod -L username

Unlock

usermod -U username

Force password change on next login

chage -d 0 username

“`

Matriz de Decisão Prática

Use esta lista de verificação para selecionar o comando correto:

  • O script está a correr num sistema não-Debian ou precisa de ser portável? Use `useradd`.
  • É um ambiente automatizado e não interativo (CI/CD, Ansible, Docker)? Use `useradd`.
  • Precisa de um UID/GID específico para consistência NFS ou de contentores? Use `useradd -u -g`.
  • Está a criar uma conta de sistema/serviço sem shell de login? Use `useradd -r -s /usr/sbin/nologin`.
  • Está no Debian/Ubuntu a criar uma conta de utilizador humano standard de forma interativa? Use `adduser`.
  • Quer adicionar um utilizador existente a um grupo com um one-liner limpo? Use `adduser username groupname`.
  • Está a escrever documentação ou a formar pessoal júnior no Debian? Use `adduser`.
  • Precisa de personalizar a localização do diretório home, expiração ou shell de forma não interativa em escala? Use `useradd` com sinalizadores explícitos.

A higiene adequada das contas de utilizador é fundamental para a segurança do servidor. Quer esteja a gerir um único VPS ou uma frota de Servidores Dedicados, compreender exatamente o que cada comando escreve no disco — e o que deixa por definir — previne a classe de escaladas de privilégios e falhas de autenticação que resultam de um provisionamento incompleto de contas.

FAQ

O useradd cria um diretório home por predefinição?

Depende da distribuição. Em sistemas baseados em Red Hat (RHEL, CentOS, Rocky Linux), `CREATE_HOME yes` em `/etc/login.defs` faz com que `useradd` crie o diretório home automaticamente. No Debian e Ubuntu, nenhum diretório home é criado a menos que passe explicitamente o sinalizador `-m`.

O adduser está disponível no CentOS ou Rocky Linux?

Nas distribuições baseadas em RHEL, `adduser` é um link simbólico para `useradd`, não o wrapper Perl interativo encontrado no Debian/Ubuntu. Executar `adduser username` no CentOS comporta-se de forma idêntica a `useradd username` — sem prompts, sem diretório home automático nas predefinições estilo Debian.

Como uso o adduser de forma não interativa num script?

Passe `–disabled-password` para ignorar o prompt de palavra-passe e `–gecos ""` para ignorar os prompts de campos GECOS: `adduser –disabled-password –gecos "" username`. Defina a palavra-passe posteriormente com `echo "username:password" | chpasswd` ou fazendo pipe de um hash `openssl passwd -6`.

Qual é a diferença entre /etc/login.defs e /etc/adduser.conf?

`/etc/login.defs` é o ficheiro de configuração de todo o sistema lido por `useradd`, `userdel` e `usermod` — controla intervalos de UID/GID, predefinições de envelhecimento de palavras-passe e comportamento de criação de diretório home. `/etc/adduser.conf` é lido exclusivamente pelos scripts Perl `adduser` e `deluser` em sistemas baseados em Debian e controla predefinições de nível superior como o shell predefinido, caminho pai do diretório home e diretório skeleton.

Posso misturar useradd e adduser com segurança no mesmo servidor Debian?

Sim. Ambos escrevem em última análise nos mesmos ficheiros `/etc/passwd`, `/etc/shadow` e `/etc/group`. As contas criadas com qualquer um dos comandos são indistinguíveis ao nível do sistema. A única preocupação prática é a consistência: se a sua equipa usa `adduser` interativamente e um script de automação usa `useradd` sem `-m`, pode acabar com alguns utilizadores sem diretórios home. Padronize numa abordagem por ambiente e documente-a.

15%

Poupe 15% em todos os serviços

Teste as suas habilidades e obtenha Desconto em qualquer plano

Utilizar o código:

Skills
Começar a trabalhar