Вопрос или проблема
На моем сервере Ubuntu мне очень полезно, что netstat -tulpn
также показывает имя пользователя, подключенного к sshd
(по-видимому, эта печать имени пользователя специально для sshd
) – к сожалению, этот вывод также обрезан:
$ sudo netstat -tulpn | grep 'PID\|user1'
Протокол Recv-Q Send-Q Локальный адрес Удаленный адрес Состояние PID/Имя программы
tcp 0 0 0.0.0.0:12345 0.0.0.0:* LISTEN 1620557/sshd: user1
tcp6 0 0 :::12345 :::* LISTEN 1620557/sshd: user1
В приведенном выше примере полное имя пользователя user1234
, но из-за обрезки я могу увидеть только user1
.
Еще более печально, что я узнал, что эта обрезка закодирована в netcat
в ограничении ширины строки вывода Netstat:
К сожалению, ширина столбца PID/Имя программы в netstat закодирована с
#define PROGNAME_WIDTH 20
, поэтому нет возможности получить полный вывод из netstat напрямую. Также у вас получается 19 символов и пробел в конце.
В современном linux можно использовать sudo ss -natp
, чтобы получить полную информацию, отформатированную немного по-другому, но с полным именем:
… к сожалению, ss
не выводит имя пользователя, подключенного к sshd
, как это делает netstat
:
$ sudo ss -tulpn | grep user1
$
$ sudo ss -tulpn | grep 12345
tcp LISTEN 0 128 0.0.0.0:12345 0.0.0.0:* users:(("sshd",pid=1620557,fd=10))
tcp LISTEN 0 128 [::]:12345 [::]:* users:(("sshd",pid=1620557,fd=11))
Итак, как я могу получить вывод, идентичный или похожий на вывод netstat -tulpn
, но который отображает полные имена пользователей, подключенных к sshd
?
Моя версия netstat:
$ netstat --version
net-tools 2.10-alpha
Фред Баумгартен, Алан Кокс, Бернд Эккенфельс, Фил Блундл, Туан Хоанг, Брайан Мичек и другие
+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX
AF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH
HW: +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64
ss не выводит имя пользователя, подключенного к sshd, как это делает netstat
netstat
тоже этого не делает! Он просто выводит cmdline
этого процесса. Нет никаких гарантий, что пользователь, который аутентифицируется, является тем же самым, что и пользователь, выполняющий что-то; это зависит от конфигурации.
В любом случае, чтобы получить исполняющего пользователя:
Я бы просто написал скрипт, который к каждой строке вывода будет искать pid=([0-9][0-9]*),
, тем самым извлекая идентификатор процесса из строки, затем заходит и получает владельца /proc/{pid}
, например, выполняя stat -c '%U' "/proc/{pid}"
, и добавляет это к строке.
В общем, это кажется довольно плохой идеей получать список пользователей, вошедших в SSH, через netstat. loginctl list-sessions
даст вам список сессий (поскольку Ubuntu использует logind/systemd)
Ответ или решение
Для получения полного списка пользователей, подключенных к серверу OpenSSH (sshd) на вашем сервере Ubuntu, и избежания обрезания имен пользователей, можно воспользоваться некоторыми альтернативными методами. Приведенное ниже решение будет включать скрипт, который позволяет извлечь PID (идентификатор процесса) из вывода команды ss
, а затем получит информацию о владельце процесса через файл системы /proc
.
Подход к решению задачи
-
Использование команды
ss
: Командаss
демонстрирует множество сетевых соединений и их состояния, однако она не выводит имен пользователей, которые подключены кsshd
. -
Получение имени пользователя через
/proc
: Изучив процессы, запущенные дляsshd
, мы можем получить владельца каждого процесса и сопоставить его с идентификатором процесса.
Пример скрипта
Вот пример простого скрипта на Bash, который выполнит нужные действия:
#!/bin/bash
# Получение списка соединений для sshd
ss -tulpn | grep sshd | while read -r line; do
# Извлекаем PID из вывода ss
pid=$(echo "$line" | grep -oP '(?<=pid=)\d+')
# Проверяем, существует ли PID
if [[ -n "$pid" ]]; then
# Получение имени пользователя из /proc
user=$(stat -c '%U' "/proc/$pid")
# Вывод информации
echo "$line (user: $user)"
fi
done
Как использовать скрипт
-
Создание скрипта: Скопируйте приведенный выше код в файл, например
get_ssh_users.sh
. -
Выдайте права на исполнение:
chmod +x get_ssh_users.sh
-
Запустите скрипт с правами суперпользователя:
sudo ./get_ssh_users.sh
Альтернативный метод с использованием loginctl
Как упоминалось в вашем запросе, Ubuntu использует systemd
, что позволяет использовать команду loginctl
для получения списка активных сессий пользователей.
Выполните следующую команду:
loginctl list-sessions
Эта команда выдаст список активных сессий, включая пользователей, которые вошли в систему через SSH. В отличие от первого метода, этот подход более семантичный и безопасен, так как он непосредственно использует механизмы управления сеансами системы.
Выводы
Используя предложенный скрипт, вы сможете получить полные имена пользователей, подключенных к sshd
, и избежать проблем с обрезками. В качестве альтернативы, loginctl
предоставляет удобный способ для мониторинга активных сессий. Обе методики могут служить для администраторов систем для обеспечения безопасности и мониторинга подключений пользователей.