Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - [C vs Bash] Come ritornare un valore da system()?
Forum - C/C++ - [C vs Bash] Come ritornare un valore da system()?

Avatar
Adone (Normal User)
Newbie


Messaggi: 6
Iscritto: 20/08/2011

Segnala al moderatore
Postato alle 15:38
Sabato, 24/09/2011
Salve a tutti!
Vi spiego il mio problema...sto scrivendo un programma in C che in diversi punti ha bisogno di interagire con la shell unix tramite system().
Ad un certo punto il programma richiede la password di root semplicemente tramite uno scanf (lo so che non è sicuro ma va bene per il mio scopo, poi lo sostituirò con un fgets). La password viene memorizzata in una stringa chiamata "pwd" così posso utilizzarla in altri comandi futuri tramite system in questo modo:

Codice sorgente - presumibilmente Plain Text

  1. ssprintf(comando, echo %s | sudo -S blabla,pwd);
  2. system(comando)



In pratica in questo modo do in pasto a sudo in automatico la password inserita precedentemnte dall'utente. Ora però ho un problema. Io vorrei poter controllare che, quando l'utente inzialmente inserisce la passwd di root, essa sia corretta o meno! Avevo pensato a una cosa di questo tipo (moooolto grezza):

Codice sorgente - presumibilmente C/C++

  1. printf("Inserisci password di root:\n");
  2. scanf("%s",pwd);
  3. sprintf(command,"echo %s | sudo cd / ; if [ $? == \"1\" ]; then echo \"Password errata!\"; exit 1; fi",pwd);
  4. system(command);



In pratica se la password è errata il bash stampa direttamente "Password errata!". Però c'è un problema o_o! Il programma in C ovviamente continua l'esecuzione, e che la password sia sbagliata o meno a lui non importa! Come faccio a far si che system mi restituisca un valore in base a se la pssword è corretta o meno così da poter modificare anche il flusso di esecuzione del programma in C?
Avete capito cosa intendo dire?
Lo so che è una richiesta molto strana e grezza, ma l'alternativa è rendere il mio programma un suid, e usare direttamente le funzioni e le librerie per il controllo della password shadow, ma questo non è quello che vorrei.

PM
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6116
Iscritto: 04/12/2003

Up
1
Down
V
Segnala al moderatore
Postato alle 20:43
Sabato, 24/09/2011
Potresti salvare in un file temporaneo il risultato di sudo... (echo "0" > result oppure echo "1" > result) dopodiche' leggerlo dal programma C...

Oppure nella maniera piu' elegante, fai una fork, esegui sudo tramite exec nel child process e cattura il return status (assicurati di usare wait nel parent per aspettare il risultato). Non ho provato, ma dovrebbe funzionare.


Ultima modifica effettuata da pierotofy il 24/09/2011 alle 20:44
Allora, PER ORA, ho risolto sfruttando il primo metodo che mi hai suggerito però in modo più rapido. In pratica ho letto che system() ritorna il valore di ritorno dell'esecuzione del comando bash. Pertanto, ipotizzando un comando tipo "sudo cd /" esso dovrebbe ritornare 0 se la passwd è giusta - Adone - 24/09/11 22:10
quindi ho fatto sprintf(command,"echo %s | sudo -S cd /",pwd); pwd_status=system(command); if(pwd_status!=0){printf("You entered a wrong password. Try again. \n"); goto passwd;} - Adone - 24/09/11 22:10
in pratica verifico il valore di ritorno di system() e vedo se la pwd è giusta o meno. E' un metodo un pò grezzo ma che funziona....il secondo che mi hai suggerito non so come metterlo in pratica dovrei studiarlo un pò...più avanti vedrò di provarlo :) grazie - Adone - 24/09/11 22:11
Si anche quello funziona... perche' bash ritorna il valore di ritorno dell'ultimo comando eseguito, oppure 0. Attento che se la shell di default non e' Bash non hai nessuna garanzia che il codice funzioni. - pierotofy - 25/09/11 00:06
Se ad esempio una shell ritorna 0 per un comando eseguito con successo e -1 in tutti gli altri casi, che la password sia corretta o meno ritornera' sempre 0. - pierotofy - 25/09/11 00:10
eh no! Perchè se io faccio eseguire un comando con sudo, e la password è sbagliata, allora la shell non ritornerà 0 bensi un valore diverso da 0! - Adone - 25/09/11 17:30
Si.... fintanto che bash e' la shell di default. Non hai seguito il mio punto. - pierotofy - 25/09/11 18:45
Ah scusa non avevo letto il primo commento! Hai ragione su questo! Però su osx bash è la shell di default e mmm bhè si spera non venga cambiata :S! Diciamo che è grezzo e poco sicuro....:S - Adone - 26/09/11 12:20
Come potrei fare per inizializzare il programma con la shell bash? Cioè se il programma fosse scritto direttamente in bash basterebbe mettere #!/bin/bash... - Adone - 26/09/11 12:23


Seguimi su Twitter: http://www.twitter.com/pierotofy

Fai quello che ti piace, e fallo bene.
PM
Avatar
HeDo (Founder Member)
Guru^2


Messaggi: 2763
Iscritto: 21/09/2007

Up
0
Down
V
Segnala al moderatore
Postato alle 15:57
Sabato, 24/09/2011

mai sentito parlare del comando "su"?

oppure puoi semplicemente fare:

Codice sorgente - presumibilmente Plain Text

  1. sudo ./script.sh



in questo modo elevi già in partenza il tuo programma :)

Eh no ok! Ma se il mio programma dovesse avviarsi semplicemente cliccandoci sopra due volte come qualsiasi applicazione! Non posso imporre che si avvii da root O_o! o si? - Adone - 24/09/11 16:07
Perchè in teoria basterebbe a questo punto mettere un system(sudo qualcosa) all'inizio dell'applicazione, cosìcchè il sudo varrebbe anche per tutti i sudo successivi...però non è sicuro al 100%....avere la passwd a disposizione sarebbe più certo! - Adone - 24/09/11 16:36


Ingegnere Informatico
https://ldlagency.it
PM
Avatar
tasx (Dev Team)
Expert


Messaggi: 439
Iscritto: 15/12/2008

Up
0
Down
V
Segnala al moderatore
Postato alle 16:12
Sabato, 24/09/2011
Ciao!!

Guarda qui: http://www.nongnu.org/gksu/

ciaociao!!

Il fatto è che sto programmando per osx! :S - Adone - 24/09/11 16:26


... sei un proxy che perde i pacchetti ...
PM