Недавно я спросил: «Как мне регистрировать зарегистрированных пользователей?» Команда who служит для этой цели. Но как я могу найти, кто зарегистрирован как root? Будет ли имя пользователя «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}" не ! пуста -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) работы скрипта ( root ):
Поместите скрипт в /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
Объяснение:
who -u показывает, что пользователи вошли в систему с PID своих сеансов , Вероятно, LANG=C не является обязательным - он помещается, чтобы гарантировать идентичный формат времени и даты на машинах с разными настройками locale.who -u показывает, что пользователи вошли в систему с PID своих сеансов , Вероятно, LANG=C не является обязательным - он помещается, чтобы гарантировать идентичный формат времени и даты на машинах с разными настройками locale.
В цикле while будут do команды, пока есть потокЭтот вывод будет передан по каналу | в stdin команды tee (исполняется sudo), который будет записывать файл /usr/local/bin/find-root.
who -u показывает, что пользователи вошли в систему с PID своих сеансов. Вероятно, LANG=C не является обязательным - он помещается, чтобы гарантировать идентичный формат времени и даты на машинах с разными настройками locale.
В цикле while будет do команды, в то время как на stdin есть поток.
Команда read -a будет читать входной поток по строкам и назначит эти строки в виде массива «переменной» $line. Мы могли бы выводить всю строку командой: echo "${line[@]}". Таким образом, ${line[1]} означает вторую переменную массива $line (первая - 0). В текущем случае ${line[1]} является TTY с выхода who -u.Команда read -a будет считывать входной поток по строкам и назначит эти строки в виде массива «переменной» "$line. Мы могли бы выводить всю строку командой: echo "${line[@]}". Таким образом, ${line[1]} означает вторую переменную массива $line (первая - 0). В текущем случае ${line[1]} является TTY с выхода who -u.
Я полагаю, что учетная запись 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}" не ! пуста -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) работы скрипта ( root ):
Поместите скрипт в /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
Объяснение:
who -u показывает, что пользователи вошли в систему с PID своих сеансов , Вероятно, LANG=C не является обязательным - он помещается, чтобы гарантировать идентичный формат времени и даты на машинах с разными настройками locale.who -u показывает, что пользователи вошли в систему с PID своих сеансов , Вероятно, LANG=C не является обязательным - он помещается, чтобы гарантировать идентичный формат времени и даты на машинах с разными настройками locale.
В цикле while будут do команды, пока есть потокЭтот вывод будет передан по каналу | в stdin команды tee (исполняется sudo), который будет записывать файл /usr/local/bin/find-root.
who -u показывает, что пользователи вошли в систему с PID своих сеансов. Вероятно, LANG=C не является обязательным - он помещается, чтобы гарантировать идентичный формат времени и даты на машинах с разными настройками locale.
В цикле while будет do команды, в то время как на stdin есть поток.
Команда read -a будет читать входной поток по строкам и назначит эти строки в виде массива «переменной» $line. Мы могли бы выводить всю строку командой: echo "${line[@]}". Таким образом, ${line[1]} означает вторую переменную массива $line (первая - 0). В текущем случае ${line[1]} является TTY с выхода who -u.Команда read -a будет считывать входной поток по строкам и назначит эти строки в виде массива «переменной» "$line. Мы могли бы выводить всю строку командой: echo "${line[@]}". Таким образом, ${line[1]} означает вторую переменную массива $line (первая - 0). В текущем случае ${line[1]} является TTY с выхода who -u.
Я полагаю, что учетная запись 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}" не ! пуста -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) работы скрипта ( root ):
Поместите скрипт в /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
Объяснение:
who -u показывает, что пользователи вошли в систему с PID своих сеансов , Вероятно, LANG=C не является обязательным - он помещается, чтобы гарантировать идентичный формат времени и даты на машинах с разными настройками locale.who -u показывает, что пользователи вошли в систему с PID своих сеансов , Вероятно, LANG=C не является обязательным - он помещается, чтобы гарантировать идентичный формат времени и даты на машинах с разными настройками locale.
В цикле while будут do команды, пока есть потокЭтот вывод будет передан по каналу | в stdin команды tee (исполняется sudo), который будет записывать файл /usr/local/bin/find-root.
who -u показывает, что пользователи вошли в систему с PID своих сеансов. Вероятно, LANG=C не является обязательным - он помещается, чтобы гарантировать идентичный формат времени и даты на машинах с разными настройками locale.
В цикле while будет do команды, в то время как на stdin есть поток.
Команда read -a будет читать входной поток по строкам и назначит эти строки в виде массива «переменной» $line. Мы могли бы выводить всю строку командой: echo "${line[@]}". Таким образом, ${line[1]} означает вторую переменную массива $line (первая - 0). В текущем случае ${line[1]} является TTY с выхода who -u.Команда read -a будет считывать входной поток по строкам и назначит эти строки в виде массива «переменной» "$line. Мы могли бы выводить всю строку командой: echo "${line[@]}". Таким образом, ${line[1]} означает вторую переменную массива $line (первая - 0). В текущем случае ${line[1]} является TTY с выхода who -u.
В 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 less /var/log/auth.log, там вы сможете просматривать все логины, включая тех, кто обращается к root
Обычно в Ubuntu учетная запись SuperUser или Root называется root, но заблокирована системой, и вы не можете войти в нее. Чтобы ответить на ваш вопрос, да, имя пользователя будет root, но вы не сможете его использовать без его разблокировки.
Чтобы разблокировать его, введите в терминал следующее:
sudo -i
Then Задайте пароль для root:
sudo passwd root
Дополнительную информацию об этом можно найти здесь:
https://help.ubuntu.com/community/RootSudo
Обычно в Ubuntu учетная запись SuperUser или Root называется root, но заблокирована системой, и вы не можете войти в нее. Чтобы ответить на ваш вопрос, да, имя пользователя будет root, но вы не сможете его использовать без его разблокировки.
Чтобы разблокировать его, введите в терминал следующее:
sudo -i
Then Задайте пароль для root:
sudo passwd root
Дополнительную информацию об этом можно найти здесь:
https://help.ubuntu.com/community/RootSudo
В 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 less /var/log/auth.log, там вы сможете просматривать все логины, включая тех, кто обращается к root
Обычно в Ubuntu учетная запись SuperUser или Root называется root, но заблокирована системой, и вы не можете войти в нее. Чтобы ответить на ваш вопрос, да, имя пользователя будет root, но вы не сможете его использовать без его разблокировки.
Чтобы разблокировать его, введите в терминал следующее:
sudo -i
Then Задайте пароль для root:
sudo passwd root
Дополнительную информацию об этом можно найти здесь:
https://help.ubuntu.com/community/RootSudo
В 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 less /var/log/auth.log, там вы сможете просматривать все логины, включая тех, кто обращается к root