sudo가 예상대로 bashrc를 실행하지 않습니다.

sudo가 예상대로 bashrc를 실행하지 않습니다.

전반적인 문제는 로그인할 때 /etc/bashrc에 따라 프롬프트 형식이 올바르게 지정되지만 bash를 사용하여 다른 사용자에게 sudo를 실행하면 프롬프트가 이상해진다는 것입니다.

/etc/bashrc의 기본 형식

PROMPT_COMMAND='printf "\033]0;%s@%s:%s\007" "${USER}" "${HOSTNAME%%.*}" "${PWD/#$HOME/~}"'

...그리고...

prompt_host=`/bin/hostname`

주문하다:

myuser로 터미널에 로그인합니다. 내 프롬프트의 형식은 적절하며 위의 /etc/bashrc와 일치합니다.

[email protected] pwd :

위의 내용은 내 기본 쉘 프로그램이 bash인 것처럼 보이지만 sh를 사용하고 있다고 생각합니다.

echo $SHELL     <---not very meaningful but I expect someone will ask me to run this
/bin/sh

ps -p `echo $$`
  PID TTY          TIME CMD
 7105 pts/2    00:00:00 sh     <---which looks to be an interactive shell (no dash)

ps -f
UID        PID  PPID  C STIME TTY          TIME CMD
72338     9321  9320  0 01:07 pts/3    00:00:00 -sh   <---or is it a login shell????

./filethatsnotthere.sh
-sh: ./filethatsnotthere.sh: No such file or directory

마지막으로 중요한 것은...

getent passwd myuser
myuser:x:72338:25000:My Name:/home/myuser:/bin/sh

또한 /etc/profile의 소스가 다음과 같은 이유임이 분명합니다.

echo $prompt_host
the.hostname.fully.qualified

따라서 sh 및 /etc/profile을 가져오는 것 같습니다. 그런데 이게 헷갈리네요...

 ls -l `which sh`
lrwxrwxrwx. 1 root root 4 Jan 12  2018 /bin/sh -> bash

...한숨... 하지만 내가 sh를 사용한다는 이론을 따른다고 해도 bash를 사용하여 newuser에게 sudo를 사용하겠습니다. newuser에는 /etc/bashrc에서 제공되는 newuser .bashrc에서 제공되는 newuser .bash_profile로 설정된 구성 파일이 있습니다.

그러나 newuser 프롬프트가 작동하지 않으며 newuser 프로필이 실행되고 있지 않은 것 같습니다. 프롬프트에서 호스트 이름이 완전히 손실되었습니다.

sudo -u newuser bash
newuser@ pwd         <---no hostname

실행될 때 확인하기 위해 거기에 echo 문을 넣었는데 표시되지 않기 때문에 실행 중인 새로운 사용자 프로필이 없다는 것을 알고 있습니다. 그럼에도 불구하고 newuser가 실제로 bash를 실행하고 있음을 확인했습니다.

ps -f
UID        PID  PPID  C STIME TTY          TIME CMD
newuser  11717 11715  0 03:47 pts/1    00:00:00 bash

ps -p `echo $$`
  PID TTY          TIME CMD
11717 pts/1    00:00:00 bash

./filethatsnotthere.sh
bash: ./filethatsnotthere.sh: No such file or directory

/etc/profile이 실행되고 있지 않습니다(로그인 쉘이 아니라 대화형 쉘이기 때문에 의미가 있음):

echo $prompt_host
<crickets....>

하지만 - newuser의 시작 파일도 /home/newuser 디렉토리에 없습니다... 그렇다면 sudo 명령을 사용하여 사용자를 bash하면 왜 해당 사용자에 대한 bash 프로필을 얻지 못합니까? 대화형 셸이기 때문에 /etc/profile을 직접 가져오지 않더라도 새 사용자의 파일을 계속 실행하고 싶습니다.

답변1

sudo$HOME사용자 전환 시 신규 사용자와 일치하도록 설정하거나 일치하지 않도록 설정할 수 있습니다 . 귀하의 경우에는 전환하지 않도록 설정되어 있는 것 같습니다 $HOME. 특정 서비스 애플리케이션 전용 사용자 계정으로 전환하고 싶지만 계속 사용하고 싶을 때 유용합니다.당신의개인 쉘 구성 및 기타 설정.

실제로 ~/.bashrc는 의 약어일 뿐입니다 $HOME/.bashrc.

따라서 그렇게 할 때 사용자 이름을 으로 전환하되 sudo -u newuser bash여전히 로 설정하십시오 .sudonewuser$HOME/home/myuser

bash실행하려고 할 때 ~/.bashrc작은 문제가 있습니다 . as newuser, 명시적으로 액세스 권한을 부여하지 않으면 읽기 권한이 없을 수 있습니다 /home/myuser/.bashrc. 그렇지 않은 경우 아마도 .bashrc건너뛴 이유일 것입니다. $HOME여전히 으로 설정되어 있으므로 실행 /home/myuser이 시도되지 않습니다 /home/newuser/.bashrc.

sudo설정 하려면 HOME=/home/newuser다음을 수행하세요.

  • -Hsudo 명령과 함께 이 옵션을 사용합니다.sudo -Hu newuser bash
  • 또는 Defaults>newuser always_set_home파일에 추가하여 다음으로 전환할 때 sudoers자동으로 홈 디렉터리를 설정하세요.newuser
  • Defaults:myuser always_set_home또는 명령을 실행할 때 새 ID와 일치하도록 홈 디렉터리를 자동으로 설정 하려면 sudoers 파일에 추가하세요.myusersudo
  • 또는 Defaults always_set_homesudoers 파일에 추가하여 sudo시스템의 모든 명령에 대해 이 동작을 강제합니다. (일부 Linux 배포판에서는 이 기능을 기본적으로 활성화합니다.)

사용자를 전환할 때 홈 디렉터리를 특별히 전환하지 않으려면 새 사용자가 개인 셸 시작 파일을 읽을 수 있는지 확인해야 합니다.

sudo -u newuser bash실행을 허용하는 데 필요한 최소 권한은 /home/myuser/.bashrc다음과 같습니다.

  • 검색 권한/home/myuser
  • 읽기 권한/home/myuser/.bashrc

둘 다에 공통된 편리한 사용자 그룹이 없고 ACL을 사용할 수 없는 경우 myuser( newuser즉, 기존 Unix 스타일 권한만 해당) 이는 전통적인 접근 방식입니다.

chmod 711 /home/myuser          # i.e. directory permissions drwx--x--x
chmod 644 /home/myuser/.bashrc  # i.e. file permissions      -rw-r--r--

홈 디렉토리가 포함된 파일 시스템에 ACL을 사용할 수 있는 경우 다음을 수행하여 필요한 최소한의 액세스 권한을 부여할 수 있습니다.

setfacl -m u:newuser:x /home/myuser
setfacl -m u:newuser:r /home/myuser/.bashrc

홈 디렉토리의 권한이 처음에 있었다면 drwx------이 명령 이후의 권한은 /home/myuser다음과 같습니다 drwx--x---+. 전체 ACL을 확인하려면 다음을 사용하세요 getfacl.

$ getfacl /home/myuser
getfacl: Removing leading '/' from absolute path names
# file: home/myuser
# owner: myuser
# group: myuser
user::rwx
user:newuser:--x
group::---
mask::--x
other::---

관련 정보