Bash에서 사용자의 사용자 이름을 가져와야하는 프로그램을 작성 중입니다.
나는이라는 것을 들었지만 whoami그것이 무엇을 어떻게 사용하는지 전혀 모른다.
현재 사용자 이름을 얻기 위해 어떤 명령을 사용합니까?
man whoami일반적으로 확인은 문서를 확인하는 첫 번째 중지 지점입니다.
Bash에서 사용자의 사용자 이름을 가져와야하는 프로그램을 작성 중입니다.
나는이라는 것을 들었지만 whoami그것이 무엇을 어떻게 사용하는지 전혀 모른다.
현재 사용자 이름을 얻기 위해 어떤 명령을 사용합니까?
man whoami일반적으로 확인은 문서를 확인하는 첫 번째 중지 지점입니다.
답변:
명령 행에 다음을 입력하십시오.
whoami
또는
echo "$USER"
이 값을 변수에 저장하려면
myvariable=$(whoami)
또는
myvariable=$USER
물론 $USER변수가 목적 이기 때문에 변수를 만들 필요가 없습니다 .
$USER전혀 설정되어 있지 않습니다. 게다가 환경 변수 일 뿐이므로 사용자가이를 대체 할 수 있습니다.USER=thisisnotmyname bash -c 'echo $USER' # prints thisisnotmyname
whoami(당신이 제안한대로) 사용 하면 재정의 된 환경 변수가 컨텍스트에서 잠재적 인 문제라고 가정하면 문제가 완전히 제거됩니다.
의 대안은 whoami입니다 id -u -n.
id -u사용자 ID를 반환합니다 (예 : root의 경우 0 ).
"${USER}"그리고 whoami모두가 로그인하는 방법에 따라 달라집니다. 특히, 로그인 쉘과는 sudo는 $ USER 및 설정합니다 whoami표준 입력에 연결된 사용자의 모습을. 그러나 cron에서 배치 작업을 실행 중이거나 루트와 다른 사용자로 시작 스크립트를 실행중인 경우 잘못된 사용자 (루트)가 출력되거나 전혀 출력되지 않습니다. 이 답변은 프로세스의 사용자 ID를 보더라도 올바른 값을 반환합니다.
-n, 원래 질문과 같이 인수가 사용자 이름을 인쇄한다는 것을 알 수 있습니다. 다음을 참조하십시오 : id -u -n인쇄 brett– 심지어 다윈에서도 가능합니다.
표준 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
내가 솔라리스 9와 리눅스 에서 사용한 해킹 으로 둘 다 잘 작동합니다.
ps -o user= -p $$ | awk '{print $1}'
이 스 니펫은 현재 EUID를 가진 사용자 이름을 인쇄합니다.
노트: 여기서 통역사로 Bash가 필요합니다.
Solaris에서는 위에서 설명한 방법에 문제가 있습니다.
id-u및 -n매개 변수를 승인하지 않으므로 출력을 구문 분석해야합니다.whoami 존재하지 않습니다 (기본적으로)who am I 현재 터미널의 소유자를 인쇄합니다 (EUID 무시)$USER변수는 프로파일 파일을 읽은 후에 만 올바르게 설정됩니다 (예 /etc/profile:)ps명령은 현재 쉘의 pid 소유자를 표시하는 데 필요한 모든 것입니다.
command -p id(POSIX 쉘에서) 또는을 사용하십시오 /usr/xpg4/bin/id. 보다 일반적으로, Solaris에서는 70s / 80의 명령이 걸리지 않도록 POSIX 환경 ( PATH=getconf PATH와 같은 환경 에서 실행하고 반드시 실행 /usr/xpg4/bin/sh)에 들어가 도록 환경을 수정하려고합니다 .
두 가지 명령 :
id 그룹과 함께 사용자 ID를 인쇄합니다. 체재:uid=usernumber(username) ...
whoami 현재 사용자 이름을 제공합니다
스크립트를 사용할 때 일반적으로 90 % 이상인 루트 (스도) 권한이 필요한 경우 이전 답변의 방법이 항상 답변으로 제공 root됩니다.
현재 "로그인 된"사용자를 얻는 것은 간단하지만 다른 변수에 액세스해야합니다 : $SUDO_UID및 $SUDO_USER.
그들은 반향 될 수 있습니다 :
echo $SUDO_UID
echo $SUDO_USER
또는 예를 들어 다음과 같이 할당됩니다.
myuid=$SUDO_UID
myuname=$SUDO_USER
현재 사용자의 사용자 이름은 ${parameter@operator}Bash 4.4에서 소개 된 매개 변수 확장으로 순수 Bash에서 얻을 수 있습니다 .
$ : \\u
$ printf '%s\n' "${_@P}"
에 저장된 마지막 인수를 설정하여 임시 변수 대신 :내장 true함수 (의 동의어 )가 사용됩니다 $_. 그런 다음 \u프롬프트 문자열이있는 것처럼 확장 ( )합니다.P 연산자를 .
이것은 일반적인 환경 변수 $USER처럼을 사용하는 것보다 낫습니다 $USER. 의도적으로 변경되지 않았어도 여전히 잘못된 경우는 로그인 쉘을 시작하지 않고 사용자를 전환 할 때입니다 ( su기본값).
에 대부분의 리눅스 시스템, 단순히 입력 whoami를 명령 줄에서하면 사용자 ID를 제공합니다.
그러나 Solaris에서는 아래 명령을 통해 로그인 한 사용자의 UID를 판별하여 사용자 ID를 판별해야합니다.
echo $UID
UID가 알려지면 UID를 /etc/passwd파일 과 일치시켜 사용자를 찾으십시오 .
cat /etc/passwd | cut -d":" -f1,3
현재 작업의 user_struct를 가져옵니다
#define get_current_user() \
({ \
struct user_struct *__u; \
const struct cred *__cred; \
__cred = current_cred(); \
__u = get_uid(__cred->user); \
__u; \
})