Есть ли простая альтернатива «кто я» и «логин»? - PullRequest
0 голосов
/ 17 мая 2019

Я заметил, что RHEL 8 и Fedora 30 не обновляют файл utmp должным образом.

В результате такие команды, как «кто я», «последний», «w» и т. Д., Выводят неверные результаты(кто я на самом деле ничего не печатает)

После небольшого поиска в Google, я нашел 'logname', который сработал в этом случае, но я прочитал, что gnome вообще отказывается от поддержки utmp, так что это вопрос временипока это тоже не перестает работать.

Я написал следующий скрипт, который находит имя пользователя для входа (даже если он использует sudo в тот момент, когда он запускает команду), но это слишком сложно, поэтому я ищуальтернативы.

LOGIN_UID=$(cat /proc/self/loginuid)
LOGIN_NAME=$(awk -v val=LOGIN_UID -F ":" '$3==val{print $1}' /etc/passwd)

Есть ли простая альтернатива, которая не основана на правильном обновлении / var / run / utmp?

Редактировать 1: Решения, которые не работают $ HOME, $ USER и id возвращают неверные значения при использовании в сценарии, который был запущен с помощью команды sudo.who am i и logname зависят от utmp, который не всегда обновляется терминалом.

Рабочее решение: После небольшого поиска был найден более простой способ, чем упомянутый выше.Комментарий https://unix.stackexchange.com/users/5685/frederik-deweerdt к собственному ответу

Ссылка на ответ, содержащая комментарий: https://unix.stackexchange.com/a/74312

Ответ 1

stat -c "%U" $(tty)

Второй ответ найден на https://stackoverflow.com/a/51765389/10630167

Ответ 2

`pstree -lu -s $$ | grep --max-count=1 -o '([^)]*)' | head -n 1 | sed 's/[()]//g'`

1 Ответ

0 голосов
/ 18 мая 2019

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

Учитывая это, возможно, посмотрите на POSIXid команда, которая имеет явные опции для печати реального (вход в систему) или действующего (после любой команды setuid) идентификатора пользователя с -r или -u, соответственно.Конечно, точные средства, с помощью которых он получает эту информацию, не указаны, и останутся зависимыми от реализации, и, таким образом, могут или не могут работать на вашей платформе при ваших конкретных обстоятельствах.

В качестве отступления, здесьрефакторинг вашего кода, чтобы избежать загрязнения пространства имен переменных двумя отдельными переменными.

LOGIN_NAME=$(awk 'NR==FNR { val=$0; next } 
    $3==val{print $1}' /proc/self/loginuid FS=":" /etc/passwd)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...