Показать неполные имена пользователей, подключенных к серверу sshd, в терминале?

Вопрос или проблема

На моем сервере 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.

Подход к решению задачи

  1. Использование команды ss: Команда ss демонстрирует множество сетевых соединений и их состояния, однако она не выводит имен пользователей, которые подключены к sshd.

  2. Получение имени пользователя через /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

Как использовать скрипт

  1. Создание скрипта: Скопируйте приведенный выше код в файл, например get_ssh_users.sh.

  2. Выдайте права на исполнение:

    chmod +x get_ssh_users.sh
  3. Запустите скрипт с правами суперпользователя:

    sudo ./get_ssh_users.sh

Альтернативный метод с использованием loginctl

Как упоминалось в вашем запросе, Ubuntu использует systemd, что позволяет использовать команду loginctl для получения списка активных сессий пользователей.

Выполните следующую команду:

loginctl list-sessions

Эта команда выдаст список активных сессий, включая пользователей, которые вошли в систему через SSH. В отличие от первого метода, этот подход более семантичный и безопасен, так как он непосредственно использует механизмы управления сеансами системы.

Выводы

Используя предложенный скрипт, вы сможете получить полные имена пользователей, подключенных к sshd, и избежать проблем с обрезками. В качестве альтернативы, loginctl предоставляет удобный способ для мониторинга активных сессий. Обе методики могут служить для администраторов систем для обеспечения безопасности и мониторинга подключений пользователей.

Оцените материал
Добавить комментарий

Капча загружается...