Como verificar grupo no linux com C
Este artigo é uma continuação do treinamento apresentado no artigo abaixo:
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.
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 CAMPO | Dados de exemplo | Descrição |
1 | mmm | O nome do grupo |
2 | x | A senha do grupo (se existir) |
3 | 1000 | O numero de id do grupo |
4 | A 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.