Как узнать, кто вошел в систему как root?

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

7
задан 29 November 2017 в 18:07

4 ответа

Я предполагаю, что корневая учетная запись не включена (как это по умолчанию), так только 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 показывает, что пользователи вошли в систему с PIDs их сессий. Вероятно, 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" произведет PIDs всех процессов на определенном TTY - опция -t --terminal, и опция -a --list-name перечислит имена процессов и PIDs.

  • Выражение [[ ! -z "${IS_ROOT}" ]] && мог быть считан таким образом: если [ переменная "${IS_ROOT}" не ! пустой -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

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

enter image description here


Поместите сценарий в /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 встречен. Отметьте обратные косые черты \$ это выйдет из специального символа $ и это будет произведено буквально в кошке.

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

  • Если предыдущая команда успешна && команда suddo chmod +x будет выполняться.


См. также:

7
ответ дан 29 November 2017 в 18:07

Введите этот

sudo less /var/log/auth.log

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

0
ответ дан 29 November 2017 в 18:07

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

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

sudo -i

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

sudo passwd root

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

https://help.ubuntu.com/community/RootSudo

0
ответ дан 29 November 2017 в 18:07

В 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

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

4
ответ дан 29 November 2017 в 18:07

Другие вопросы по тегам:

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