obtener uid de un proceso cualquiera.

Estado
Cerrado para nuevas respuestas.

kemark

Lanero Reconocido
9 Abr 2003
2,499
Ya que fue imposible dejar el mensaje de judiurco, el cual intente salvar con esta pregunta, pues posteo mi pregunta de nuevo como un nuevo tema.

Alguien sabe alguna funcion en c que me diga el uid del usuario ke este ejecutando un proceso determinado, osea que:

funcion(init o 0); // por ejemplo

me devuelva 0, ke es el uid del root.
(getuid() no me sirve por que devuelve el uid del proceso que se esta ejecutando, osea el mismo.!),

estaba pensando en usar stat (man 2 stat), y st_uid en /proc/<pid> pero me tocaria escribir la funcion, si alguien sabe de esa funcion me podria ayudar..., ya busque en unistd.h, y sys/types.h y no encontre nada, tambien la idea de usar ptrace inyectar getuid() en un punto y hacer PTRACE_DETACH ya la he tenido en cuenta.

Gracias por su posible ayuda.


Saludoz
..\..^__^............
...\.(oo)\_______....
.....(__)\*******)\/\
.........||----w |...
.........||.....||...
 
Se me ocurre que deberias pillar las sources de comando ps, pero por lo que entiendo no hay funcion que haga eso, pilla el libro Advanced linux programing. creo haber leido algo pero no recuerdo.
 
tengo a mi alcanze advance unix programming. para que los sources de ps?
 
Otra vez hola, bueno ps devulve la info de los procesos en ejecucion no?, creo que eso te daria una idea.

Me dio curiosidad y la funcion la verda es que no la veo por ningún lado, creo q por aqui es la cosa, esto esta en ALP, y en la salida manda el USER que ejecuta el proceso. Bueno tu debes saber mas de esto q yo y ya sabras q hacer, no es lo que tu quieres pero creo es la solucion ;). Hay va:


#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>

void print_proc_arg_list(pid_t pid){
int fd;
char filename[24];
char environment[8192];
size_t length;
char* next_var;

snprintf (filename, sizeof(filename), "/proc/%d/envirom", (int) pid);
fd = open (filename, O_RDONLY);
length = read(fd, environment, sizeof(environment));
close(fd);

environment[length] = '\0';

next_var = environment;
while (next_var < environment + length) {
printf ("%s\n", next_var);
next_var += strlen(next_var) + 1;
}
}

int main(int argc, char* argv[]){
pid_t pid = (pid_t) atoi (argv[1]);
print_proc_arg_list(pid);
return 0;
}
 
pues, yo no me acuerdo mucho de C, pero creo que eso se podria hacer facilito con un script de shell que ejecute el "ps aux" y coja el resultado, y lo meta en un
"grep", luego saca el primer token de la linea, que es el nombre del usuario, luego hace un "id <resultado>" y ya.. estoy siendo muy iluso?

bueno, en perl seria mas facil...
 
Es absolutamente cierto lo que dices jasz, pero krawek necesita aquello.
 
NO SE SI ESTO LE SIRVA ,

/*
Nombre: Obtiene Nombre de Usuarios Con Sus Respecivas uid apartir del shadow
Modificado: t763rm3n
Mail:powermagic2000@hotmail.com
Nota: La fuente de este programa no es de mi autoridad
solo lo e modificado para mi propio uso u el uso de
quien lo quiera nescesitar.
*/

struct SHADOWPW {
char *pw_name;
char *pw_passwd;
int pw_uid;
int pw_gid;

};
struct passwd *getpwent(), *getpwuid(), *getpwnam();

#ifdef elxsis


#define SHADOWPW "/etc/shadow"


#define CHANGE_TRIES 1

#endif elxsi

#define NULL 0
main()
{


printf("\n--------------t763rm3n---------------\n\n");
printf("usuario\t\tuid\t\tgid\n");

struct passwd *p;
int i;
for (;1;) {;
p=getpwent();
if (p==NULL) return;
printpw(p);

}
}

printpw(a)
struct SHADOWPW *a;
{
printf("%s\t\t%d\t\t%d\n",
a->pw_name,a->pw_uid,a->pw_gid,a);

}

INCLUI EL FICHERO , en .zip donde esta comprimido el binario y este codigo fuente :)
 

Archivos adjuntos

  • useruid.zip
    12.6 KB · Visitas: 169
SAi seria posible, se tendria que crear una instrucion algo laraga pero resultaria
 
Si tiene el numero de proceso, parseelo de /proc/numero_de_proceso (todo de ahi para abajo pertenece al uid del que lo ejecuta).

Si tiene el nombre del proceso, parseelo del resultado de un popen() ejecutando:

ps -fea | awk ' { if ($8 == "init") print $1 } '

PD. Obviamente reemplaza "init" por el proceso que necesita.
 
huyyyyy estos manes debirian participar en el concurso que gigax va hacer en Tecnocom de scripting creo que se escribe asi si no corrijan
 
Esto me recuerda un man de #perl en Undernet..

uno le hacia cualquier pregunta, la mas rara que se te ocurriera.. sobre perl, obviamente.. y el hp te respondia en UNA SOLA LINEA!!!!!!

La respuesta de Krieg... me le kito el sombrero, nunca he usado awk.
 
Estado
Cerrado para nuevas respuestas.

Los últimos temas