$HOME을 변경하지 않도록 Ubuntu에서 sudo를 어떻게 설정하고 이 동작을 비활성화하려면 어떻게 해야 합니까?

$HOME을 변경하지 않도록 Ubuntu에서 sudo를 어떻게 설정하고 이 동작을 비활성화하려면 어떻게 해야 합니까?

Ubuntu 12.04에서 sudo -s$HOME 변수가 변경되지 않아 일반 사용자라면 다음과 같은 regularuser상황이 됩니다.

$ cd
$ pwd
/home/regularuser
$ sudo -s
# cd
# pwd
/home/regularuser

오래 전에 Ubuntu를 포기했기 때문에 확신할 수는 없지만 이것이 기본 동작이라고 가정합니다. 그래서 내 질문은 다음과 같습니다.

  1. 당신은 그렇게 않았다 방법? 구성은 어디에 있나요?
  2. 어떻게 비활성화하나요?

편집하다: 답변해주셔서 감사합니다. 상황이 좀 더 명확해지긴 했지만, 제가 원하는 답변을 얻으려면 몇 가지 질문을 추가해야 할 것 같습니다.

  1. Debian에서는 sudo -s$HOME 변수를 로 변경합니다 /root. man sudo답변에서 얻은 내용과 실행한 셸은 sudo -s에 나와 있습니다 /etc/passwd.
  2. /etc/passwd그러나 Ubuntu와 Debian 모두 루트 쉘은 동일합니다 . 두 시스템 모두 $HOME에 관한 한 차이점이나 파일을 /bin/bash찾을 수 없으므로 동작이 다릅니다. .profile이것에 대한 도움이 있나요?.bashrcsudo -s

답변1

Sudo에는 많은 컴파일 타임 구성 옵션이 있습니다. 귀하의 버전에 나열된 설정을 사용할 수 있습니다 sudo -V. Debian wheezy와 Ubuntu 12.04의 구성 간의 차이점 중 하나는 HOME환경 변수가 Ubuntu에서는 유지되지만 Debian에서는 유지되지 않는다는 것입니다. 두 배포판 모두 안전하게 보관하도록 명시적으로 표시된 일부 환경 변수를 제외하고 모든 환경 변수를 제거합니다. 따라서 Ubuntu에는 남아 있지만 sudo -sDebian에서는 제거되어 대상 사용자의 홈 디렉터리로 설정됩니다.HOMEHOMEsudo

당신은 할 수 있습니다sudoers문서. 파일을 visudo편집하려면 실행하세요 . sudoers몇 가지 관련 옵션이 있습니다:

  • env_keep어떤 환경 변수가 유지되는지 결정합니다. Defaults env_keep += "HOME"호출자의 HOME환경 변수를 보존하거나 삭제하는 데 사용됩니다 Defaults env_keep -= "HOME"(그리고 대상 사용자의 홈 디렉터리로 대체).
  • env_reset환경 변수 재설정 여부를 결정합니다. 특정 명령 실행을 허용하는 규칙에는 환경 변수 재설정이 필요한 경우가 많지만, 임의 명령 실행을 허용하는 규칙에 대한 환경 변수 재설정에는 직접적인 보안상의 이점이 없습니다.
  • always_set_home설정하면 비활성화 HOME로 인해 유지되거나 목록 에 포함 되어 있어도 덮어쓰게 됩니다 . 이 옵션을 유지하지 않으면 아무런 효과가 없습니다 .env_resetHOMEenv_keepHOME
  • set_home와 비슷 always_set_home하지만 에만 적용되며 명시적 명령으로 호출할 때는 적용 sudo -s되지 않습니다 .sudo

이러한 옵션은 특정 소스 사용자, 특정 대상 사용자 또는 특정 명령에 대해 설정할 수 있습니다. sudoers자세한 내용은 설명서를 참조하세요.

HOME옵션을 전달하여 주어진 호출을 무시하도록 언제든지 선택할 수 있습니다 .sudo-H

쉘이 절대 덮어쓰지 않는 값입니다 HOME. ( HOME설정되지 않은 경우 설정되지만 sudo항상 HOME어떤 방식으로든 설정됩니다.)

를 실행하면 sudo -i초기 sudo로그인이 시뮬레이션됩니다. 여기에는 HOME대상 사용자의 홈 디렉터리를 설정하고 호출하는 작업이 포함됩니다 .로그인 쉘.

답변2

대화형 로그인 루트 쉘을 얻는 sudo -H -i대신 :sudo -s

sudo -H -i
cd
pwd -P  #  /private/var/root  (on Mac OS X 10.6.8)

에서 man sudo:

-H      The -H (HOME) option sets the HOME environment variable to
        the homedir of the target user (root by default) as
        specified in passwd(5).  By default, sudo does not modify
        HOME (see set_home and always_set_home in sudoers(5)).

답변3

이는 "로그인 쉘" 및 "비로그인 쉘"의 동작과는 관련이 없고 sudo"로그인 쉘"과 "비로그인 쉘"의 차이점과 더 관련이 있습니다. 빠른 수정은 다음과 같습니다.

$ sudo -i

알 수있는 바와 같이:

$ sudo -s
# id
uid=0(root) gid=0(root) groups=0(root)
# echo $HOME
/home/msw
# exit
$ sudo -i
# echo $HOME
/root
# pwd
/root

sudo 매뉴얼에 명시된 바와 같이 :

-i(초기 로그인 시뮬레이션) 옵션은 대상 사용자의 비밀번호 데이터베이스 항목에 지정된 쉘을 로그인 쉘로 실행합니다. 이는 쉘이 .profile 또는 .login과 같은 로그인별 리소스 파일을 읽는다는 것을 의미합니다. 명령이 지정되면 쉘의 -c 옵션을 통해 실행할 수 있도록 쉘에 전달됩니다. 명령이 지정되지 않으면 대화형 쉘이 실행됩니다.

답변4

Ubuntu와 Debian에서 각각 다른 동작을 제거하려면 래퍼를 sudo -s사용할 수 있습니다 (질문 4에 대한 답변).sudo

sudos() {
   local PATH="$(getconf PATH)" root_homedir
   root_homedir="$(sudo -H sh -c 'printf "%s" "$HOME"')"
   sudo sh -c 'export HOME="$0"; exec sh -i' "$root_homedir"
   return 0
}

sudo -k
sudos
{
logname
whoami
id -un
id -ur
echo "PATH: $PATH"
}
exit
echo "PATH: $PATH"

관련 정보