Führen Sie einen Linux-Befehl im c-Programm aus

Lesezeit: 2 Minuten

Benutzer-Avatar
Farbton

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?

Benutzer-Avatar
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

Benutzer-Avatar
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);
    }
  }
}

1330490cookie-checkFühren Sie einen Linux-Befehl im c-Programm aus

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy