Что такое точно переменная среды?

Выписка из программ UID набора и уязвимостей:

– Вспомните, что система () вызывает/bin/sh сначала. В Fedora это execv/bin/sh с аргументами "sh", "-c" и пользователем обеспечил строку.

– В Fedora,/bin/sh (на самом деле удар) игнорирует опцию бита UID набора. Поэтому, когда invok-система луга (cmd) в программе UID набора, cmd не будет выполняться с полномочием пользователя root, если сам cmd не будет программой UID набора. Следующий код в ударе отбрасывает бит UID набора. На самом деле я не могу думать ни о какой законной причине, почему мы должны позволить программную оболочку UID набора. Fedora делает правильную вещь; много других Ose Unix не сделали этого.

Согласно этому 1.out не установлен, uid и a.out отбрасывают полномочия прежде, чем выполнить его.

42
18.09.2013, 21:32
5 ответов

Среда не является столь волшебной, как это могло бы казаться. Оболочка хранит его в памяти и передает execve() системный вызов. Дочерний процесс наследовал его как названный указатель массива environ. От execve страница справочника:

РЕЗЮМЕ

   #include <unistd.h>

   int execve(const char *filename, char *const argv[],
              char *const envp[]);

argv массив строк аргумента, переданных новой программе.
Условно, первая из этих строк должна содержать имя файла, связанное с выполняемым файлом. envp массив строк, традиционно формы key=value, которые передаются как среда новой программе.

environ(7) страница справочника также предлагает некоторое понимание:

РЕЗЮМЕ

   extern char **environ;

ОПИСАНИЕ

Переменная environ точки к массиву указателей на строки назвали "среду". Последний указатель в этом массиве имеет значение NULL. (Эта переменная должна быть объявлена в пользовательской программе, но объявляется в заголовочном файле <unistd.h> в случае, если заголовочные файлы прибыли из libc4 или libc5, и в случае, если они произошли из glibc, и _GNU_SOURCE был определен.) Этот массив строк сделан доступным для процесса должностным лицом (3) вызов, который запустил процесс.

Обе из этих страниц справочника GNU соответствуют спецификации POSIX

29
27.01.2020, 19:35
  • 1
    +1, вероятно, стоит отметить что некоторые члены exec(3) семейство (т.е. те, которые не соответствуют exec*v) передача **, окружает под покрытиями. –  msw 18.09.2013, 23:50
  • 2
    Обратите внимание, что это не о дочерних процессах (дочерние процессы наследовали всю память своего родителя), но выполненные программы (в том же процессе), таким образом, это - другой способ передать данные через execve () системный вызов (который иначе вытирает память процесса). –  Stéphane Chazelas 20.09.2013, 23:00
  • 3
    @msw: это exec*e варианты, которые явно передают ENV, вместо того, чтобы неявно использовать environ глобальная переменная. v означает "вектор" и относится к параметрам командной строки, переданным как массив (а не "список" (функция переменной длины)) execve системный вызов и все другие exec* функции являются libc обертками для него. –  Peter Cordes 19.04.2015, 17:38

У Вас есть он просто немного неправильное: SOME_NAME=value создает переменную оболочки (в большинстве оболочек). export SOME_NAME=value создает переменную среды. Для лучше для для худшего, большая часть Unix/Linux / *BSD оболочки использует идентичный синтаксис в доступе к переменным среды и окружает переменные.

В некотором большем смысле "среда" является просто информацией, которая соглашается с выполнением программы. В программах C Вы могли бы найти идентификатор процесса с a getpid() звоните в программной оболочке, Вы использовали бы переменный доступ: $$. Идентификатор процесса является просто частью среды программы. Я полагаю, что термин "среда" прибывает из некоторых более теоретических тем информатики, как моделирование выполнения программы.. Модели выполнения программы имеют среду, "которая содержит ассоциации между переменными и их значениями".

И это последнее, более сильное определение - то, что "среда" для Unix/Linux / *BSD оболочки: ассоциация между именами ("переменные") и их значения. Для большинства оболочек стиля Unix значения являются всеми символьными строками, хотя это не так строго верно, как это раньше было. Ksh, Zsh и Bash у всех есть переменные определенного типа в эти дни. Даже оболочка функциональные определения может быть экспортирована.

Использование среды, отдельной от простых переменных оболочки, включает fork/exec метод запуска нового процесса, который используют все Unixes. Когда Вы export пара имя/значение, та пара имя/значение будет присутствовать в среде новых исполняемых файлов, запущенных оболочкой с execve(2) системный вызов (обычно после a fork(2), кроме тех случаев, когда exec команда оболочки использовалась).

После execve(), main() функция нового двоичного файла имеет свои параметры командной строки, среда (сохраненный как ЗАВЕРШЕННЫЙ ПУСТЫМ УКАЗАТЕЛЕМ массив указателей на var=value строки, посмотрите environ(7) страница справочника). Другое состояние это наследовано, включает ulimit настройки, текущий рабочий каталог и любые открытые дескрипторы файлов, что execve() у вызывающей стороны не было набора FD_CLOEXEC для. Текущее состояние tty (эхо включило, режим без предварительной обработки, и т.д.) можно было также считать частью режима выполнения, наследованного недавно -execпроцесс редактора.

Посмотрите bash описание руководства среды выполнения для простых команд (кроме встроенного или функций оболочки).

Среда Unix отличается по крайней мере от некоторых других операционных систем: VMS "lexicals" мог быть изменен дочерним процессом, и то изменение было видимо в родителе. VMS cd в дочернем процессе влиял бы на рабочий каталог родителя. По крайней мере, при некоторых обстоятельствах и моей памяти может приводить меня к сбою.

Некоторые переменные среды известны, $HOME, $PATH, $LD_LIBRARY_PATH и другие. Некоторые являются стандартными к данной системе программирования, так, чтобы родительская оболочка могла передать партии и большую информацию специального назначения к некоторой программе, как определенный временный каталог, или идентификатор пользователя и пароль, которые не обнаруживаются в ps -ef. Простые программы CGI наследовали большую информацию от веб-сервера через переменные среды, например.

19
27.01.2020, 19:35
  • 1
    Это, казалось бы, было бы немного более сложным все еще. В ударе, по крайней мере, SOME_NAME=value command установит переменную среды SOME_NAME для того вызова команды. Смутно, это, кажется, не устанавливает переменную оболочки того же имени. –  Samuel Edwin Ward 18.09.2013, 22:54
  • 2
    Чтобы быть более точными, переменные среды не наследованы, а скорее явно переданы от оболочки до программ, которые она порождает. –  msw 18.09.2013, 23:44
  • 3
    @SamuelEdwinWard причина, что Ваш SOME_NAME=value command ведет себя вопреки Вашему ожиданию, то, что это - специальный синтаксис, означающий, "добавьте, что SOME_NAME к среде передал команде, но иначе не изменяйте переменные этой оболочки". –  msw 18.09.2013, 23:46
  • 4
    Захватывающий, ссылка на исчисление/функциональное программирование лямбды. Это - интересное соединение, которое имеет большой смысл. –  Matt 19.09.2013, 01:59
  • 5
    Часть этого является не совсем правильной. Например, подоболочки являются подпроцессами и должны быть fork()редактор, но они действительно получают (копии) переменные оболочки. –  ruakh 19.09.2013, 08:53

Переменные среды в их самой сырой форме являются просто рядом пар имя/значение. Как описано в странице справочника удара (man 1 bash) под разделом ENVIRONMENT:

   When  a  program  is invoked it is given an array of strings called the
   environment.   This  is  a  list  of  name-value  pairs,  of  the  form
   name=value.

   The  shell  provides  several  ways  to manipulate the environment.  On
   invocation, the shell scans its own environment and creates a parameter
   for  each name found, automatically marking it for export to child pro-
   cesses.  Executed commands inherit the  environment.

На практике это позволяет Вам определять поведение, которое совместно используется или уникально для программ, вызванных от существующей оболочки. Например, при использовании crontab или visudo можно определить EDITOR переменная среды для определения другого редактора кроме того система использовала бы по умолчанию. То же может сохраняться для вещей как man команда, которая смотрит на Ваш PAGER среда для разработки то, с чем программа пейджера должна использоваться для отображения вывода страницы справочника.

Довольно много команд Unix читает среду и в зависимости от того, что установлено, там изменяют их вывод/обработку/действие в зависимости от них. Некоторые совместно используются, некоторые уникальны для программы. Большинство страниц справочника содержит информацию о том, как переменная среды имеет эффект на описанную программу.

Другие практические иллюстрации для вещей, таких как системы с несколькими установками Oracle на той же платформе. Путем установки ORACLE_HOME, целый комплект команд оракула (как загружено из Вашего PATH переменная среды), затем вытягивают настройки, определения, отображения и библиотеки из-под того высокоуровневого каталога. То же сохраняется для других программ, таких как Java с, он JAVA_HOME переменная среды.

сам удар имеет много переменных среды, которые могут изменить поведение диапазона вещей из истории (HISTSIZE, HISTFILE и т.д.), размер экрана (COLUMNS), заполнение клавишей Tab (FIGNORE,GLOBIGNORE) локаль и кодировка символов / декодирующий (LANG, LC_*), подсказка (PS1 .. PS4), и т.д (снова ищут знание из страницы справочника удара).

Также можно записать сценарии/программы, которые используют собственные переменные среды (для передачи настроек или функциональности изменения).

7
27.01.2020, 19:35

"Переменные среды" являются рядом динамических именованных значений, которые могут влиять на способ, которым процессы выполнения будут вести себя на компьютере.

Они - часть операционной среды, в которой работает процесс. Например, рабочий процесс может запросить значение ВРЕМЕННОЙ переменной среды, чтобы обнаружить, что подходящее местоположение хранит временные файлы или переменную ДОМАШНЕГО или ПРОФИЛЯ ПОЛЬЗОВАТЕЛЯ для нахождения структуры каталогов принадлежавшей пользователю, выполняющему процесс.

Больше информации здесь &rightarrow; http://en.wikipedia.org/wiki/Environment_variable.

Все Вы хотите знать о Переменных среды... &uparrow;

0
27.01.2020, 19:35
  • 1
    Хотя маловероятно, что это связывается, уходит, лучше ответить на вопрос здесь с соответствующим текстом и предоставить ссылку как дополнение для резервной информации. –  Anthon 19.09.2013, 10:22
  • 2
    @Anthon я действительно верю Вам, корректен, и я внесу изменения, как только я могу... Спасибо за советование... –  SoCalDiegoRob 19.09.2013, 11:37

Для этого ответа требуется некоторый опыт написания сценариев оболочки и знание терминов переменная, значение, подстановка переменных, приглашение, эхо, ядро, оболочка, утилита, сеанс и процесс.

Переменная среды (envar )представляет собой набор глобальных определенных переменных, которые могут влиять на то, как данные процессы будут вести себя в операционной системе компьютера.

1. Примерное введение:

Мы заменяем envars $и заглавными буквами . Например:$PS1.

Таким образом мы можем напечатать envar:

echo $PS1

$PS1содержит значение приглашения Unix. Скажем, его родные значения\u\w$.

  • \uозначает (текущий )пользователь,
  • \wозначает рабочий каталог,
  • $должен граничить с подсказкой.

Итак, если мы выполним :echo $PS1, мы увидим значения \u, \wплюс знак доллара в конце.

Мы могли бы изменить поведение Unix в этом контексте, если бы мы изменили значения этого envar. Например:

PS1="\w >"

Теперь подсказка выглядит следующим образом (при условии, что рабочий каталог называется "John"):

John >

Таким же образом мы могли бы сделать PS1="Hello, I'm your prompt >", поэтому echo $PS1принесет:

Hello, I'm your prompt >

В Bash 4.x.x мы можем распечатать ВСЕ переменные в системе с помощью команды env. Я предлагаю выполнить envв терминале и посмотреть на вывод.

2. Как эти данные отображаются и обрабатываются:

Терминал сеанса позволяет нам настраивать envars, поставляемые с Bash.

Вышеупомянутые изменения обычно носят временный характер, и вот почему:

Каждый сеанс (, который не является под-сеансом ), уникален, и одновременно могут выполняться несколько процессов (, каждый со своим собственным набором переменных ), но обычно является наследованием от сеанса 0 до сеанса 1 и выше.

Изменения, которые мы вносим в один процесс, уникальны для него и исчезнут, если мы закроем его, не сохранив их каким-либо образом.

Итак, как мы можем сохранить эти изменения:

Существует несколько способов хранения изменений envar, в зависимости от выбранной области. Вот разные области (уровней )для таких изменений:

  • Уровень процесса :Envars доступны только для программ в текущем сеансе.
  • Уровень экспорта :Envar доступны для программ в текущем сеансе или во всех его под-сеансах.
  • Глобальный уровень :Изменения будут сохранены для всех сеансов, (основных и всех подчиненных ).

Где хранятся данные envar:

Unix состоит из трех основных слоев. :Ядро, оболочка и утилиты. Насколько я знаю, каждая оболочка имеет свои собственные envars, и они создаются в основном или исключительно в оболочке.

Конкретное место для их глобального изменения обычно /etc/profile, хотя мы также можем сделать это в .bashrc, конечно.

3. Создание новых envars:

Мы можем создавать новые envars, и вот способ; начиная с Bash 4.x.x нет собственного энавара с именем MESSAGE(, как было сказано, энвары обычно пишутся в верхнем регистре ).

MESSAGE="Hello world!"

создаст его для нас, и теперь, если мы наберем echo $MESSAGE, мы получим hello world!.

Если мы выполним bashв нашем текущем рабочем сеансе (окно ), мы запустим новый сеанс bash sub -и больше не будем работать в исходном процессе, если мы не выполним exit.

Примечание :В операционных системах с эмулятором терминала (, таким как рабочий стол Ubuntu ), дополнительный сеанс -обычно выполняется в том же окне, но новый сеанс в другом окне не является дополнительным -сеанс существующего (это смежный процесс ).

Примечание. :Не используйте специальные знаки в значениях envar, например ! или они не будут сохранены.

Экспорт envar из исходного сеанса во все подчиненные -сеансы:

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

Перейти к исходному сеансу (в текущем или другом окне )и выполнить:

export MESSAGE

при экспорте не используйте знак $.

Теперь он экспортируется во все подсеансы -. Если вы сделаете echo $MESSAGEв подсеансе -, будь то от вашего пользователя или другого, он будет распечатан.

Обратите внимание, что внутренние переменные оболочки, такие как PS1, не следует экспортировать, но если вы хотите экспортировать их по какой-либо причине и они не отображаются, не выполняйте bashпосле export, а bash –norc.

4. Переменная переменной $PATH:

$PATH— это envar, который пользователи обычно меняют чаще всего.

Если мы echo $PATH, мы увидим этот поток:

/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games

Печатные значения этого envar разделены двоеточием (:)там, но здесь потенциально более удобный способ (это те же те же значения):

/usr/local/bin
/usr/bin
/bin
/usr/local/games
/usr/games

Это каталоги для поиска при запуске утилиты.

Выполнив which echo, мы получим местоположение файла -, например, мы можем увидеть, что он существует в /bin/echo.

Исходя из этого, нам не нужно вводить echo envar для просмотра значений evnar. Мы также можем сделать:

/bin/echo $ENVAR

Envar все равно будет выполняться, например:

/bin/echo $HOME

Дает нам

/home/User || /root

Так же, как:

echo $HOME

Дает нам

/home/User || /root

Примечание:$HOMEсокращено до ~.

Система -Отношения $PATH,и возможное взаимодействие с пользователем:

В Bash 4.x.x, когда мы используем утилиту без полного пути, система будет использовать все 6 значений, упомянутых выше, из $PATHenvar. Таким образом, он начнется с /user/local/binи будет следовать всему своему содержимому в поисках исполняемого файла echo.

В этом случае он остановится на /bin/echo, в котором в данном случае находится исполняемый файл.

Следовательно, основная причина, по которой мы можем настроить envar $PATH, заключается в установке исполняемых файлов, которые не находятся ни под одним из его собственных значений.

После установки таких исполняемых файлов мы должны установить их значение $PATHсоответствующим образом, и тогда мы сможем с ними работать.

5. Приложение -расширяющееся$PATH:

Таким образом мы можем export $PATHзапускать под-сеансы (, которые включают расширения bash, такие как WP -CLI для WordPress или Drush для Drupal ):

export PATH="/home/John:$PATH"

Это добавит новое значение /home/Johnк $PATH, а затем сразу же присоединит к нему все собственные значения (сразу после двоеточия ), которые хранятся в соответствии с синтаксисом $PATH.

Такое постоянное изменение можно сделать в соответствующем скрипте, обычно под /etc/profileи под именем .bashrc.

-1
27.01.2020, 19:35

Теги

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