Среда другого пользователя в дочернем процессе

Вы ищете nmap.

# nmap -sP 10.1.150.1-10
Starting Nmap 5.00 ( http://nmap.org ) at 2012-01-04 00:02 CET
Host foo.example.com (10.1.150.2) is up (0.00066s latency).
Host bar.example.com (10.1.150.7) is up (0.00066s latency).
Nmap done: 10 IP addresses (1 host up) scanned in 1.41 seconds

3
03.04.2013, 02:02
4 ответа

Каждый процесс имеет свою собственную среду, скопированную с родителя. Если родитель является оболочкой, существует понятие экспортных переменных, которое нужно рассмотреть, но это не применяется, когда Вы имеете дело с exec() и т.д. непосредственно. LOGNAME переменная обычно устанавливается оболочкой входа в систему, Вы просто видите оставшееся значение, которое не было сброшено. Так, Вы видите дочернюю среду. В некоторых системах Вы не можете легко получить доступ к родителю (или другой процесс) среда, на Linux можно сделать это легко (подвергающийся полномочиям) через /proc)

Можно, вероятно, воспроизвести эффект, который Вы видите путем попытки обоих su и su -, последний инициализирует среду входа в систему оболочки, которая (почти наверняка) сбросит LOGNAME среди других вещей первый оставит это нетронутым.

Используя env команда является одним способом получить чистую среду при запуске нового процесса с командной строки, необходимо проверить execle() документация относительно Вашей системы, чтобы видеть, как сделать что-то подобное.

3
27.01.2020, 21:17

Можно просто проверить пользовательское использование ENV:

su -l user_name  -c "run_programm && env"

Или можно проверить env из дочернего процесса при помощи он - pid,

предположите, что Ваш pid дочернего процесса 24112 , затем просто проверьте env использование:

cat /proc/24112/environ
1
27.01.2020, 21:17
  • 1
    мне было нужно программно (Unix/C) и характерный для всех платформ Unix. –  Balu T 03.04.2013, 11:38
  • 2
    @BaluT, можно использовать execl("su", "-l", "user_name", "-c", "program"); в Вашем коде. –  Alexis Wilke 29.07.2015, 10:03

Некоторые биты информации:

  • Можно использовать execle или execve предоставлять переменные среды ребенку. Можно использовать это и для подавления переменных среды от родительского процесса, которые больше не подходят для ребенка, и предоставлять дополнительные переменные ребенку.
  • Можно запустить “оболочку входа в систему” для ребенка, например, использования bash -l. Это заполнит среду что касается ребенка. Для многих оболочек (включая удар), предварительно ожидая дефис к названию двоичного файла, т.е. передача -bash как argv[0], имеет тот же эффект. Основной эффект этого различия состоит в том, что оболочка входа в систему выполнится /etc/profile и/или другие сценарии оболочки профиля, которые в свою очередь определяют большой номер переменных среды.
  • Для сервисов, которые используют PAM для аутентификации и инициализации сессии, pam_env модуль будет заботиться о надлежащей инициализации среды. Можно взглянуть на это и его конфигурацию, или чтобы использовать его или подражать его поведению.
1
27.01.2020, 21:17

Каждый процесс имеет ряд переменных среды (который может быть установлен в оболочке export SOMEVAR=value и так). Они наследованы как есть дочерними процессами. Если Вы хотите сбросить их, использовать extern char **environ; достигать переданную среду (см. environ(7)), и затем используйте execle(3) или execve(3) передача новой среды выстраивает со скопированными значениями переменных. Некоторое руководство на том, что и то, как действительно делают это, дано David Wheeler в его "Безопасном ПРАКТИЧЕСКОМ РУКОВОДСТВЕ программирования Unix/Linux"

0
27.01.2020, 21:17
  • 1
    Когда родительский процесс работает как корень, окружение установлено базироваться среда. затем, когда ветвления родительского процесса, дочерний процесс имеет то же, окружают (как использовался корнем) даже при том, что эффективные uid/gid изменяются для дочернего процесса. Таким образом, мой Вопрос состоит в том, как получить доступ к окружению дочернего процесса, работающего как другой uid/gid? –  Balu T 03.04.2013, 11:40

Теги

Похожие вопросы