Salve a tutti,
devo scrivere un software in C standard su piattaforma linux che, dopo aver eseguito una fork, esegue un comando esterno avviandolo con una nuova shell. Questo mi serve per caricare un particolare profilo utente (che viene impersonificato dal mio programmino) e far sì che il comando che viene lanciato sia eseguito nell'ambiente shell dell'utente corretto. Fin qui tutto bene e vi posto il pezzetto di codice che effettua questa semplice operazione:
Il problema è che devo aggiungere altre variabili a quelle già definite nel profilo e dovrei riuscire a fare un "merge" tra le 2 in quanto il comando che vado a lanciare le puo' usare entrambe. Avevo quindi pensato di esare la "execve()" al posto della "execv()" che mi prende in ingresso anche il vettore degli environment ma in questo modo il profilo non viene caricato e mi ritrovo solo le variabili che passo alla execve();char * cmdArray[5]; // questo e' vettore che viene passato alla execv
cmdArray[0] = "/bin/bash";
cmdArray[1] = "-bash";
cmdArray[2] = "-c";
cmdArray[3] = "printenv";//comando di esempio che stampa l'ambiente
cmdArray[4] = NULL; //l'ultimo elemento deve essere sempre NULL altrimenti la execv schianta
execv(cmdArray[0],&cmdArray[0]);
Un' altra soluzione che ho trovato è quella di fare delle export prima di invocare il comando vero e proprio ovvero e di usare comunque la execv() normale in questo modo:
Questa soluzione "funzionicchia" ma avro' problemi in caso di variabili di ambiente di tipo numerico in quanto dal mio programmino devo trattare tutto come stringhe (non riesco a distinguere i parametri che mi vengono passati!!!)char * cmdArray[5]; // questo e' vettore che viene passato alla execv
cmdArray[0] = "/bin/bash";
cmdArray[1] = "-bash";
cmdArray[2] = "-c";
cmdArray[3] = "export VAR1=\"prova\"; printenv"; //comando di esempio che stampa l'ambiente
cmdArray[4] = NULL; //l'ultimo elemento deve essere sempre NULL altrimenti la execv schianta
execv(cmdArray[0],&cmdArray[0]);
Qualcuno ha una qualche soluzione da suggerirmi? Ho cercato in rete ma niente purtroppo...
Grazie Anticipatamente

Rispondi quotando