войдите в систему и su внутренности

Это не ответ как таковой. Это - второстепенный вопрос о sed.

А именно, я должен был взять Gilles sed управляйте независимо, чтобы часть частью поняла это... Я начал писать некоторые записки на нем и затем думал, что это может быть полезно здесь для кого-то...

таким образом, здесь это... sed сценарий жабр в зарегистрированном формате:


#!/bin/bash
#######################################
sed_dat="$HOME/ztest.dat"
while IFS= read -r line ;do echo "$line" ;done <<'END_DAT' >"$sed_dat"
foo bar \
bash \
baz
dude \
happy
yabba dabba 
doo
END_DAT

#######################################
sedexec="$HOME/ztest.sed"
while IFS= read -r line ;do echo "$line" ;done <<'END-SED' >"$sedexec"; \
sed  -nf "$sedexec" "$sed_dat"

  s/\\$//        # If a line has trailing '\', remove the '\'
                 #    
  t'Hold-append' # branch: Branch conditionally to the label 'Hold-append'
                 #         The condition is that a replacement was made.
                 #         The current pattern-space had a trailing '\' which  
                 #         was replaced, so branch to 'Hold-apend' and append 
                 #         the now-truncated line to the hold-space
                 #
                 # This branching occurs for each (successive) such line. 
                 #
                 # PS. The 't' command may be so named because it means 'on true' 
                 #     (I'm not sure about this, but the shoe fits)  
                 #
                 # Note: Appending to the hold-space introduces a leading '\n'   
                 #       delimiter for each appended line
                 #  
                 #   eg. compare the hex dump of the follow 4 example commands:  
                 #       'x' swaps the hold and patten spaces
                 #
                 #       echo -n "a" |sed -ne         'p' |xxd -p  ## 61 
                 #       echo -n "a" |sed -ne     'H;x;p' |xxd -p  ## 0a61
                 #       echo -n "a" |sed -ne   'H;H;x;p' |xxd -p  ## 0a610a61
                 #       echo -n "a" |sed -ne 'H;H;H;x;p' |xxd -p  ## 0a610a610a61

   # No replacement was made above, so the current pattern-space
   #   (input line) has a "normal" ending.

   x             # Swap the pattern-space (the just-read "normal" line)
                 #   with the hold-space. The hold-space holds the accumulation
                 #   of appended  "stripped-of-backslah" lines

   G             # The pattern-space now holds zero to many "stripped-of-backslah" lines
                 #   each of which has a preceding '\n'
                 # The 'G' command Gets the Hold-space and appends it to 
                 #   the pattern-space. This append action introduces another
                 #   '\n' delimiter to the pattern space. 

   s/\n//g       # Remove all '\n' newlines from the pattern-space

   p             # Print the pattern-space

   s/.*//        # Now we need to remove all data from the pattern-space
                 # This is done as a means to remove data from the hold-space 
                 #  (there is no way to directly remove data from the hold-space)

   x             # Swap the no-data pattern space with the hold-space
                 # This leaves the hold-space re-initialized to empty...
                 # The current pattern-space will be overwritten by the next line-read

   b             # Everything is ready for the next line-read. It is time to make 
                 # an unconditional branch  the to end of process for this line
                 #  ie. skip any remaining logic, read the next line and start the process again.

  :'Hold-append' # The ':' (colon) indicates a label.. 
                 # A label is the target of the 2 branch commands, 'b' and 't'
                 # A label can be a single letter (it is often 'a')
                 # Note;  'b' can be used without a label as seen in the previous command 

    H            # Append the pattern to the hold buffer
                 # The pattern is prefixed with a '\n' before it is appended

END-SED
#######
10
17.07.2015, 01:33
3 ответа

Существует несколько частей к тому, что делают программы входа в систему. Программы входа в систему отличаются по тому, как они взаимодействуют с пользователем, который пытается войти в систему. Вот несколько примеров:

  • login: чтения вводятся на текстовом терминале
  • su: вызванный уже зарегистрированными пользователями, получает большинство данных из его параметров командной строки, плюс данные аутентификации (пароль) от терминала
  • gksu: подобный su, но считывает данные аутентификации в X
  • rlogind: получает вход по соединению TCP через rlogin протокол
  • sshd: получает вход по соединению TCP через протокол SSH
  • X менеджеров по оформлению (xdm, gdm, kdm, …): подобный login, но считайте вход на X дисплеях

Эти программы работают похожими способами.

  1. Первая часть является аутентификацией: программа читает некоторый вход от пользователя и решает, разрешен ли пользователь войти в систему. Традиционный метод состоит в том, чтобы считать имя пользователя и пароль и проверить, что пользователь упоминается в пользовательской базе данных системы и что пароль, что введенный пользователь является тем в базе данных. Но существует много других возможностей (одноразовые пароли, биометрическая аутентификация, передача авторизации, …).

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

  3. Программа входа в систему может также проверить ограничения учетной записи. Например, это может осуществить время входа в систему или максимальное количество зарегистрированных пользователей, или отказаться от определенных пользователей на определенных соединениях.

  4. Наконец программа входа в систему настраивает сессию пользователя. Существует несколько подшагов:

    1. Установите полномочия процесса на то, что было решено в авторизации: пользователь, группы, пределы, … Вы видят простой пример этого подшага здесь (он только обрабатывает пользователя и группы). Основная идея состоит в том, что программа входа в систему все еще работает как корень в этой точке, таким образом, это имеет максимальные полномочия; это сначала удаляет все полномочия кроме того, чтобы быть пользователем root и наконец звонит setuid отбрасывать это наконец, что не менее важно, полномочие.
    2. Возможно смонтируйте корневой каталог пользователя, отобразитесь, “у Вас есть почтовое” сообщение и т.д.
    3. Вызовите некоторую программу как пользователя, обычно оболочка пользователя (для login и su, или sshd если никакая команда не была указана; X менеджеров по оформлению вызывают X менеджеров сеансов или менеджер окон).

Большинство нельдов в наше время использует PAM (Сменные Модули аутентификации) для обеспечения универсального способа управлять услугами по входу в систему. PAM делит свою функциональность на 4 части: “автор” охватывает обе аутентификации (1 выше) и авторизация (2 выше); “учетная запись” и “сессия” как 3 и 4 выше; и существует также “пароль”, который не используется для логинов, но обновить аутентификационные маркеры (например, пароли).

9
27.01.2020, 20:01

Системные вызовы, которые Вы ищете, называют вещами как setuid и seteuid хотя существует на самом деле вся семья кромки в зависимости от точно, какие варианты пользовательских идентификационных данных Вы пытаетесь изменить.

Существуют также параллельные вызовы как setgid для изменения группы, которую процесс выполняет как.

4
27.01.2020, 20:01

login отбросит полномочия пользователя root при необходимости. Много программ, для которых нужны полномочия пользователя root только первоначально, запустят как корень, сделают то, что они должны сделать, и затем выпадающий в учетную запись обычного пользователя, таким образом, они не должны волноваться о ком-то использующем ошибку в двоичном файле для получения доступа к корневой оболочке. login естественно содержит полномочия дольше, но принцип является тем же.

На самом деле отбрасывание полномочий пользователя root довольно тривиально. POSIX определяет setuid() и setgid() функции, которые изменяют Вашего пользователя и идентификаторы группы, соответственно (реальный и эффективный, если Вы запускаете как корень). login вызовы оба из них, а также initgroups() для установки любых дополнительных групп, Вы можете иметь (так как setgid только для установки Вашего идентификатора основной группы),

Естественно это - ядро, которое на самом деле обрабатывает изменение UID/GID процесса. Как я могу найти реализации системных вызовов ядра Linux? объясняет много о syscalls; в моем источнике ядра я имею:

#define __NR_setgid 144
__SYSCALL(__NR_setgid, sys_setgid)
#define __NR_setuid 146
__SYSCALL(__NR_setuid, sys_setuid)

так 144 и 146 числа системного вызова для тех функций на моей машине


Я не проверял su источник для наблюдения, что это делает, но я подозреваю это также, отбрасывает полномочия пользователя root прямо прежде exec()луг оболочка, с помощью того же метода

4
27.01.2020, 20:01

Теги

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