Как передать переменные окружения, используя execle () для / bin / login? - PullRequest
0 голосов
/ 27 марта 2019

Это похоже на как установить переменную окружения, когда execle выполняет bash?

Я пытаюсь использовать execle () в C для выполнения / bin / login и передачи переменной окружения в целевую оболочку. И не может заставить его работать.

Я попытался передать среду, как описано на странице руководства, как завершенный массивом NULL строк VAR = VAL. Также я попробовал с putenv () перед звонком.

Например:

const char *env[] = { "MYVAR=myval", (char *)0 };
putenv("MYVAR=myval");
execle("/bin/login", "login", "-p", "-f", user, (char *)0, env);

После успешного входа в систему я ожидал увидеть MYVAR как переменную среды, но иметь только переменные, такие как USER, HOME, SHELL, PATH и т. Д.

Я попытался с помощью входа в BusyBox и с tinylogin ... тот же результат.

Любая помощь высоко ценится.

Ответы [ 2 ]

1 голос
/ 27 марта 2019

У меня работает.Вы уверены, что ваш execle() успешен?Например, в системах BSD (включая macOS) правильный путь - / usr / bin / login .Вы должны добавить fprintf(stderr, "execle() failed with errno %d\n", errno); после вызова execle().

Вы уверены, что команда BusyBox login в вашей системе поддерживает эти опции?

Также, пожалуйста, используйте NULL вместо (char *)0.

0 голосов
/ 28 марта 2019

Джонатан и Куртис, большое спасибо за вашу помощь и комментарии.

Я обнаружил, что нет проблем с env при использовании "-p" и когда пользовательская оболочка - / bin / sh. Но когда я попытался использовать «-p» и пользовательская оболочка была klish (утилита CLI), были некоторые ошибки в поиске некоторых .sh файлов.

Итак, я посмотрел на источники BusyBox и в su.c он выполняет clearenv (), если "-p" не используется.

Я исправил это, передав его и добавив вручную в env. Так как это не лучший способ сделать это, мне придется провести еще несколько исследований о моем клише.

Приветствие.

Еще раз спасибо.

...