У меня странная проблема: в сеансе GUI, в зависимости от используемого терминала, появляются следующие две (связанные) проблемы:
who
и w
не перечисляет активный сеанс пользователя logname
возвращает logname: no login name
Это происходит в следующих терминалах:
С другой стороны, в следующих сценариях он работает отлично (кто / w перечисляет функции пользователя и логина):
Я нашел ту же проблему в 16.04. У меня было несколько скриптов, использующих логин, и теперь они не работают. Я создал обходной путь. Войдя в систему как я, я помещаю файл в свой домашний каталог с моим логином:
echo $LOGNAME > ~/.logname;
Когда я хочу получить доступ к своему логину, я получаю его таким образом:
g_logname="$(<~/.logname)";
Это работает независимо от того, запускаю ли я скрипт как сам или как root, потому что sudo root поддерживает определение «~» в качестве моего домашнего каталога. Я могу создать файл .logname для каждого пользователя в системе. Этот метод работает, тогда как использование $ USER и $ LOGNAME не при вызове с корневого уровня. Правда, кто-то может взломать его и изменить значение в файле, но меня это не беспокоит. Вы всегда можете изменить права доступа к файлу на 444, а для владельца: group - на root: root, что остановит любого, у кого нет прав root.
Лучший ответ, который я нашел, здесь: https://stackoverflow.com/a/1629628/3196753
т.е.
echo ${SUDO_USER:-${USER}}
Или альтернативно
logname 2>/dev/null || echo ${SUDO_USER:-${USER}}
FWIW, это работает над MacOS 10.8, 10.11 и также еще подтвердило Ubuntu 12.04.
Эти 2>
должен подавить logname: no login name
ошибка, которая зарегистрируется к консоли, запускающейся с Ubuntu 16.04 из-за восходящая терминальная гномом ошибка .
:-${USER}
средства, если $SUDO_USER
пробел (в течение многих времен, когда sudo на самом деле не используется), затем замените значением $USER
.