Недавно я спросил: « Как составить список вошедших в систему пользователей? » Команда who
хорошо подходит для этой цели. Но как мне найти, кто вошел в систему как 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
показывает, что пользователи вошли в систему с 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
сессия), как сценарий работает (в его предыдущей версии):
Поместите сценарий в /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
будет выполняться.
См. также:
Введите этот
sudo less /var/log/auth.log
оттуда вы сможете просматривать все логины, включая тех, кто имеет доступ к root
Обычно в Ubuntu учетная запись SuperUser или Root называется root, но она заблокирована системой, и вы не можете войти в нее. Чтобы ответить на ваш вопрос, да, имя пользователя будет root, хотя вы не сможете использовать его без разблокировки.
Чтобы разблокировать его, введите в терминал следующее:
sudo -i
Затем установите пароль для пользователя root:
sudo passwd root
Дополнительную информацию об этом можно найти здесь:
В 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
Однако, это файл журнала. Он отображает только то, кто вошел в систему или не смог войти в систему, но не тот, кто в настоящее время является на уровне суперпользователя.
sudo apt-get dist-upgrade
не обновляет Ubuntu до старшей версии. См. manpages.ubuntu.com/manpages/precise/en/man8/apt-get.8.html
– Panther
4 March 2013 в 06:13
sudo apt-get dist-upgrade
не обновляет Ubuntu до старшей версии. См. manpages.ubuntu.com/manpages/precise/en/man8/apt-get.8.html
– Panther
4 March 2013 в 06:13
sudo apt-get dist-upgrade
не обновляет Ubuntu до старшей версии. См. manpages.ubuntu.com/manpages/precise/en/man8/apt-get.8.html
– Panther
4 March 2013 в 06:13
sudo apt-get dist-upgrade
не обновляет Ubuntu до старшей версии. См. manpages.ubuntu.com/manpages/precise/en/man8/apt-get.8.html
– Panther
4 March 2013 в 06:13
sudo apt-get dist-upgrade
не обновляет Ubuntu до старшей версии. См. manpages.ubuntu.com/manpages/precise/en/man8/apt-get.8.html
– Panther
4 March 2013 в 06:13
sudo apt-get dist-upgrade
не обновляет Ubuntu до старшей версии. См. manpages.ubuntu.com/manpages/precise/en/man8/apt-get.8.html
– Panther
4 March 2013 в 06:13