Bash에서 현재 사용자의 사용자 이름을 얻으려면 어떻게해야합니까?


321

Bash에서 사용자의 사용자 이름을 가져와야하는 프로그램을 작성 중입니다.

나는이라는 것을 들었지만 whoami그것이 무엇을 어떻게 사용하는지 전혀 모른다.

현재 사용자 이름을 얻기 위해 어떤 명령을 사용합니까?


지금까지 제안 된 방법 중 어느 것도 $ USER에 의존하거나 별도의 프로세스를 호출하지 않고는 작동하지 않는 것 같습니다. 별도의 프로세스를 호출하지 않고 사용자 이름을 얻기 위해 내장 된 bash가 있습니까?
ColinM

9
명령을들은 적이 있지만 사용 방법을 모르는 경우 man whoami일반적으로 확인은 문서를 확인하는 첫 번째 중지 지점입니다.
Mark Stosberg

답변:


470

명령 행에 다음을 입력하십시오.

whoami

또는

echo "$USER"

이 값을 변수에 저장하려면

myvariable=$(whoami)

또는

myvariable=$USER

물론 $USER변수가 목적 이기 때문에 변수를 만들 필요가 없습니다 .


53
ssh를 통해 다른 사용자로 명령을 실행하면 $ USER와 whoami가 다른 값을 반환한다는 점에 유의하십시오. whoami는 OS 사용자를 반환하고 $ USER는 ssh 사용자를 반환합니다.
BillMan

4
@ 빌맨, 그게 무슨 뜻입니까? 예를 들어 주시겠습니까?
Dejay Clayton

17
경우에 따라 $USER전혀 설정되어 있지 않습니다. 게다가 환경 변수 일 뿐이므로 사용자가이를 대체 할 수 있습니다.USER=thisisnotmyname bash -c 'echo $USER' # prints thisisnotmyname
sitaktif

1
@sitaktif이 문제에 대한 해결책으로 무엇을 제안 하시겠습니까?
SethMMorton

3
@SethMMorton 나는 보통보다 문제 소리가 나쁘다는 것을 알고 있습니다. 그러나 질문에 대답하기 위해 whoami(당신이 제안한대로) 사용 하면 재정의 된 환경 변수가 컨텍스트에서 잠재적 인 문제라고 가정하면 문제가 완전히 제거됩니다.
sitaktif

81

의 대안은 whoami입니다 id -u -n.

id -u사용자 ID를 반환합니다 (예 : root의 경우 0 ).


5
내가 잘못 생각하지 않는 한, id명령 으로서 이식성이 문제 -u이고 -n플래그가 posix

3
이것은 정말로 받아 들여지는 대답이어야합니다. "${USER}"그리고 whoami모두가 로그인하는 방법에 따라 달라집니다. 특히, 로그인 쉘과는 sudo는 $ USER 및 설정합니다 whoami표준 입력에 연결된 사용자의 모습을. 그러나 cron에서 배치 작업을 실행 중이거나 루트와 다른 사용자로 시작 스크립트를 실행중인 경우 잘못된 사용자 (루트)가 출력되거나 전혀 출력되지 않습니다. 이 답변은 프로세스의 사용자 ID를 보더라도 올바른 값을 반환합니다.
Asfand Qazi

아이디 대신 사용자 이름을 원하는 경우에는 유용하지 않습니다.
Jonathan

3
사실이 아닌 주석을 추가하기 전에 명령을 시도하면 -n, 원래 질문과 같이 인수가 사용자 이름을 인쇄한다는 것을 알 수 있습니다. 다음을 참조하십시오 : id -u -n인쇄 brett– 심지어 다윈에서도 가능합니다.
Brett

20

표준 Unix / Linux / BSD / MacOS 명령 logname을 사용하여 로그인 한 사용자를 검색하십시오. 이것은 신뢰할 수없는 기자이기 때문에 sudo뿐만 아니라 환경도 무시합니다. 항상 로그인 한 사용자 이름을 인쇄 한 다음 종료합니다. 이 명령은 약 1981 년부터 사용되었습니다.

My-Mac:~ devin$ logname
devin
My-Mac:~ devin$ sudo logname
Password:
devin
My-Mac:~ devin$ sudo su -
My-Mac:~ root# logname
devin
My-Mac:~ root# echo $USER
root

17

내가 솔라리스 9와 리눅스 에서 사용한 해킹 으로 둘 다 잘 작동합니다.

ps -o user= -p $$ | awk '{print $1}'

이 스 니펫은 현재 EUID를 가진 사용자 이름을 인쇄합니다.

노트: 여기서 통역사로 Bash가 필요합니다.

Solaris에서는 위에서 설명한 방법에 문제가 있습니다.

  • id-u-n매개 변수를 승인하지 않으므로 출력을 구문 분석해야합니다.
  • whoami 존재하지 않습니다 (기본적으로)
  • who am I 현재 터미널의 소유자를 인쇄합니다 (EUID 무시)
  • $USER변수는 프로파일 파일을 읽은 후에 만 ​​올바르게 설정됩니다 (예 /etc/profile:)

1
통역사로 bash가 필요한 이유는 무엇입니까? 표시된 명령 행에 아무것도 쉘에 특정한 것으로 보이지 않습니다. 사실 왜 awk를 통해 파이프를 포함합니까? 내가 알 수있는 한, 귀하의 ps명령은 현재 쉘의 pid 소유자를 표시하는 데 필요한 모든 것입니다.
ghoti

인간으로서 불필요한 정보를 무시하는 것은 당연합니다. awk 부분은 변수 또는 일반적으로 아직이 기초적인 수준에서 즉석 가정을 할 수없는 컴퓨터에 대한 원하는 데이터를 분리합니다.
BradChesney79

Solaris에서는 command -p id(POSIX 쉘에서) 또는을 사용하십시오 /usr/xpg4/bin/id. 보다 일반적으로, Solaris에서는 70s / 80의 명령이 걸리지 않도록 POSIX 환경 ( PATH=getconf PATH와 같은 환경 에서 실행하고 반드시 실행 /usr/xpg4/bin/sh)에 들어가 도록 환경을 수정하려고합니다 .
Stephane Chazelas

'PS : 알 수없는 옵션 - 오
아난드 Rockzz

12

두 가지 명령 :

  1. id 그룹과 함께 사용자 ID를 인쇄합니다. 체재:uid=usernumber(username) ...

  2. whoami 현재 사용자 이름을 제공합니다


1
$ whoami는 bash 에서 변수 로 사용할 수 없습니다 . 실제로 whoami 명령을 실행하려면 $ (whoami) 또는`whoami`를 수행해야합니다!
Rudolf Mayer

@RudolfMayer 나는 그것을 고쳤다
wjandrea

6

스크립트를 사용할 때 일반적으로 90 % 이상인 루트 (스도) 권한이 필요한 경우 이전 답변의 방법이 항상 답변으로 제공 root됩니다.

현재 "로그인 된"사용자를 얻는 것은 간단하지만 다른 변수에 액세스해야합니다 : $SUDO_UID$SUDO_USER.

그들은 반향 될 수 있습니다 :

echo $SUDO_UID
echo $SUDO_USER

또는 예를 들어 다음과 같이 할당됩니다.

myuid=$SUDO_UID
myuname=$SUDO_USER

6

에서 솔라리스 OS I이 명령을 사용 :

$ who am i     # Remember to use it with space.

Linux에서-누군가가 이미 의견에 답변했습니다.

$ whoami       # Without space

5

들어 강타 , 콘 셸 ( ksh), sh등, 질문의 대부분은 신속 중 하나에 의해 응답된다 :

man [function]

사용중인 시스템 또는보다 편리한 시스템에 대한 설명서를 얻으려면 :

구글 "남자 기능"

이것은 Linux와 Unix에 약간의 차이가있는 일부 경우에 다른 결과를 제공 할 수 있습니다.

이 질문에 대해서는 쉘에 "whoami"를 입력하십시오.

스크립트를 작성하려면 :

myvar=$(whoami)

2

현재 사용자의 사용자 이름은 ${parameter@operator}Bash 4.4에서 소개 된 매개 변수 확장으로 순수 Bash에서 얻을 수 있습니다 .

$ : \\u
$ printf '%s\n' "${_@P}"

에 저장된 마지막 인수를 설정하여 임시 변수 대신 :내장 true함수 (의 동의어 )가 사용됩니다 $_. 그런 다음 \u프롬프트 문자열이있는 것처럼 확장 ( )합니다.P 연산자를 .

이것은 일반적인 환경 변수 $USER처럼을 사용하는 것보다 낫습니다 $USER. 의도적으로 변경되지 않았어도 여전히 잘못된 경우는 로그인 쉘을 시작하지 않고 사용자를 전환 할 때입니다 ( su기본값).


1

대부분의 리눅스 시스템, 단순히 입력 whoami를 명령 줄에서하면 사용자 ID를 제공합니다.

그러나 Solaris에서는 아래 명령을 통해 로그인 한 사용자의 UID를 판별하여 사용자 ID를 판별해야합니다.

echo $UID

UID가 알려지면 UID를 /etc/passwd파일 과 일치시켜 사용자를 찾으십시오 .

cat /etc/passwd | cut -d":" -f1,3

고양이 / etc / passwd | cut -d ":"-f1,3 | grep $ UID | cut -d ":"
Andrew Taylor

-4

현재 작업의 user_struct를 가져옵니다

#define get_current_user()              \
({                                      \
    struct user_struct *__u;            \
    const struct cred *__cred;          \
    __cred = current_cred();            \
    __u = get_uid(__cred->user);        \
    __u;                                \
})

2
문제는 bash 스크립트 내에서 사용자 이름을 얻는 방법에 관한 것입니다. 이 답변은 Linux 커널 내부에서 실행되는 C 코드 (예 : 사용자 정의 Linux 커널 모듈)에서 숫자 사용자 ID (사용자 이름이 아님)를 얻는 방법에 관한 것입니다. 그것은 질문에 대한 답변이 아니라 다른 질문에 대한 답변입니다.
Simon Kissane
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.