Informazioni utente con C++ su Linux
Questo articolo si riferisce a Linux e forse, ma non ho ancora provato, anche ai Mac visto che sono molto simili.
Non funzionerebbe invece su Windows.
Quello che vogliamo fare è recuperare informazioni sull'utente usando un piccolo programmino scritto in C++.
Avremo bisogno di alcune cose:
- struct passwd -> una struttura dati che contiente le informazioni dell'utente
- un dato di tipo uid_t -> corrisponde all'ID dell'utente nel sistema
- getpwuid(ID)
- geteuid() -> ritortna l'ID reale dell'utente
Per questi ulitmi guardate le pagine man per vedere bene a cosa servono e quali librerire richiedono.
A questo punto vediamo come strutturare il tutto.
Senza scomodare classi e oggetti mettiamo tutto nel main:
#include <cstdlib>
#include <stdio.h>
#include <pwd.h>
#include <unistd.h>
using namespace std;
int main(int argc, char** argv) {
struct passwd *p;
uid_t uid = geteuid();
if ((p = getpwuid(uid)) != NULL) {
printf("Name : %s\n", p->pw_name);
printf("Uid : %d\n", (int) p->pw_uid);
printf("Gid : %d\n", (int) p->pw_gid);
printf("Home : %s\n", p->pw_dir);
printf("Shell : %s\n", p->pw_shell);
}
return 0;
}
Con geteuid() prendiamo l'id dell'utente con il quale lanciamo il programma; questo ID lo passiamo poi a getpwuid() per controllare se esiste davvero.
Se volessimo vedere le info di altri utenti dovremmo metterlo a mano e dovete modificare un pò la logica (mettendolo ad esempio come parametro in fase di esecuzione).
Se l'ID esiste vengono stampate le varie informazioni.
Qui ho preso inconsiderazione:
- il nome utente
- uid -> id utente
- gid -> id gruppo
- home directory
- shell attiva
Ad esempio:
$ ./prove
Name : mf
Uid : 1000
Gid : 100
Home : /home/mf
Shell : /bin/bash
Sul mio sistema Archlinux a 64bit.
Se guardate al link della struct passwd vedrete che ci sono anche altre info.
Direci che mi manca solo la prova sul Mac, ma sono fiducioso!
c++ c++ linux mac archlinux struct passwd ge
Commentami!