`who is i` после` su` не показывает новый идентификатор пользователя?

9

Почему, когда я переключаю пользователя, su <username>а затем выполняю who am i, выводится предыдущий пользователь, на которого я вошел, а не тот, на которого я переключился?

user1091856
источник

Ответы:

13

Вы, вероятно, запускаете неправильную команду.

  • whoпредназначен для того, чтобы показать, кто вошел в систему, т.е. какой пользователь владеет терминалом. Это возвращает строку как это:

    ckhan    pts/1        2012-11-05 03:06 (c-21-13-25-10.ddw.ca.isp.net)
    
  • whoamiэто значит показать вам, каков эффективный идентификатор пользователя, который его запускает. Он возвращает только одно имя, как это (и эквивалентно выполнению id -un):

    ckhan
    

Я думаю, что вы, возможно, буквально набрали who am iв терминале, который работал whoс двумя игнорируемыми аргументами ( am, i).

Смотрите man whoи man whoamiдля более подробной информации.

ckhan
источник
2
Два аргумента amи iне игнорируются, они даже указаны POSIX: «В локали POSIX, ограничить выход для описания вызывающего пользователя, что эквивалентно -mвыбору.»
Ксиэнн
3

На моей странице справки по Ubuntu 12.04.2 команда 'who', who is i (или who с любыми двумя аргументами) совпадает с 'who -m' и должна дать вам имя хоста и пользователя, связанные с STDIN. Однако я не получаю вывод с «кто я». Либо страница руководства неверна, либо в команде есть ошибка. Независимо от того, как ранее ответил ckhan, команда 'whoami' даст вам имя пользователя для вашего эффективного идентификатора пользователя. По крайней мере, в Ubuntu 12.04.2 ни один из идентификаторов, «кто я» или «whoami» не даст вам только имя пользователя, вошедшего в систему на текущем терминале. В качестве обходного пути вы можете получить это с:

who | sed 's/ .*//'
Марникс А. ван Аммерс
источник
Обратите внимание, что это специфично для Linux. Это возвращает оригинальное имя пользователя в Unix / SunOS.
обратный
3

Обходной путь :

ls -l `tty` | awk '{print $3}'

это работает как замена от who am i | awk '{print $1}'. Объяснение ниже:

Во многих системах " who am i" эквивалентно " who -m". Проблема здесь в том, что с некоторыми терминалами " who -m" ничего не возвращает!

Пример # 1 запускается с терминала xfce4

Pegasus ~ # whoami
root
Pegasus ~ # who am i
thomas   pts/1        2017-08-19 11:15 (:0.0)
Pegasus ~ # who -m
thomas   pts/1        2017-08-19 11:15 (:0.0)
Pegasus ~ # who
thomas   tty8         2017-08-19 10:18 (:0)
thomas   pts/1        2017-08-19 11:15 (:0.0)
thomas   pts/5        2017-08-19 16:16 (:0.0)
Pegasus ~ # who am i | awk '{print $1}'
thomas
Pegasus ~ # 

но пример №2 с терминала gnome (тот же компьютер, те же команды)

Pegasus ~ # whoami
root
Pegasus ~ # who am i
Pegasus ~ # who -m
Pegasus ~ # who
thomas   tty8         2017-08-19 10:18 (:0)
thomas   pts/1        2017-08-19 11:15 (:0.0)
thomas   pts/5        2017-08-19 16:16 (:0.0)
Pegasus ~ # 

Похоже, это следствие того, что gnome-терминал не добавляет записи utmp…

Томас Бекрут
источник
Не разбирайся! Используйте statвместо этого: stat -c '%U' "$(tty)"вы, вероятно, не должны анализировать who am iлибо, так как имена пользователей могут содержать пробелы в некоторых редких случаях.
wjandrea