Время простоя - это не что иное, как время последнего доступа к устройству 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]"'
Попробуйте следующее:
if grep -E '^[^:]*:[^:]*:[^:]{4}' /etc/passwd | grep -Evq '^[^:]*:[^:]*:1000:'
Первый grep
ищет passwd
строки с uid, равным четырем или более
цифр. Второй grep
отфильтровывает строку с uid 1000. Статус выхода
будет равен 0, если остались строки, и 1, если нет.
Эта конструкция не имеет особого смысла:
"$(id -u)" -gt "1000" </etc/passwd
Команда id
работает независимо от перенаправления ввода. В любом случае перенаправление здесь не имеет смысла.
Вы можете использовать этот конвейер в своем тестовом сравнении. Он покажет вам наивысший идентификатор пользователя на машине:
cat /etc/passwd | awk -F: '{print $3}' | sort -n | tail -n1
Вы можете настроить его для некоторых систем, так как там может быть пользователь nobody
с UID 65534
.
Вместо того чтобы читать /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}'
Для этого в цикле 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
Использование кода Тома помогло мне..
#!/bin/sh
if grep -E '^[^:]*:[^:]*:[^:]{4}' /etc/passwd | grep -Evq '^[^:]*:[^:]*:1000:'
then
echo "exists"
else
echo "not exists"
fi