누가 $ USER 및 $ USERNAME 환경 변수를 설정합니까?


34

또한이 변수들은 항상 현재 로그인 한 사용자 이름과 일치합니까 (데비안 시스템에서도)? 다른 유닉스 계열 시스템에서 사용할 수 있다고 가정 할 수 있습니까?

또한 whoami이러한 변수 중 하나를 읽는 대신 왜 사용하는지 궁금 합니다.


2
man페이지를 보면 whoami유효 사용자 ID와 연관된 이름이보고됩니다. 이것은 sudosetuid 실행 파일을 사용 하거나 실행하는 경우 다른 것을 반환한다는 의미 입니다. sudo설정 한 경우 sudo whoami예를 들어 보십시오 .
Joseph R.

4
USER그리고 USERNAME당신이 원한다면, 당신은 임의의 값으로 설정할 수 있습니다 수단 것이 보통 환경 변수입니다. 그냥 입력하십시오 USER=xyz. 즉, 해당 변수가 존재하더라도 해당 값이 현재 로그인 한 사용자 이름과 일치한다고 보장 할 수 없습니다.
Uwe

@Uwe By guarantee, 기본적으로 의미합니다 (즉, 사용자가 변경하지 않았다고 가정).
tshepang

2
의 결과를 비교 : 업 내 첫 코멘트에 다음과 같이 @Tshepang sudo whoamisudo echo $USER
조셉 R.

2
@JosephR. 들어 sudo echo $USER쉘 팽창, $USER, 다음 호출합니다 sudo. 따라서 물론 동일한 출력을 생성하지 않습니다 whoami. 마찬가지로 sudo whoami, sudo sh -c 'echo $USER'(일반적으로) 출력 않습니다 root. 관련하여 대한 의견 whoamiEUID를 사용하여 , 참고 sudo whoami출력 할 root경우에도 whoamiUID를 사용합니다. 실행되는 명령에 대해 EUID와 UID를 모두sudo 설정 합니다 (특별히 다르게 동작하도록 명시 적으로 구성한 경우는 예외). 비교 sudo id -usudo id -ru.
Eliah Kagan

답변:


29

그것은의 로그인 .

Linux login (1) 매뉴얼 페이지는 다음과 같이 말합니다.

의 값 $ HOME은 , $ USER , $ SHELL , $ PATH , $ LOGNAME , 및 $ MAIL는 암호 항목에 해당 필드에 따라 설정됩니다.

FreeBSD login (1) 매뉴얼 페이지는 다음과 같이 말합니다 :

로그인 유틸리티는 환경에 정보를 입력합니다 ( 와 환경을 (7) ) 사용자의 홈 디렉토리 (HOME), 명령 인터프리터 (SHELL), 검색 경로 (PATH), 터미널 유형 (TERM)와 사용자 이름을 지정 (LOGNAME와 사용자 모두) .

NetBSD의 , 오픈 BSDOS X 맨 페이지는 같은 일을 말한다.

다음 은 util-linux 로그인 의 소스 코드 입니다.

setenv("HOME", pwd->pw_dir, 0); /* legal to override */
setenv("USER", pwd->pw_name, 1);
setenv("SHELL", pwd->pw_shell, 1);
/* ... */
setenv("LOGNAME", pwd->pw_name, 1);

FreeBSD 로그인 의 소스 코드 는 다음과 같습니다 .

(void)setenv("LOGNAME", username, 1);
(void)setenv("USER", username, 1);
(void)setenv("PATH", rootlogin ? _PATH_STDPATH : _PATH_DEFPATH, 0);

2
Fedora 16 상자에 USERUSERNAME설정 이 모두 있고 명령이을 반환합니다 LOGNAME.
Joseph R.

1
@JosephR., 불행히도 나는 Fedora를 가지고 있지 않지만 FreeBSD의 소스도 조사했습니다. UPD.를 참조하십시오.
poige

그러나 이것은 페도라의 경우가 아닙니다. 내가 말하고 login있는 것은이 변수를 설정하는 유일한 것으로 보이지는 않습니다.
Joseph R.

1
Linux는 단지 커널 일 뿐이며 login명령 이 없습니다 . Linux를 커널로 사용하는 OS는 원하는 모든 구현을 자유롭게 사용할 수 있습니다. 예를 들어, 데비안 기반 시스템은 util-linux가 아닌 shadow-utils의 시스템을 사용하는 경향이 있습니다.
Stéphane Chazelas

1
login이상 로그인 할 때 자주 호출되지 않습니다 ssh또는 대부분의 그래픽 로그인 관리자에 의해.
Stéphane Chazelas

11

규칙이 없습니다. 일부 쉘은 좋아 tcsh하거나 zsh설정 $LOGNAME합니다. zsh세트 $USER.

그것은 같은으로 로그인 몇 가지로 설정할 수있다 login(호출로 getty같은 다른 것들에 의해 때때로 터미널에 때 로그인과 in.rlogind), cron, su, sudo, sshd, rshd, 그래픽 로그인 관리자 또는하지 않을 수 있습니다.

내 경험상 로그인이 있었다면 $USER일반적으로 설정되지만 (그 로그인 세션 내에서 setuid 명령을 통해 사용자 ID를 변경 한 후에는 업데이트되지 않을 수 있습니다.) POSIX는 $LOGNAME로그인시 설정 해야합니다 (및 cron).

로그인 이름을 이식 가능하게 얻으려면 logname명령 을 사용하는 것이 가장 좋습니다 (로그인이 없으면 아무 것도 반환하지 않을 수 있음). 사용자 ID를 얻으려면을 사용하십시오 id -u. 현재 유효 사용자 ID에 해당하는 하나의 사용자 이름을 가져 오려면 다음을 수행하십시오 id -un. 그것들을 모두 얻으려면 (대부분 사용자 ID 당 하나의 사용자 이름 만 있지만 보장되지는 않습니다) :

perl -le 'while ($n = getpwent()) {print $n if getpwnam($n) == $>}'

비록 사용자 데이터베이스를 열거 할 수없는 시스템에서는 작동하지 않을 수 있습니다 (예를 들어 네트워크화 된 사용자 데이터베이스에서 때때로 발생하는 것처럼).


3

POSIX 표준 에 의존하고 싶을 것입니다. 때때로 사용자 로그인 ( login프로그램에서 관리하는 것 )뿐만 아니라 cron작업 등에 관심이 있기 때문입니다.

따라서 POSIX에는 필요 $LOGNAME하지만 그렇지는 않다는 것을 알아야합니다 $USER. 예를 들어 Keith Thompson$USER답변 에서 지적한 것처럼 cron에 의해 설정되지 않을 수도 있습니다 .Kitson Thompson 은 System-V vs BSD의 역사와 관련이있는 몇 가지 역사를 참조합니다.

... 적어도 내 시스템 (Ubuntu 14.04)에서 $ USER 환경 변수가 cron 작업에 설정되어 있지 않습니다. 대신, 크론 작업 환경의 일부인 $ LOGNAME을 사용할 수 있습니다.

에 따르면 싸다 (7) man 페이지 (을 읽을 수있는 형 남자와 환경), $ USER는 BSD에서 파생 된 프로그램에 의해 사용되며, $ LOGNAME은 시스템-V 파생 프로그램에서 사용됩니다.


1

환경 변수 ( whoami또는 getpwent및 대신)를 사용하고 getpwnam모든 * NIX 시스템에서 항상 동일한 방식으로 설정되어 있는지 확실하지 않은 경우 bash에서 다음을 시도하십시오.

THIS_USER=${USER:-${USERNAME:-${LOGNAME}}}
echo ${THIS_USER}

그래도 여전히 비어 있으면 다소 난해한 시스템에있는 것입니다. ;)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.