USER 님에게 HOME을받는 방법?


41

USER스크립트에 변수 가 있는데 변수를 HOME기반으로 경로 를보고 싶습니다 USER. 어떻게해야합니까?

답변:


72

정보가 /etc/passwdLDAP 와 같은 로컬 파일 또는 다른 방법 으로 저장되는지 여부에 관계없이 사용자 정보를 검색하는 유틸리티가 있습니다 . 이라고 getent합니다.

사용자 정보를 가져 오려면을 실행 getent passwd $USER합니다. 다음과 같은 줄이 다시 나타납니다.

[jenny@sameen ~]$ getent passwd jenny
jenny:*:1001:1001:Jenny Dybedahl:/home/jenny:/usr/local/bin/bash

이제 예를 들어 cut을 사용하여 홈 디렉토리를 간단히 잘라낼 수 있습니다.

[jenny@sameen ~]$ getent passwd jenny | cut -d: -f6
/home/jenny

getent는 특히 원격 사용자의 경우 더 나은 대답입니다. 간단한 시스템에서는 사용자가 충분해야합니다. 당신을 수정했습니다.
Rui F Ribeiro

@RuiFRibeiro의 ~foo변수와 함께 사용할 수 없습니다 bash. 어쨌든 직접적으로는 아닙니다.
muru December

1
@muru-맞습니다-그리고 명시된 행동입니다. 는 ~탭 확장하지만,에 보인다, 그리고 또 다른 spec'd 행동 물결표 접두사는 사용하여 얻은 로그인 이름과 관련된 초기 작업 디렉토리의 경로명으로 교체해야 getpwnam()기능을 그래서 아마 조회가 꽤 좋다고합니다. 나는 탭 확장을 좋아하지 않지만 탭을 입력하는 것을 좋아합니다.
mikeserv

1
이는 $ HOME 의 초기 값 만 가져옵니다 . 사용자의 로그인 스크립트는 다른 것으로 변경할 수있는 권한이 있습니다. 이것은 드문 일이지만 로컬 및 NFS 마운트 homedir 중에서 선택하는 등 합리적인 상황을 생각할 수 있습니다.
zwol

1
@HagenvonEitzen Colons는 들판을 분리하는 데 사용 되었기 때문에 정확하게 금지되어 있습니다.
Jenny D

9

eval누군가의 홈 디렉토리를 얻는 데 사용할 수 있습니다 .

eval echo "~$USER"

적어도 로컬 사용자에게는 이것이 확실합니다. LDAP와 같은 원격 사용자가으로 처리되는지 모르겠습니다 eval.


1
거기에 평가할 필요가 없습니다. 영어에주의하십시오.
Rui F Ribeiro

4
@nwk eval가 필요합니다. ~foo변수 확장 후 Bash가 처리되지 않습니다 .
muru December

1
흥미롭게도, 그러나 이것은 다른 사용자가 아닌 현재 사용자 의 디렉토리 만 가져옵니다 . LDAP 사용자는 처리되지 않지만 잘못 될 수 있다고 생각합니다.
Rui F Ribeiro

3
@RuiFRibeiro LDAP에서 잘 작동합니다 USER. 대신 LDAP 사용자의 사용자 이름이 포함 된 변수를 사용하십시오 .
muru December

3
그 검증없이 사용하지 마십시오 $USER으로 확장을 단지 알파벳 문자의 단일 문자열.
chepner

4

일반적인 장소는입니다 만 /home/$USER, 보편적 일 필요는 없습니다. 이러한 정보를 검색 할 수있는 확실한 장소는 파일 안에 있습니다 /etc/passwd.

해당 파일은 누구나 읽을 수 있으므로 누구나 읽을 수 있으므로 내용에 액세스 할 수 있습니다.
$ USER가 파일에 존재하면, 이전의 마지막 항목은 사용자 HOME 디렉토리입니다.

항목을 선택하고 HOME 디렉토리를 인쇄합니다.

awk -v FS=':' -v user="$USER" '($1==user) {print $6}' "/etc/passwd"

보다 복잡한 (원격) 시스템의 경우 getent는 NSS (Name Service Switch 라이브러리) 시스템에서 사용자 정보를 가져 오는 일반적인 명령입니다.

의 명령

echo $(getent passwd $USER )| cut -d : -f 6

동등한 정보를 제공합니다 (사용 가능한 경우).


2
당신은 ~ user를 가지고 있으며, 솔루션은 getent를 사용해야하는 LDAP에서 오는 사용자와 같은보다 복잡한 시스템의 사용자를 고려하지 않습니다.
Rui F Ribeiro

2

사용자가 존재하지 않으면 getent오류를 반환합니다.

종료 코드를 무시하지 않는 작은 쉘 함수는 다음과 같습니다 getent.

get_home() {
  local result; result="$(getent passwd "$1")" || return
  echo $result | cut -d : -f 6
}

사용 예는 다음과 같습니다.

da_home="$(get_home missing_user)" || {
  echo 'User does NOT exist!'; exit 1
}

# Now do something with $da_home
echo "Home directory is: '$da_home'"

1

루트로 로그인 USER했거나의 비밀번호 를 알고 있거나 USER비밀번호가없는 경우 다음은 또 다른 옵션입니다.

    su -c 'echo ~' ${USER}

표준 su동작에서 USERundefined 또는 empty 인 su경우 명령을 루트로 실행하려고합니다.

의 값이 USER유효한 사용자 이름이 아닌 경우 적절한 오류가 발생 su: user <user> does not exist합니다..

여기에 이미 많은 좋은 답변이 있지만 이것은 여전히 ​​누군가를 도울 수 있습니다.


시스템 구성에 따라 안전하지 않습니다. 해당 사용자로 프로세스 (쉘 실행 에코)를 실행하므로 사용자는 예를 들어 쉘을 ptrace하고 임의 출력을 제공 할 수 있습니다. 또한 사용자 설정에서 실행되므로 사용자 쉘 구성 파일이 실행될 수 있습니다 (임의의 출력도 가능함). 또는 pam을 통한 환경로드. 또는 SIGSTOP을 전송하는 것만 큼 간단한 작업을 수행하면 스크립트를 공격하는 DOS를 영원히 효과적으로 수행 할 수 있습니다.
derobert
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.