Como verificar grupo no linux com C

Este artigo é uma continuação do treinamento apresentado no artigo abaixo:

http://maurinsoft.com.br/index.php/2021/08/27/como-verificar-user-no-linux-com-c/

Agora iremos falar um pouco sobre as informações dos grupos no linux.

O arquivo /etc/group, é um banco de dados de grupos de usuários, os grupos são usados para permissões de acesso, pois em geral, estabelecemos permissões para o usuário, para os membros de seu grupo e depois para os outros usuários.

lista de grupos da minha maquina.

Ao olharmos o grupo mmm, percebemos que tem o mesmo nome e codigo do usuario (/etc/passwd). Ao criarmos um usuário, o linux automáticamente cria um um grupo para este.

Tabela das informações do /etc/group

Número de CAMPODados de exemploDescrição
1mmmO nome do grupo
2xA senha do grupo (se existir)
31000O numero de id do grupo
4A lista de nomes de usuários que pertencem a esse grupo

Vamos ao código em C

Agora vamos estudar o código abaixo, que é basicamente uma continuação do código do primeiro artigo.

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

void main(){
	long uid = getuid();
	long gid = getgid();
	char nomegrupo[40];

	printf("\nMeu id %ld\n",uid);
	printf("Meu group id %ld\n",gid);
	struct group *gp= getgrgid(gid);
	printf("Meu nome do grupo %s",gp->gr_name);
	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"a,ppw->pw_gid);

			/*Pega as informações do grupo*/
			gid = ppw->pw_gid; /*Pega o grupo do usuario*/
			gp = getgrgid(gid);

			/*Mostra os grupos*/
			printf("Nome do grupo %s",gp->gr_name);
			printf("Senha do grupo %s",gp->gr_passwd);
			printf("id do grupo %d",gp->gr_gid);
			for( int cont= 0; gp->gr_mem[cont]!=0;++cont) {
				printf("membros do grupo %s", gp->gr_mem[cont]);
			}

			/*O resto das informações do usuario*/
			printf("comentario:%s\n",ppw->pw_gecos);
			printf("diretorio:%s\n",ppw->pw_dir);
			printf("shell:%s\n", ppw->pw_shell);
		}
		printf("\n");

	}

}

Neste código, podemos ver 2 fragmentos importantes:

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

void main(){
	long uid = getuid();
	long gid = getgid();
	char nomegrupo[40];

	printf("\nMeu id %ld\n",uid);
	printf("Meu group id %ld\n",gid);
	struct group *gp= getgrgid(gid);
	printf("Meu nome do grupo %s",gp->gr_name);
	struct passwd *ppw;
	int erro = 0;
	ppw = NULL;

Neste pequeno fragmento, a lib responsável pelo gerenciamento do grupo, é

#include <grp.h>

Funções de gestão de grupo

Para comecarmos, vamos apresentar a estrutura de um grupo:

struct group {
   char *gr_name; /* nome do grupo */
   char *gr_passwd; /* senha do grupo */
   gid_t gr_gid; /* id do grupo */
   char **gr_mem; /* membros do grupo */
}

GETGRENT

Abre a listagem e pega a primeira ocorrencia do grupo. Funcionando como um cursor, para capturar todos os registros do grupo.

while ( ( gp = getgrent())!=0){
   printf("%s", gp->gr_name);
}
endgrent();

No caso do exemplo acima, só para quando o ultimo registro for encontrado.

ENDGRENT

É usado em conjunto com a função getgrent, ela faz voltar para a posição inicial.


while ( ( gp = getgrent())!=0){
   printf("%s", gp->gr_name);
   endgrent();
}

Nesta sutil variação do código, será mostrada sempre o primeiro registro.

GETGRGID

Pesquisa o grupo, pegando a estrutura identificada pela chave gid (Group ID).

printf("\nMeu id %ld\n",uid);
printf("Meu group id %ld\n",gid);
struct group *gp= getgrgid(gid);
printf("Meu nome do grupo %s",gp->gr_name);

No fragmento acima, podemos ver que funciona, inclusive acompanhar sua sintaxe.

GETGRNAM

Função semelhante a anterior, porem em vez de pegar o id, ela procura o grupo que contenha o nome do grupo.

SIntaxe:

char nome[20];
sprintf(nome,"mmm");
struct group *gp = getgrnam(nome);
printf("ID grupo: %d",gp->gr_gid); 

Bom pessoal, por enquanto isso é tudo!

Espero ve-los em breve.

E se curtiu o texto, ou acha que poderiamos melhorar, envie-nos um email

marcelomaurinmartins@gmail.com

Até breve e vida longa e prospera.