No Linux, todo processo é executado por um usuário, e cada usuário pertence a um ou mais grupos. Entender como gerenciar usuários e grupos é essencial para controle de permissões e segurança em scripts shell. Nesta aula, você aprenderá a identificar o usuário atual, executar comandos como superusuário e interpretar o arquivo que armazena informações básicas dos usuários.

Esses conceitos são fundamentais para escrever scripts que precisam verificar privilégios, alternar contextos de execução ou gerenciar permissões de arquivos e diretórios.

Conceitos

Usuário é uma entidade que pode executar processos e possuir arquivos. Cada usuário tem um identificador numérico único (UID). Grupos são coleções de usuários que compartilham permissões; cada grupo tem um GID. Um usuário pode pertencer a múltiplos grupos: o grupo primário (definido em /etc/passwd) e grupos suplementares (definidos em /etc/group).

As permissões de arquivos (leitura, escrita, execução) são definidas para o proprietário, para o grupo proprietário e para outros. Scripts frequentemente precisam verificar se o usuário atual tem privilégios suficientes para realizar operações sensíveis.

whoami e id

O comando whoami exibe o nome do usuário atual. Já o comando id mostra informações detalhadas: UID, GID primário e todos os grupos suplementares. Esses comandos são úteis para scripts que precisam adaptar seu comportamento conforme o usuário que os executa.

#!/bin/bash
echo "Você é: $(whoami)"
echo "Detalhes:"
id

Exemplo de saída do id:

uid=1000(aluno) gid=1000(aluno) groups=1000(aluno),4(adm),27(sudo)

Você pode extrair partes específicas com opções como id -u (UID), id -g (GID primário) e id -G (todos os GIDs).

sudo

sudo permite executar comandos como outro usuário, normalmente root. É controlado pelo arquivo /etc/sudoers. Em scripts, use sudo com cuidado: verifique se o script não exige senha interativa (use sudo -n para não interativo) e evite expor senhas.

#!/bin/bash
# Verifica se o usuário tem permissão sudo
if sudo -n true 2>/dev/null; then
    echo "Tem acesso sudo"
else
    echo "Sem acesso sudo"
fi

Para garantir que um script seja executado com privilégios elevados, muitas vezes se usa:

if [ "$EUID" -ne 0 ]; then
    echo "Por favor, execute como root."
    exit 1
fi

Mas cuidado: $EUID é uma variável interna do Bash que indica o UID efetivo.

/etc/passwd (visão geral)

O arquivo /etc/passwd armazena informações básicas de cada usuário do sistema. Cada linha tem 7 campos separados por dois-pontos:

  • nome de usuário
  • senha (geralmente 'x' indicando que está em /etc/shadow)
  • UID
  • GID do grupo primário
  • descrição (GECOS)
  • diretório home
  • shell padrão

Exemplo de linha:

aluno:x:1000:1000:Aluno,,,:/home/aluno:/bin/bash

Scripts podem ler esse arquivo para obter informações, mas evite modificar diretamente; use comandos como useradd, usermod, etc.

#!/bin/bash
# Lista todos os usuários e seus UIDs
cut -d: -f1,3 /etc/passwd

Boas práticas

  • Sempre verifique o ID do usuário antes de executar operações críticas.
  • Use sudo com -n em scripts para evitar prompts de senha.
  • Não hardcode senhas; use variáveis de ambiente ou arquivos seguros.
  • Prefira comandos de gerenciamento (useradd, groupadd) a editar manualmente /etc/passwd.

Referências

Exercícios

  1. Escreva um script que exiba o nome do usuário atual e seu UID.

    ✓ Resposta:
    #!/bin/bash
    echo "Usuário: $(whoami)"
    echo "UID: $(id -u)"
  2. Crie um script que verifique se o usuário atual é root (UID 0) e exiba uma mensagem apropriada.

    ✓ Resposta:
    #!/bin/bash
    if [ "$EUID" -eq 0 ]; then
        echo "Você é root."
    else
        echo "Você não é root."
    fi
  3. Escreva um script que liste todos os grupos suplementares do usuário atual (excluindo o primário).

    ✓ Resposta:
    #!/bin/bash
    # Obtém o GID primário
    primary_gid=$(id -g)
    # Lista todos os GIDs e remove o primário
    id -G | tr ' ' '\n' | grep -v "^$primary_gid$" | while read gid; do
        getent group "$gid" | cut -d: -f1
    done
  4. Use o comando sudo -n para verificar se o usuário pode executar um comando como root sem senha. Exiba "sim" ou "não".

    ✓ Resposta:
    #!/bin/bash
    if sudo -n true 2>/dev/null; then
        echo "sim"
    else
        echo "não"
    fi
  5. Escreva um script que use /etc/passwd para listar todos os usuários que têm shell /bin/bash.

    ✓ Resposta:
    #!/bin/bash
    grep '/bin/bash$' /etc/passwd | cut -d: -f1