2013-08-07 3 views
5

Я пытаюсь настроить свой компьютер таким образом, чтобы я мог аутентифицироваться самостоятельно, используя внешнее устройство, подключенное к скрипту python. Я начал с замены программы login на inittab моей собственной программой, и мне удалось попасть в оболочку bash. Проблема в том, что она не получает свежей среды, такой как тот, который (я полагаю) дал с login. Я знаю, что есть способы, чтобы я мог возиться с окружающей средой, но я не видел способа дать ей конфигурацию по умолчанию, если даже такая вещь имеет смысл.Как я могу назвать bash из C чистой средой?

+4

Вы просмотрели источник для 'login'? Это первое место, которое я бы посмотрел. Вероятно, существует довольно много вещей, которые должна выполнить программа «login», которую вы не сможете угадать. –

+4

Кроме того, вы можете написать документ ['pam' module] (https://en.wikipedia.org/wiki/Pluggable_authentication_module) вместо того, чтобы полностью заменить программу login. –

+0

@GregHewgill Я думал об этом, но я не мог найти для него источник. Я даже не знаю, с чего начать смотреть –

ответ

1

Некоторые идеи:

Прежде всего, это было бы лучше в большинстве случаев использовать подключаемую Логин архитектуры PAM. Это гарантирует, что все приложения и службы с поддержкой PAM могут использовать метод аутентификации (например, ssh) и что нет возможности обойти его с помощью обычных служб.

Если вы действительно хотите заменить login я хотел бы предложить, чтобы очистить окружающую среду от себя, используя unsetenv для каждой переменной окружения набора (вы можете использовать environ для определения переменных уже установленных). После очистки среды вы можете использовать вызов exec, чтобы заменить вашу программу bash, в этом контексте среда не изменится. Вы можете добавить аргумент командной строки -l, чтобы запустить bash так, как если бы он был вызван login.

Bash запускает некоторые скрипты инициализации при запуске. Вы можете проверить /etc/profile, /etc/bashrc и аналогичные файлы для переменных среды, которые вы не хотите устанавливать.

Если вы хотите зависеть от env (это не так уж плохо, поскольку оно должно присутствовать в каждой системе Linux), вы можете использовать env -i bash для вызова bash в чистой среде.

0

Когда main (int argc, char * argv [], char * envp []) вызывается операционной системой, третий параметр содержит среду. Поэтому просто сохраните его копию, пока вам не понадобится называть bash.

+0

Я не хочу сохранять окружающую среду, я хочу ее уничтожить. –