Benutzerdefinierten String ausführen - wie am besten?
-
Hi,
mein Programm erhält (optional) vom Benutzer einen String den es unter gewissen Bedingungen ausführen soll, jetzt stelle ich mir die Frage welche Funktion(en) ich da am besten verwenden soll.
Ein system("/usr/bin/env bash -c '<user-string>'"); wäre ziemlich flexibel, oder alternativ mit /bin/sh, aber andererseits könnte der Benutzer auch einfach ein Skript in der Sprache seiner Wahl schreiben und dann einfach den Pfad für dieses angeben und ich könnte direkt system("<user-string>"); ausführen.
Und dann gibt es ja noch die exec-Familie.Zu was würdet ihr mir raten?
-
ich als user würde bestimmt die ausführbare datei bevorzugen.
-
volkard schrieb:
ich als user würde bestimmt die ausführbare datei bevorzugen.
Die ist für mich auch am leichtesten zu implementieren, sonst muss ich auch erst mühsam sicherstellen, dass der Benutzerstring richtig escaped ist und außerdem mache ich mich unnötig von installierten Anwendungen abhängig.
-
gelöscht
-
Linux-Progger schrieb:
volkard schrieb:
ich als user würde bestimmt die ausführbare datei bevorzugen.
Die ist für mich auch am leichtesten zu implementieren, sonst muss ich auch erst mühsam sicherstellen, dass der Benutzerstring richtig escaped ist und außerdem mache ich mich unnötig von installierten Anwendungen abhängig.
Das ganze ist trotzdem sehr gefährlich. Schließlich könnte ich auch
rm * -r
eingeben und dein Programm würde es ausführen.
-
BBBB schrieb:
Linux-Progger schrieb:
volkard schrieb:
ich als user würde bestimmt die ausführbare datei bevorzugen.
Die ist für mich auch am leichtesten zu implementieren, sonst muss ich auch erst mühsam sicherstellen, dass der Benutzerstring richtig escaped ist und außerdem mache ich mich unnötig von installierten Anwendungen abhängig.
Das ganze ist trotzdem sehr gefährlich. Schließlich könnte ich auch
rm * -r
eingeben und dein Programm würde es ausführen.Tut mir nicht weh, höchstens dir.
-
Linux-Progger schrieb:
BBBB schrieb:
Linux-Progger schrieb:
volkard schrieb:
ich als user würde bestimmt die ausführbare datei bevorzugen.
Die ist für mich auch am leichtesten zu implementieren, sonst muss ich auch erst mühsam sicherstellen, dass der Benutzerstring richtig escaped ist und außerdem mache ich mich unnötig von installierten Anwendungen abhängig.
Das ganze ist trotzdem sehr gefährlich. Schließlich könnte ich auch
rm * -r
eingeben und dein Programm würde es ausführen.Tut mir nicht weh, höchstens dir.
bzw. du könntest auch einfach eine Shell öffnen und das machen, das Programm ist kein Systemdienst, sondern läuft mit den ganz normalen Benutzerrechten von dir.
-
Linux-Progger schrieb:
volkard schrieb:
ich als user würde bestimmt die ausführbare datei bevorzugen.
Die ist für mich auch am leichtesten zu implementieren, sonst muss ich auch erst mühsam sicherstellen, dass der Benutzerstring richtig escaped ist und außerdem mache ich mich unnötig von installierten Anwendungen abhängig.
das ist auf jeden Fall das Benutzerunfreundlichste. Man müsste erst mit which im terminal nachsehen, wo die ausführbare Datei überhaupt liegt.
Von daher ist system() oder fork+exec(/bin/sh -c) das bequemste - man könnte auch direkt bash-features einbauen.
Escapen musst du nur, wenn ein unbekannter String aus deinem Programm als Argument an das Benutzer-Programm übergeben wird. Das Escapen für POSIX-Shells geht allerdings ganz einfach mit replace().