Como verificar user no Linux com C
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.
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
estrutura do arquivo passwd
[–] – [–] [–] [—–] [——–] [——–]
| | | | | | |
| | | | | | +-> 7. Login shell
| | | | | +———-> 6. Home directory
| | | | +——————–> 5. GECOS
| | | +————————–> 4. GID
| | +——————————-> 3. UID
| +———————————–> 2. Password
+—————————————-> 1. Username
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:
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);