Как я могу перечислить всех пользователей, указав их имя пользователя и имя группы? в системах UNIX

Боюсь, что ответ slm (в настоящее время отмеченный как правильный) неверен по целому ряду аспектов.

Во-первых, ОП спрашивал, есть ли способ узнать извне, есть ли у процесса данные, ожидающие передачи на сокете AF_UNIX. Ответ slm требует модификации самого процесса. Вообще, netstat полезен для внешнего исследования процесса, поведение которого вы не можете контролировать. Он может быть полезен, чтобы узнать, есть ли у процесса непрочитанные данные, что может указывать на то, что процесс не обслуживает свой сокет должным образом при чтении (т.е., возможно, у него есть ошибка, или он неправильно сконфигурирован, или поток умер).

Во-вторых, slm указывает, что вы не можете сделать это даже внутри процесса, кроме как читать сокет, пока он не опустеет. Также неверно. Процесс может использовать иоктл SIOCINQ/FIONREAD для определения количества данных в сокете, не читая его (я предпочитаю FIONREAD, потому что он означает то же самое в большем количестве контекстов и поэтому более общепризнан, чем SIOCINQ, который специфичен для сокетов). См. man-страницу unix(7).

Наконец, в Linux есть способ сделать то, о чем просил ОП (внешне определить количество данных, ожидающих обработки на сокете домена unix), используя программу ss, а не netstat. ss -ax сделает это. Это что-то вроде netstat на стероидах. См. страницу руководства ss(8).

Ссылки

0
23.02.2018, 18:59
2 ответа

Con comando simpleawk:

awk -F':' 'NR==FNR{ a[$3]=$1; next }{ print $1", "a[$4] }' /etc/group /etc/passwd
  • -F':'-separador de campo
  • NR==FNR{ a[$3]=$1; next }-procesando el primer archivo de entrada (es decir,/etc/group):
    • a[$3]=$1-captura nombre de grupo$1usando identificador de grupo$3como matriz aclave
    • next-saltar al siguiente registro
  • { print $1", "a[$4] }-acción para el segundo archivo de entrada (es decir,/etc/passwd):
    • $1-el primer campo;indicando nombre de usuario
    • a[$4]-obtener nombre de grupo por ID de grupo (presentado por campo$4)
3
28.01.2020, 02:24

Lo siguiente hace un JOIN relacional en los dos archivos en el GID y genera el nombre de usuario y el nombre del grupo con un :en -entre:

join -t : -1 4 -2 3 -o 1.1,2.1 \
    <( sort -t : -k4,4 /etc/passwd ) \
    <( sort -t : -k3,3 /etc/group )

El GID está en la columna 4 del archivo passwdy en la columna 3 del archivo group.

Con -1y -2especificamos cuál es el campo de unión en los dos archivos de entrada y con -oespecificamos qué campos queremos generar de cada archivo (el primer campo de cada archivo ).

La clasificación de cada archivo en el campo de combinación es necesaria para que joinfuncione.

Para obtener esto en el formato exacto solicitado, solo canalícelo a través de sed 's/:/, /'que reemplaza los dos puntos con coma y espacio.

0
28.01.2020, 02:24

Теги

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