2017-03-17 1 views
0

나는 ~가 HOME 변수를 참조한다는 것을 최근에 알게되었습니다.덮어 쓴 홈 변수

foo는/서류 : 가장 좋은 방법은 무엇 해당 파일이나 디렉토리

그때 HOME =/foo는 설정하고 경우에 따라서, 그 말을 끝으로 CD ~/문서 싶은 bash는 스크립트를 사용하려고 이러한 상황에서? 사용자가 HOME을 덮어 쓰다가 충돌하고 불평합니까? 아니면 HOME의 기본값을 복구 할 수있는 방법이 있습니까?

+0

상황에 따라 다릅니다. 많은 도구에서 환경 변수는 인터페이스의 일부 (예 :'LC_ *'및 로케일)를 형성하며 사용자가 명시 적으로 설정할 수 있도록 허용하려고합니다.'sudo'와 같은 다른 경우에는 예상치 못한 일들이 일어나지 않도록 환경을 제거하기를 원합니다. 당신 스크립트로 뭐하고 있니? –

+0

'HOME'을 변경하면 응용 프로그램이 해당 디렉토리를 홈 디렉토리로 취급하게됩니다. 소원을 무시하는 것은 귀하의 책임이 아닙니다. – Barmar

+0

다른 복구 옵션은'$ HOME'을 사용하여 표준 위치에서'/ home/$ USER'를 테스트하고'$ HOME'를 복원하려고한다면 이것을 사용할 수 있습니다. 이제는 스크립트 내에서 수행 할 수 없으며 쉘에 영향을 미치지 않습니다. 스크립트가 실행하는 프로세스의 환경은 변경할 수 있지만 상위는 변경할 수 없습니다. 따라서 사용자가 스크립트 내에서'$ HOME'을 바꾼다면 @ Barmar의 코멘트로 가십시오. –

답변

1

나는이 문제를 파일에 액세스하는 다른 문제처럼 다루어야한다고 생각합니다. 액세스하려는 파일이 존재하지 않거나 디렉토리에 파일을 작성하려고하지만 할 수없는 경우, 오류 메시지를 인쇄합니다. 응용 프로그램을 작동하는 것이 중요 할 경우 오류를보고 한 후 종료됩니다.

알고있는 한, 사용자의 홈 디렉토리를 사용해야하는 대부분의 응용 프로그램은 단지 HOME 환경 변수를 사용하지만 두 번째 추측을 시도하지 않습니다.

보안상의 의미가 없어야합니다. 사용자는 여전히 파일에 액세스 할 수있는 적절한 권한이 필요하므로 HOME을 리디렉션하면 다른 사람이 작성해서는 안되는 파일을 쓸 수 없습니다. 응용 프로그램이 set-uid이면 상승 된 권한을 사용하지 않고 사용자의 디렉토리에서 파일을 열 때 항상 사용자 ID로 되돌려 야합니다.

1

사용자 홈 디렉토리의 진실은 사용자의 이름, 홈 디렉토리 및 기타 정보가 나열된 시스템의 모든 사용자에 대한 행을 포함하는 /etc/passwd입니다. 귀하의 질문에 "무슨 일이 아무개의 홈 디렉토리입니다?"인 경우에, 당신은 /etc/passwd에서 그것을 찾아야한다. * 그러나

, 사용자가 다른 경로로 $HOME를 사방 경우 /etc/passwd이 정확하지만, 그들은 "진짜"홈 디렉토리 대신에 그 값을 사용하기를 원할 수도 있습니다. 사용자가 홈 디렉토리를 스푸핑 할 수있는 보안 문제가 없다면 사용자가 제공 한 값을 맹목적으로 사용하는 것이 좋습니다.

개인적으로 $HOME이 (예 : if [[ -d "$HOME" ]]) 디렉토리인지 확인하고있는 경우 그대로 사용하십시오. 그렇지 않은 경우 grepcut을 사용하여 /etc/passwd을 구문 분석하십시오. 사용자에게 $HOME이 좋지 않음을 알리는 경고가 stderr에 인쇄되어있을 수 있습니다. id -u에 의해 인쇄 된 UID에 대해 grep 할 수 있습니다. 루트가 아닌 사용자는 그 값을 사용할 수 없습니다.

당신이 정말로 약 $HOME가 사방되고 걱정하지만, 당신은 또한에 대한 $PATH$LC_* 변수, 다양한 문제를 일으킬 수있는 몇 가지 다른 환경 변수를 걱정해야려고하는 경우에. 궁극적으로 보안 문제가없는 한 이러한 변수가 올바른 것으로 가정하고 그대로 사용하는 것이 더 쉽습니다. 즉, 은 맹목적으로 $HOME을 사용하고 잘못된 점에 대해 너무 걱정하지 않아도됩니다.

* LDAP 또는 유사한 네트워크 시스템을 사용하여 계정을 관리하는 시스템에서는 사용자의 계정이 여기에 나열되지 않을 수 있습니다. 경우에 따라 /etc/passwd.cache 또는 유사 사용자가있을 수 있지만 모든 시스템에서 작동하는 것은 아닙니다. strace(1)whoami(1)에 올리면이 정보의 출처를 알 수 있습니다.

+0

'/ etc/passwd'에 어떤 줄이 있습니까? '$ USER'와'$ LOGNAME'도 덮어 쓸 수 있습니다. – Barmar

+0

@Barmar : 고마워, 고쳤다. – Kevin

+0

동일한 사용자 ID를 가진 사용자가 여러 명있을 수 있습니다. 사용자 이름은 로그인 할 때'/ etc/passwd' 행을 선택하는 데 사용됩니다. 나는'whoami'가'/ var/run/utmp'에서 현재 터미널과 관련된 사용자 이름을 찾은 것으로 생각합니다. – Barmar

관련 문제