• Diese Seite verwendet Cookies. Indem du diese Website weiterhin nutzt, erklärst du dich mit der Verwendung von Cookies einverstanden. Erfahre mehr

doas sh -c 'whoami; whoami' mit execl() in C

Themenstarter #1
Hallo,
kurz zum Code:
Code:
#include <unistd.h>
#include <stdio.h>

int
main(void)
{
  printf("1\n", NULL);
  system("/usr/bin/doas /bin/sh -c '/usr/bin/whoami; /usr/bin/whoami'");

  printf("2\n", NULL);
  execl("/usr/bin/doas", "doas", "/bin/sh", "-c", "/usr/bin/whoami", NULL);

  return 0;
}
Ausgabe:
Code:
1
doas (user@url.domain) password:
root
root
2
doas (user@url.domain) password:
root
Soweit so gut, nun würde ich gerne 2mal whoami mit execl() aufrufen, finde jedoch keinen grünen Zweig (ohne mein Passwort 2mal eingeben zu müssen).

Gibts hierfür eventuell eine geeignetere Lösung in C?

Die Anwendung dient dem reinen Lerneffekt!
 
Themenstarter #3
Wie sieht denn deine doas.conf aus? Hast Du dort ein ``persist'' stehen?

Code:
permit keepenv persist :wheel

https://man.openbsd.org/doas.conf#persist
Nein, war auch nicht geplant.

/etc/doas.conf
Code:
# So sieht die config innerhalb meiner !Test-VM aus
permit :wheel
permit nopass keepenv root
Mir geht es hier um keine Lösung außerhalb die zum gleichen Effekt führt, ich möchte den doppel-Befehl wirklich innerhalb von execl, execlp, execle, execv, execvp, execvpe ausführen, ohne doas 2mal aufzurufen, quasi wie im Codebeispiel mit system(). Ein execl() mit anschließendem /pfad/zu/einem/script.sh ist auch keine Option
 
Themenstarter #5
Neuer exec => neuer doas/auth.
"-c" "whoami; whoami"
;-)
Ich bin mir nicht sicher ob du das gemeint hast, was ich wissen wollte, aber es brachte mich aufjedenfall zur Lösung :) (einen 2. Aufruf von doas wollte ich vermeiden)

Code:
# So gehts:
execl("/usr/bin/doas", "doas", "/bin/sh", "-c", "/usr/bin/whoami; /usr/bin/whoami", NULL);

# So gehts natürlich nicht (ich depp):
execl("/usr/bin/doas", "doas", "/bin/sh", "-c", "'/usr/bin/whoami; /usr/bin/whoami'", NULL); # man beachte die unnötig gesetzten -> ' <-
 
Themenstarter #7
Die Lösung hattest du bereits, nur eben im system()-Aufruf ;-)
So?:
Code:
execl("/usr/bin/doas /bin/sh -c '/usr/bin/whoami; /usr/bin/whoami'", "doas", NULL);
Was hat dich daran gehindert, genau dies beim execl()-Aufruf wiederzuverwenden?
Geht bei mir nicht, könntest du bitte die Zeile fix schreiben, würde mich eventuell im Verständnis weiterbringen?


EDIT: Achso, du meinstest "doas sh -c 'whoami; whoami' ? Dass man das so executed wusste ich, blos der Syntax für execl() war mir nicht klar (mein Chef hat recht, ich kann mich wirklich nicht gut ausdrücken :ugly:)
 
#10
Genau.

@mogbo:
Code:
system("/usr/bin/doas /bin/sh -c '/usr/bin/whoami; /usr/bin/whoami'");
Dieser Aufruf übergibt einfach alles, was zwischen "" steht an die Shell.
Wichtig ist hier das doppelte whoami in Anführungszeichen zu schreiben - du hast dich für einfache entschieden, doppelte gehen aber auch.
Der Sinn dahinter ist, dass -c nur ein Argument erwartet: die gesamte auszuführende Kommandozeile.

Dein erster execl()-Aufruf sah so aus:
Code:
execl("/usr/bin/doas", "doas", "/bin/sh", "-c", "/usr/bin/whoami", NULL);
Also musst du das 5. Argument eben mit dem selben Sinn erfüllen, wie beim system()-Aufruf:
Und der ist: "/usr/bin/whoami; /usr/bin/whoami".

Du darfst hier nicht nochmals quoten, weil dieser String bereits als ein Argument zu -c behandelt wird.
Ganz einfach deshalb, weil beim execl()-Aufruf die Parameterliste nicht durch Leerzeichen/Whitespaces sondern durch die Syntax als solche getrennt wird.

Wenn du nun "'/usr/bin/whoami; /usr/bin/whoami'" übergibst, wird nach dem Kommando /usr/bin/whoami; /usr/bin/whoami gesucht, das nicht existiert.

Hier das ebenso nicht funktionierende Äquivalent für einem system()-Aufruf:
Code:
system("/usr/bin/doas /bin/sh -c \"'/usr/bin/whoami; /usr/bin/whoami'\"");
Rob
 
Themenstarter #11
Wenn du nun "'/usr/bin/whoami; /usr/bin/whoami'" übergibst, wird nach dem Kommando /usr/bin/whoami; /usr/bin/whoami gesucht, das nicht existiert.
Vielen Dank, hier habe ich die Ausgabe des Systems nicht ganz verstanden, was jedoch mit deiner Erklärung deutlich wird!

Ich denke ich bin mit meinem Verständnis wiedermal eine ganze Ecke weiter gekommen. Auch wenns nach wenig aussieht, erklärt das für mich ein paar Probleme die ich schon länger vor mir herschiebe