Como verificar user no Linux com C

27 de agosto de 2021 Off Por Marcelo Martins

A linguagem C é uma linguagem dinâmica, ainda mais com Linux, que foi feito nesta linguagem.

Iremos começar a navegar nas interações da linguagem C com o linux.

Nesta nossa primeira jornada, iremos explorar como descobrir o usuário conectado.

Ao criarmos um usuário, o linux registra este na pasta /etc/, mais especificamente no passwd.

Exemplo do arquivo passwd

No exemplo a cima, podemos ver que o usuario mmm, tem a representação, conforme apresentado abaixo:

mmm:x:1000:1000:mmm,,,:/home/mmm:/bin/bash

Se olharmos a estrutura deste podemos identificar, a seguinte ordem:

user:x:1001:1001:user,,,:/home/user:/bin/bash
[–] – [–] [–] [—–] [——–] [——–]
| | | | | | |
| | | | | | +-> 7. Login shell
| | | | | +———-> 6. Home directory
| | | | +——————–> 5. GECOS
| | | +————————–> 4. GID
| | +——————————-> 3. UID
| +———————————–> 2. Password
+—————————————-> 1. Username

estrutura do arquivo passwd

Os principais componentes deste fragmento, são o UID e o GID.

O UID é o User Identification – Que é um número único, que identifica o usuário

O GID é o Group Identification – Que identifica o grupo pertencente aquele usuário, este arquivo, esta associado ao arquivo /etc/groups, que auxilia na criação de permissões.

Lendo o UID e o GID do usuário conectado

Quando voce loga no linux, utiliza as suas credenciais, login e senha. Desta forma sua aplicação precisa saber como pegar tal informação.

As informações do usuário logado, podem ser obtidas através da biblioteca unistd.h, entre suas várias funções estão duas:

  • gid_t getgid(void)
  • gid_t getegid(void)

Abaixo, traremos o main.c, que é um exemplo bem simples do uso da biblioteca.

#include <unistd.h>
#include <stdio.h>

void main(){
        printf("\nMeu id %i\n",getuid());
        printf("Meu group id %i\n",getgid());
}

No exemplo capturamos de forma direta o getuid e o getgid, onde mostramos os mesmos em uma mensagem.

all: compile

compile:
        gcc main.c -o ex01

No fragmento acima, temos o arquivo Makefile, ja nosso amigo de longa data, responsável pela compilação propriamente dita.

Listando as informações /etc/passwd

Este segundo programa, é um pouco mais complicado, ele varre a listagem de todos os usuarios, apresentando o conteúdo do passwd, e relacionando, conforme a estrutura do passwd.

#include <unistd.h>
#include <unistd.h>
#include <unistd.h>
#include <unistd.h>
#include <stdio.h>
#include <pwd.h>
#include <sys/types.h>

void main(){
        long uid = getuid();
        long gid = getgid();
        printf("\nMeu id %ld\n",uid);
        printf("Meu group id %ld\n",gid);
        struct passwd *ppw;
        int erro = 0;
        ppw = NULL;
        printf("Listagem de usuarios\n=======================\n");
        //pww = getpwent( ); /*Obtem a senha*/
        while((ppw = getpwent())!=NULL){
                if(erro !=0) {
                        printf("Falhou\n ");
                        //abort();
                } else {
                        printf("Usuario:%s\n",ppw->pw_name);
                        printf("senha:%s\n",ppw->pw_passwd);
                        printf("id de usuario:%d\n",ppw->pw_uid);
                        printf("id do grupo:%d\n",ppw->pw_gid);
                        printf("comentario:%s\n",ppw->pw_gecos);
                        printf("diretorio:%s\n",ppw->pw_dir);
                        printf("shell:%s\n", ppw->pw_shell);
                }
                printf("\n");

        }

}

Temos como saída o exemplo que se segue:

estrutura do passwd

Outras funções semelhantes

A função getpwuid retorna a estrutura passwd, igual a anterior, porem, ela pega apenas a de um uid especifico, utilizado para pesquisar a informação de user id.

struct passwd *getpwuid(uid_t uid);

Pesquisa por login,

struct passwd *getpwnam(const char* name);