Выполнение двух команд с использованием переменных среды C и Linux - PullRequest
1 голос
/ 22 сентября 2019

Я пытаюсь запустить две команды, используя программу на языке C и переменную среды Linux:

#Program name is execute
#include <stdio.h>
#include <stdlib.h>
#include <string.h>


int main(int argc, char *argv[])
{

  char cmd[256] = "/home/username/hello.sh $USER";
  execl("/bin/bash", "bash", "-p", "-c", cmd, NULL); 

  return 0;
}

Однако при запуске программы с переменной среды $ USER, для которой установлена ​​вторая команда, втораякоманда не запустится.

env USER=";cat /home/username/hello.txt" ./execute
Hello from shell script

Жесткое кодирование второй команды в программу на C работает:

char cmd[256] = "/home/username/hello.sh ;cat /home/username/hello.txt";

./execute
Hello from shell script
Hello from text file

Я хочу, чтобы моя программа на C возвращала:

env USER=";cat /home/username/hello.txt" ./execute
Hello from shell script
Hello from text file

Как мне заставить его работать, не меняя программу на С?

1 Ответ

1 голос
/ 22 сентября 2019

Единственная обработка, выполняемая в результате расширения переменных, - это разбиение по словам и глобализация.Он не обрабатывает такие символы, как ; для разделения команд, > для перенаправления вывода, $ для дальнейшего расширения переменных и т. Д.

Если вы хотите выполнить полный анализ команды, выдолжны использовать eval.

  char cmd[256] = "eval /home/username/hello.sh $USER";
  execl("/bin/bash", "bash", "-p", "-c", cmd, (char*)NULL); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...