[C] Argumenten afvangen en doorgeven

Pagina: 1
Acties:

  • PisPix
  • Registratie: Oktober 2003
  • Laatst online: 21:28
Hi,

Ik ben echt een totale n00b mbt C programmeren. Ik gebruik voornamelijk shell scripts. Het volgende probleem. Ik moet een programma starten met een wrapper.

Het volgende voorbeeld wordt gegeven:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <unistd.h>
int main (int argc, char *argv[])
{
char *arg [3];
char *env [1];
arg [0] = "httpdsctl";
if (argc == 2)
    arg [1] = argv [1];
else
    arg [1] = NULL;
arg [2] = NULL;
env [0] = NULL;
setuid (0);
execve ("/u02/ias/Apache/Apache/bin/apachectl", arg, env);
return 0; 
}


Maar dit vangt de parameters die meegegeven zijn aan de wrapper niet af. Wat ik wil is het volgende:

linuxbox # ./wrapper start

De wrapper moet dan de "start" optie meenemen en doorgeven aan het apachectl programma. In shell scripts doe je dat mooi met $1, maar met dit C programma wil het niet echt lukken. Ik lees hier en daar wat over argv[] maar kan het allemaal niet plaatsen. Ergens heb ik de melk horen klotsen, maar weet de tepel niet te vinden. Wie heeft een oplossing?

Thnx!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 01:03

.oisyn

Moderator Devschuur®

Demotivational Speaker

Het eerste argument is geloof ik altijd de executable zelf. Maar wat werkt er niet aan je code dan? Wat gaat er verkeerd? En check je de errors van execve wel?

[ Voor 50% gewijzigd door .oisyn op 20-04-2004 16:56 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • PisPix
  • Registratie: Oktober 2003
  • Laatst online: 21:28
.oisyn schreef op 20 april 2004 @ 16:54:
Het eerste argument is geloof ik altijd de executable zelf. Maar wat werkt er niet aan je code dan? Wat gaat er verkeerd? En check je de errors van execve wel?
Oke, dus hij vangt zichzelf ook af? Dus het tweede argument zou dan mijn parameter "start" zijn?
Wanneer ik intik (na compilen) # ./wrapper start
Dan start ie netjes "/u02/ias/Apache/Apache/bin/apachectl", maar hij moet "/u02/ias/Apache/Apache/bin/apachectl start" doen. Dus de "start parameter die ik het c programma (wrapper) mee geef, moet ie netjes 1:1 doorgeven aan het shell script (apachectl). Hoe check je de errors van execve?

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 01:03

.oisyn

Moderator Devschuur®

Demotivational Speaker

"man execve" :z
En waarom test je met apache en niet gewoon even met een eigen geschreven programmaatje dat alle doorgegeven argumenten op het scherm toont?

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • PisPix
  • Registratie: Oktober 2003
  • Laatst online: 21:28
.oisyn schreef op 20 april 2004 @ 17:11:
"man execve" :z
En waarom test je met apache en niet gewoon even met een eigen geschreven programmaatje dat alle doorgegeven argumenten op het scherm toont?
No manual entry for execve

Ik zit op een redelijk restricte bak... ;-(

Ik heb het al meerdere malen getest met het programma "uptime" en dan proberen de -V parameter door te geven, maar ook dat wil niet lukken.

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 01:03

.oisyn

Moderator Devschuur®

Demotivational Speaker

PisPix schreef op 20 april 2004 @ 17:15:
[...]


No manual entry for execve
kan ik niets aan doen, je kunt toch wel browsen? GoT is niet een vervanging voor je manual als je er toevallig even niet bij kan. Maar goed, blijkbaar werkt er iets niet, en even ervan uitgaande dat je nu idd ook de executable zelf als eerste argument meegeeft, kunnen wij er geen zinnig woord over zeggen zolang we niet weten wat de error is die je terug krijgt (die je natuurlijk alleen krijgt als de executable zelf niet start, is dat ook het geval? Of start ie wel maar met de verkeerde argumenten? In dat laatste geval moet je gewoon even een test-programmaatje maken zoals ik al zei)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • PisPix
  • Registratie: Oktober 2003
  • Laatst online: 21:28
.oisyn schreef op 20 april 2004 @ 18:16:
[...]


kan ik niets aan doen, je kunt toch wel browsen? GoT is niet een vervanging voor je manual als je er toevallig even niet bij kan. Maar goed, blijkbaar werkt er iets niet, en even ervan uitgaande dat je nu idd ook de executable zelf als eerste argument meegeeft, kunnen wij er geen zinnig woord over zeggen zolang we niet weten wat de error is die je terug krijgt (die je natuurlijk alleen krijgt als de executable zelf niet start, is dat ook het geval? Of start ie wel maar met de verkeerde argumenten? In dat laatste geval moet je gewoon even een test-programmaatje maken zoals ik al zei)
Oke, heb even op internet de manual opgezocht van execve. Wordt daar niet veel wijzer van.

Wanneer ik de wrapper start, start apache niet op, omdat er geen stop/start/restart commando mee gegeven wordt. Wanneer ik apache met de hand start gaat het uiteraard wel goed. Ik krijg dus geen error terug. Het script zoals het hierboven staat werkt prima, los van dat ie de variable mee neemt. Ik worstel dus met de sytax die achter /../apachectl moet komen.

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 01:03

.oisyn

Moderator Devschuur®

Demotivational Speaker

Hoe is je code nu dan?

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Robtimus
  • Registratie: November 2002
  • Laatst online: 15:28

Robtimus

me Robtimus no like you

Kun je niet gewoon zeggen argv[0] = "dinges"; en daarna je oude argv gebruiken? Dat is ook een NULL terminated array, net zoals execve nodig heeft.

Controleert execve trouwens het eerste element van zijn array? Zo nee, dan is die assignment niet eens nodig, alleen je controles als je dat wilt.

[ Voor 37% gewijzigd door Robtimus op 20-04-2004 18:56 ]

More than meets the eye
There is no I in TEAM... but there is ME
system specs


Verwijderd

Je wilt gewoon argumenten en het environment doorgeven? Dan doe je erg moeilijk:

C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>

const char  progname[]= "/u02/ias/Apache/Apache/bin/apachectl";

int main(int argc, char* argv[], char* envp[])
{
    setuid(0);   /* Echt nodig? */
    if(execve(progname, argv, envp)) {
        perror(progname);
        return 1;
    }
    return -123; /* Mag niet voorkomen, execve returnt niet. */
}

[ Voor 6% gewijzigd door Verwijderd op 20-04-2004 19:23 ]


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 01:03

.oisyn

Moderator Devschuur®

Demotivational Speaker

Zit ik een beetje angstvallig te proberen vooral geen code te posten zodat ie er zelf achter kan komen, doe jij het :{

[ Voor 18% gewijzigd door .oisyn op 20-04-2004 19:26 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

.oisyn schreef op 20 april 2004 @ 19:26:
Zit ik een beetje angstvallig te proberen vooral geen code te posten zodat ie er zelf achter kan komen, doe jij het :{
Don't worry, er zit een grote denkfout in zijn opzet, ik heb extra bij een functie geen errorchecking ingebouwd (en de call van commentaar voorzien) zodat hij daar zelf achter komt. ;)

  • PisPix
  • Registratie: Oktober 2003
  • Laatst online: 21:28
Oke... na wat zoeken en speuren ben ik er uit gekomen... De code ziet er nu als volgt uit:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <unistd.h>

int main (int argc, char *argv[])
{
        char *arg [3];
        char *env [1];
        arg [0] = "apacectl.sh";
        arg [1] = argv [1];
        arg [2] = NULL;
        env [0] = NULL;
        setuid (0);
        execve ("/u02/ias/Apache/Apache/bin/apachectl", arg, env);
        return 0;
}


Allen bedankt voor de hulp!

[ Voor 12% gewijzigd door PisPix op 21-04-2004 12:10 ]


  • Robtimus
  • Registratie: November 2002
  • Laatst online: 15:28

Robtimus

me Robtimus no like you

Je gebruikt een lege environment, kun je dan niet beter execv ipv execve gebruiken? Het is dan wel een front-end voor execve volgens de man-page, maar het oogt netter.

More than meets the eye
There is no I in TEAM... but there is ME
system specs


Verwijderd

PisPix schreef op 21 april 2004 @ 12:10:
Oke... na wat zoeken en speuren ben ik er uit gekomen... De code ziet er nu als volgt uit:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <unistd.h>

int main (int argc, char *argv[])
{
        char *arg [3];
        char *env [1];
        arg [0] = "apacectl.sh";
        arg [1] = argv [1];
        arg [2] = NULL;
        env [0] = NULL;
        setuid (0);
        execve ("/u02/ias/Apache/Apache/bin/apachectl", arg, env);
        return 0;
}


Allen bedankt voor de hulp!
Arrrgggghhhh! :) Als je de andere posts in dit topic echt gelezen had wist je dat:

1) Je niet met argv[0] hoeft te klooien, execve gebruikt die niet.
2) Je het environment als 3e parameter van main kunt binnenhalen
3) Je niet als normale user zo maar root kunt worden met setuid(0)

M.a.w.: back to the drawing board.

  • _Squatt_
  • Registratie: Oktober 2000
  • Niet online
Verwijderd schreef op 21 april 2004 @ 15:49:
3) Je niet als normale user zo maar root kunt worden met setuid(0)
Ik denk dat dit een suid programma wordt. En dat is ook de reden dat de TS dit niet in shellscript doet, want suid/guid op scripts wordt genegeerd (in ieder geval onder linux).

"He took a duck in the face at two hundred and fifty knots."


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 23:14
_Squatt_ schreef op 21 april 2004 @ 16:25:
Ik denk dat dit een suid programma wordt. En dat is ook de reden dat de TS dit niet in shellscript doet, want suid/guid op scripts wordt genegeerd (in ieder geval onder linux).
Ofwel je bent al root en dan is setuid(0) dus overbodig, ofwel je bent geen root en dan werkt het niet. Die regel is dus hoe dan ook niet zinnig; ofwel hij werkt niet, ofwel hij is niet nodig. Dat staat verder los van hoe het programma aan z'n user id gekomen is (al dan niet met een setuid/setgid bits) .

edit:
Wat ik hierboven zeg klopt niet helemaal. Met setuid(0) wordt de real user id ook op 0 gezet. Een programma van root met setuid-bit dat door een gewone gebruiker wordt uitgevoerd behoudt de originele real user id maar krijgt een nieuwe effective user id. Met setuid(0) worden de real user id en de saved user id nog wel aangepast. Het nut ervan blijft twijfelachtig, omdat meestal alleen de effective user id van belang is en die wordt op deze manier zeker niet aangepast.

[ Voor 30% gewijzigd door Soultaker op 21-04-2004 17:00 ]


  • PisPix
  • Registratie: Oktober 2003
  • Laatst online: 21:28
_Squatt_ schreef op 21 april 2004 @ 16:25:
[...]

Ik denk dat dit een suid programma wordt. En dat is ook de reden dat de TS dit niet in shellscript doet, want suid/guid op scripts wordt genegeerd (in ieder geval onder linux).
Hier komt het inderdaad op neer. De gegeven code in het start topic is hetgene wat de leverancier als zijnde 'gesupport' aangeeft. Het heeft alleen nooit gewerkt. De nieuwe code is nu voorgelegd aan deze leverancier om hierover de certificering te behouden. (vandaar de weinige aanpassingen). Ik ben het met ieder ander eens die zegt dat deze code frut is, en dat het op 1000 en 1 andere manieren zou kunnen. In dit geval gaat het om certificering, en is de enige mogelijkheid die te behouden, door zo dicht mogelijk bij het orgineel te blijven.
Pagina: 1