Как узнать, кто входит в систему с правами root?

7

В последнее время я спросил « Как я зарегистрировал зарегистрированных пользователей? « Команда who хорошо обслуживает для этой цели. Но как я могу найти, кто зарегистрирован как root? Будет ли имя пользователя «root»?

    
задан Anony 28.11.2017 в 04:48
источник

4 ответа

6

Я предполагаю, что учетная запись root не включена (как и по умолчанию), поэтому для пользователя может быть <%> root применимо только sudo -i . Мое предложение - это следующий скрипт, который использует команды who -u и pgrep -at <tty parsed from who -u> , чтобы найти, какой user , на котором tty выполнили команду sudo -i .

#!/bin/bash
LANG=C who -u | while read -a line; do  # Output the whole line: echo "${line[@]}"
        IS_ROOT="$(pgrep -at "${line[1]}" | grep 'sudo -i')"
        [[ ! -z "${IS_ROOT}" ]] && printf '%-7s ( PID %-6s at %s on TTY %-7s) is ROOT: %s %s\n' "${line[0]}" "${line[5]}" "${line[4]}" "${line[1]}" "$IS_ROOT"
done | sed '/grep sudo -i/d' | sort -k13 -k6

Пояснение:

  • who -u показывает, что пользователи вошли в систему с PID своих сеансов. Вероятно, LANG=C не является обязательным - он предназначен для обеспечения идентичного формата времени и даты на машинах с разными настройками locale .

  • Цикл while будет do команд, пока есть поток на stdin .

  • Команда read -a будет читать входной поток по строкам и назначит эти строки в виде массива переменной " $line . Мы могли бы выводить всю строку командой: echo "${line[@]}" . Таким образом, ${line[1]} означает вторую переменную массива $line (первая равна 0 ). В текущем случае ${line[1]} является TTY из результата who -u .

  • Вот простой скрипт, который выведет "таблицу" с отношениями между элементами массива и их значениями:

    line=( $(LANG=C who -u | head -1) ); for i in {0..6}; do printf '%-11s' "${line[$i]}"; done; echo; for i in {0..6}; do printf '${line[%s]} ' "$i"; done; echo
    
    guest      tty7       2018-01-03 09:52      old        1847       (:0)
    ${line[0]} ${line[1]} ${line[2]} ${line[3]} ${line[4]} ${line[5]} ${line[6]}
    
  • Результат команды pgrep -at "${line[1]}" | grep 'sudo -i' будет подписан как значение $() к переменной $IS_ROOT .

  • Команда pgrep -at "TTY" выводит PID всех процессов на определенную TTY-опцию -t --terminal , а опция -a --list-name будет отображать имена PID и процессы.

  • Выражение [[ ! -z "${IS_ROOT}" ]] && можно прочитать следующим образом: если [ , переменная "${IS_ROOT}" не является ! empty -z , то && или || .

  • Команда printf используется для форматирования вывода ( ссылка ):

    printf '%s some text %s' "$var1" "$var2"
    
  • Наконец, sed '/grep sudo -i/d' удалит необработанную строку (содержащую нашу команду grep 'sudo -i' ) из результата while и sort -k13 -k6 будет сортировать результат по столбцам 13 и 6.

Вызвать скрипт find-root , сделать его исполняемым ( chmod +x find-root ) и выполнить его.

Вот простой вывод:

$ ./find-root
spas    ( PID 14035  at 12:54 on TTY pts/20 ) is ROOT: 23518 sudo -i
spas    ( PID 14035  at 12:36 on TTY pts/4  ) is ROOT: 23589 sudo -i
guest   ( PID 23575  at 15:00 on TTY pts/4  ) is ROOT: 23589 sudo -i
guest   ( PID 24321  at 15:30 on TTY tty1   ) is ROOT: 24386 sudo -i

Вот демонстрация (в сеансе mutt ), как работает скрипт ( в предыдущей версии ):

Поместитескриптв/usr/local/bin,чтобысделатьегодоступнымкаккомандаоболочки.Дляэтогоскопируйтеивыполнитеследующиестрокиввидеоднойкоманды:

cat << EOF | sudo tee /usr/local/bin/find-root && sudo chmod +x /usr/local/bin/find-root #!/bin/bash LANG=C who -u | while read -a line; do IS_ROOT="\$(pgrep -at "\${line[1]}" | grep 'sudo -i')" [[ ! -z "\${IS_ROOT}" ]] && printf '%-7s ( PID %-6s at %s on TTY %-7s) is ROOT: %s %s\n' "\${line[0]}" "\${line[5]}" "\${line[4]}" "\${line[1]}" "\$IS_ROOT" done | sed '/grep sudo -i/d' | sort -k13 -k6 EOF

Пояснение:

  • Команда cat << EOF выводит следующие строки, если не встречается строка EOF . Обратите внимание на обратную косую черту \$ , которая выйдет из специального символа $ и будет выводиться буквально внутри cat.

  • Этот вывод будет передан | в stdin команды tee (выполняется sudo ), которая будет записывать файл /usr/local/bin/find-root .

  • Если предыдущая команда успешна,% co_de% будет выполнена команда && .

См. также:

ответ дан pa4080 28.11.2017 в 12:04
источник
4

В Ubuntu вход в аккаунт root отключен, однако sudo пользователи все равно могут войти в систему с правами root через sudo -i . Однако ни команда who , ни команда w на Ubuntu не покажут, что вы вошли в систему с правами root:

$ sudo -i
[sudo] password for xieerqi: 
$ who
xieerqi  tty7         2017-11-27 23:39 (:0)
xieerqi  pts/14       2017-11-27 23:39 (:0)
xieerqi  pts/0        2017-11-28 00:25 (:0)

Здесь я вошел в систему на pts/14 через sudo -i , однако мое первоначальное имя пользователя все еще существует. Однако можно сделать так, чтобы отфильтровать список процессов, чтобы найти оболочку, запущенную на этом терминале. Конечно, этот процесс будет запущен как root.

$ ps -u root | awk '$2 ~ /pts/'                                                                
 4170 pts/14   00:00:00 sudo
 4172 pts/14   00:00:00 bash

Таким образом, путем перекрестной ссылки вы можете выяснить, кто зарегистрирован как root в терминале. Помните, что вы также должны включить tty в awk-команду, если на tty зарегистрированы пользователи root.

Еще один вариант - фильтровать /var/log/auth.log , как уже было сказано в других ответах:

awk '/USER=root/' /var/log/auth.log

Однако это файл журнала. Он отображает только тех, кто вошел в систему или не смог войти в систему, а не кто в настоящее время на уровне суперпользователя.     

ответ дан Sergiy Kolodyazhnyy 28.11.2017 в 07:39
0

Введите этот

sudo less /var/log/auth.log

оттуда вы сможете просматривать все логины, включая тех, кто обращается к root

    
ответ дан Yien 28.11.2017 в 06:14
0

Обычно в Ubuntu учетная запись SuperUser или Root называется root, но заблокирована системой, и вы не можете войти в нее. Чтобы ответить на ваш вопрос, да, имя пользователя будет root, но вы не сможете его использовать без его разблокировки.

Чтобы разблокировать его, введите в терминал следующее:

sudo -i

Затем установите пароль для root:

sudo passwd root

Более подробную информацию об этом можно найти здесь:

Ссылка

    
ответ дан Ray Antebioni 28.11.2017 в 05:58