Кроме того, будут ли эти переменные всегда соответствовать текущему имени пользователя, вошедшего в систему (они соответствуют моей системе Debian)? Могу ли я предположить их доступность в других Unix-подобных системах?
Мне также любопытно, почему можно было бы whoami
вместо того, чтобы просто читать любую из этих переменных.
environment-variables
tshepang
источник
источник
man
страницу,whoami
выдает имя, связанное с вашим эффективным идентификатором пользователя. Это означает, что он вернет что-то другое, если вы используетеsudo
или запускаете исполняемый файл setuid. Если выsudo
настроили, попробуйте,sudo whoami
например.USER
иUSERNAME
являются обычными переменными среды, что означает, что, если вы хотите, вы можете установить для них произвольные значения Просто введитеUSER=xyz
. Другими словами, даже если эти переменные существуют, нет гарантии, что их значения соответствуют текущему зарегистрированному имени пользователя.guarantee
, я имел в виду по умолчанию (т.е. предполагая, что пользователь не изменил их).sudo whoami
иsudo echo $USER
sudo echo $USER
оболочка расширяется$USER
, затем вызываетsudo
. Так что, конечно, он не выдает такой же результат, какwhoami
. Какsudo whoami
,sudo sh -c 'echo $USER'
делает (обычно) выходroot
. Что касается вашего комментария обwhoami
использовании EUID , обратите внимание, чтоsudo whoami
будет выводиться,root
даже еслиwhoami
используется UID.sudo
наборы как EUID и UID для команды он работает ( за исключением очень необычной ситуации , что вы явно настроить его вести себя иначе). Сравнитеsudo id -u
сsudo id -ru
.Ответы:
Это логин .
Справочная страница Linux login (1) гласит:
Справочная страница FreeBSD login (1) гласит:
В NetBSD , OpenBSD и OS X страниц человека говорят то же самое.
Вот исходный код от логина util-linux:
Вот исходный код от входа в FreeBSD:
источник
USER
иUSERNAME
set, и ваша команда только возвращаетсяLOGNAME
.login
это не единственная установка этих переменных.login
команды. Операционные системы, использующие Linux в качестве ядра, могут свободно использовать любую реализацию, которая им нравится. Например, системы на основе Debian, как правило, используют ту из shadow-utils, а не util-linux.login
часто не вызывается при входе поверхssh
или большинством графических менеджеров входа.Там нет правил. Некоторые снаряды, как
tcsh
илиzsh
устанавливают$LOGNAME
.zsh
наборы$USER
.Это может быть установлено некоторыми вещами, которые регистрируют вас, например
login
(как вызываетсяgetty
при входе в систему через терминал, а иногда и другими вещами, такими какin.rlogind
)cron
,,su
,sudo
,sshd
,rshd
, графические менеджеры входа или нет.Если был логин, по моему опыту,
$USER
он обычно установлен (но он не может быть обновлен после изменения идентификатора пользователя (с помощью команд setuid) в этом сеансе входа в систему. POSIX требует, чтобы он$LOGNAME
был установлен при входе в систему (иcron
).Чтобы получить регистрационное имя переносимым, лучше всего использовать
logname
команду (если не было никакого логина, он может ничего не возвращать). Чтобы получить идентификатор пользователя, используйтеid -u
. Чтобы получить одно имя , соответствующее текущему эффективного идентификатора пользователя:id -un
. Чтобы получить их все (в большинстве случаев для каждого идентификатора пользователя есть только одно имя пользователя, но это не гарантируется):Хотя это может не сработать в системах, где пользовательская база данных не может быть перечислена (как это иногда бывает с сетевыми пользовательскими базами данных, например).
источник
Вы, вероятно, хотите здесь полагаться на стандарт POSIX , поскольку в какой-то момент вы, вероятно, будете заботиться не только о входе пользователя в систему (управляемом
login
программой), но и оcron
заданиях и тому подобном.Следовательно, вы должны знать, что POSIX требует,
$LOGNAME
но не требует$USER
. Например,$USER
не может быть установлено cron, как указано в ответе Keith Thompson , который также ссылается на некоторую историю о том, как это связано с историей System-V против BSD:источник
Если вы хотите использовать переменные среды (вместо
whoami
илиgetpwent
иgetpwnam
) и не уверены, что они всегда установлены одинаково во всех * NIX системах, попробуйте это в bash:Если после всего этого он еще пуст, значит, вы находитесь в довольно эзотерической системе. ;)
источник