execve (2) системные команды выходят перед выполнением - PullRequest
0 голосов
/ 14 мая 2019

Я пытаюсь реализовать контейнер, и для этого я создаю процесс, используя системный вызов clone (2) с соответствующими флагами:

  if ((child_pid = clone(child_main, process_struct.Stack + process_struct.StackPtr,
   CLONE_NEWCGROUP
  |CLONE_NEWIPC
  |CLONE_NEWNET
  |CLONE_NEWNS
  |CLONE_NEWPID
  |CLONE_NEWUTS
  |SIGCHLD, &process_struct, checkpoint)) == -1){
     fprintf(stderr,"Failed...%m \n");
    exit(EXIT_FAILURE);

  }else{
    fprintf(stderr,"Done\n");
    waitpid(child_pid, NULL, 0);
  }

внутри child_main (). Я изменяю имя хоста дляпространство имен процесса, также я установил пространство имен монтирования, я установил иерархию файловой системы Linux на раздел, как при обычной установке Linux (я сделал это, чтобы создать чистый образ файловой системы, очищенный от моих файлов и двоичных файлов), а затем я установил распространениевведите MS_UNBINDABLE, затем я pivot_root (2), чтобы изменить корневой каталог моего процесса.

const int child_main(struct process *process_struct, int *checkpoint){

  char c;
  fprintf(stderr,"=> IPC setup...");
  //double check the IPC
  close(checkpoint[1]);
  fprintf(stderr,"Done\n");

  if ( sethostname(process_struct->Hostname, 
strlen(process_struct->Hostname)) || mounting(process_struct)){
    return -1;
  }

  // startup the IPC pipes
  read(checkpoint[0], &c, 1);

  if(execve("/bin/bash", (char*)0, NULL) == -1 ){
    fprintf(stderr,"--> Launching process Failed %m\n");
    return -1;
  }
    return 0;

}

Проблема состоит в том, что моя система переходит через execve (2) и не запускает / bin / bash ипрограмма течет без ошибок.Когда я добавляю оператор system (2) перед execve (2): system("ls");, он перечисляет соответствующую файловую систему и текущий рабочий каталог.Также, когда я изменяю параметры execve (2) на: execve("/bin/ls", (char*)0, NULL) или execve("/bin/pstree", (char*)0, NULL) или любой другой параметр, он возвращает ошибку: Нет такого файла или каталога или A NULL argv [0] был передан через системный вызов exec , также когда я связываю свою программу с системным вызовом execve (2), он дает: NULL, 0, NULL) = 17992

Ошибка не имеет ничего общего с образом файловой системы, я выполнил больше тестов и, как следствие, я использовал для моих имен монтирования пространства файловой системы моей системы, а не той, которую я установил в разделе, и запуск / bin / bash по-прежнему не выполняетсяЯ создал простую C-программу и скомпилировал ее, и она работала нормально, поэтому есть что-то не так, что препятствует выполнению bin / bash, для дальнейшей проверки этих результатов я повторно использовал для своих пространств имен монтирования файловую систему из моей, которую я переместил так жеисполняемый файл для файловой системы сначала под "/" и второй по тому же пути мой основной системный путь к исполняемому файлу = /home/omar/docs/test.out моя смонтированная файловая система изпуть к разделу к исполняемому файлу = /home/omar/docs/test.out, так как я хотел проверить, не мог ли тот же путь вызвать путаницу при добавлении к каждому исполняемому файлу комментария, чтобы можно было определить, какой путь выбрала моя программа, и он работал нормально без каких-либопроблема и правильно, как и ожидалось, поэтому проблема только в том, что основные системные команды не будут работать.

1 Ответ

0 голосов
/ 15 мая 2019

Вам необходимо передать правильный argv массив в execve. И если вы просто хотите передать текущую среду, используйте execv вместо execve.

char *argv[] = {"bash", NULL};
if(execv("/bin/bash", argv) == -1 ){
    perror("execv");
    return -1;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...