Оператор if запрашивает идентификатор пользователя в etc / passwd?

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

who -s | awk '{ print $2 }' | (cd /dev && xargs stat -c '%n %U %X')

На некоторых системах это будет выдавать ошибки для сессий входа, таких как сессии X11, которые не находятся на реальных ttys.

Если вам нужен возраст вместо абсолютного времени, обработайте его, чтобы вычесть его из текущего времени:

who -s | awk '{ print $2 }' | (cd /dev && xargs stat -c '%n %U %X') |
    awk '{ print $1"\t"$2"\t"'"$(date +%s)"'-$3 }'

Или используйте оператор perl -A:

who -s | perl -lane 'print "$F[1]\t$F[0]\t" . 86400 * -A "/dev/$F[1]"'
8
26.03.2017, 19:20
5 ответов

Попробуйте следующее:

if grep -E '^[^:]*:[^:]*:[^:]{4}' /etc/passwd | grep -Evq '^[^:]*:[^:]*:1000:'

Первый grep ищет passwd строки с uid, равным четырем или более цифр. Второй grep отфильтровывает строку с uid 1000. Статус выхода будет равен 0, если остались строки, и 1, если нет.

8
27.01.2020, 20:08

Эта конструкция не имеет особого смысла:

"$(id -u)" -gt "1000" </etc/passwd

Команда id работает независимо от перенаправления ввода. В любом случае перенаправление здесь не имеет смысла.

Вы можете использовать этот конвейер в своем тестовом сравнении. Он покажет вам наивысший идентификатор пользователя на машине:

cat /etc/passwd | awk -F: '{print $3}' | sort -n | tail -n1

Вы можете настроить его для некоторых систем, так как там может быть пользователь nobody с UID 65534 .

4
27.01.2020, 20:08

Вместо того чтобы читать /etc/passwd напрямую, вы должны использовать getent passwd, который также будет работать, если некоторые из ваших пользователей сохранены в чем-то вроде LDAP или подобном. awk должен хорошо подойти для формата вывода с разделителем двоеточий.

Это выведет имена всех пользователей с UID > 1000:

getent passwd | awk -F: '$3 > 1000 {print $1}'

А это просто выведет found, если будет найден хотя бы один такой пользователь:

getent passwd | awk -F: '$3 > 1000 {print "found"; exit}'
14
27.01.2020, 20:08

Для этого в цикле bash я предлагаю использовать читать и IFS , например:

#!/usr/bin/env bash
while IFS=':' read -r user passwd uid gid comment home shell;  do
    if [ "$uid" -gt 1000 ] ; then
        echo GT $user
    else
        echo LT $user
    fi
done < /etc/passwd
16
27.01.2020, 20:08

Использование кода Тома помогло мне..

#!/bin/sh
if grep -E '^[^:]*:[^:]*:[^:]{4}' /etc/passwd | grep -Evq '^[^:]*:[^:]*:1000:'
then 
    echo "exists"
else
    echo "not exists"
fi
1
27.01.2020, 20:08

Теги

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