Ich versuche, einen Linux-Befehl in einem c-Programm mit dem Systemsystemaufruf auszuführen, aber ich möchte nicht, dass die Ausgabe oder die Fehlerprotokolle auf dem Terminal ausgegeben werden. Was soll ich machen? Gibt es eine andere Möglichkeit, dies zu tun?
Führen Sie einen Linux-Befehl im c-Programm aus
Farbton
Nr
Da der system()-Aufruf eine Shell verwendet, um den Befehl auszuführen, können Sie stdout und stderr nach /dev/null umleiten, z
system("ls -lh >/dev/null 2>&1");
-
+1, Hinzufügen der zusätzlichen
);
ist eine Übung für den Leser 🙂– Tim Post
21. Januar 2011 um 22:23 Uhr
-
Brauchen wir eine Überschrift?
– Shravya Boggarapu
14. Juni 2018 um 13:44 Uhr
TantrajJa
Popen ist eine andere Möglichkeit, wie Sie dasselbe tun können:
void get_popen() {
FILE *pf;
char command[20];
char data[512];
// Execute a process listing
sprintf(command, "ps aux wwwf");
// Setup our pipe for reading and execute our command.
pf = popen(command,"r");
// Error handling
// Get the data from the process execution
fgets(data, 512 , pf);
// the data is now in 'data'
if (pclose(pf) != 0)
fprintf(stderr," Error: Failed to close command stream \n");
return;
}
-
Im Gegensatz zu anderen Antworten ermöglicht diese auch, die Ausgabe des Programms abzurufen.
– Alexander Rev
16. Juni 2017 um 12:33 Uhr
Code zeigen.
Versuchen Sie zum Beispiel:
system(“ls”);
Das system()
und popen()
Aufrufe starten eine Shell und übergeben ihre Argumente an diese, wodurch Sicherheitslücken entstehen. Wenn nicht alle Teile der Argumente, die aus Benutzereingaben stammen, gemäß den Zitier- und Escape-Regeln der Shell korrekt bereinigt wurden, kann ein Angreifer wahrscheinlich beliebige Befehle auf dem System ausführen.
Verwenden Sie stattdessen die exec
Familie der Befehle. Diese starten den Befehl direkt, ohne eine Shell zu starten. Möglicherweise müssen Sie die Eingabe trotzdem bereinigen, aber nur, um zu begrenzen, was an den Befehl selbst übergeben werden kann.
Beispiel aus der SEI CERT C Kodierungsstandard:
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <errno.h>
#include <stdlib.h>
void func(char *input) {
pid_t pid;
int status;
pid_t ret;
char *const args[3] = {"any_exe", input, NULL};
char **env;
extern char **environ;
/* ... Sanitize arguments ... */
pid = fork();
if (pid == -1) {
/* Handle error */
} else if (pid != 0) {
while ((ret = waitpid(pid, &status, 0)) == -1) {
if (errno != EINTR) {
/* Handle error */
break;
}
}
if ((ret == 0) ||
!(WIFEXITED(status) && !WEXITSTATUS(status))) {
/* Report unexpected child status */
}
} else {
/* ... Initialize env as a sanitized copy of environ ... */
if (execve("/usr/bin/any_cmd", args, env) == -1) {
/* Handle error */
_Exit(127);
}
}
}