전반적인 문제는 로그인할 때 /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
여전히 로 설정하십시오 .sudo
newuser
$HOME
/home/myuser
bash
실행하려고 할 때 ~/.bashrc
작은 문제가 있습니다 . as newuser
, 명시적으로 액세스 권한을 부여하지 않으면 읽기 권한이 없을 수 있습니다 /home/myuser/.bashrc
. 그렇지 않은 경우 아마도 .bashrc
건너뛴 이유일 것입니다. $HOME
여전히 으로 설정되어 있으므로 실행 /home/myuser
이 시도되지 않습니다 /home/newuser/.bashrc
.
sudo
설정 하려면 HOME=/home/newuser
다음을 수행하세요.
-H
sudo 명령과 함께 이 옵션을 사용합니다.sudo -Hu newuser bash
- 또는
Defaults>newuser always_set_home
파일에 추가하여 다음으로 전환할 때sudoers
자동으로 홈 디렉터리를 설정하세요.newuser
Defaults:myuser always_set_home
또는 명령을 실행할 때 새 ID와 일치하도록 홈 디렉터리를 자동으로 설정 하려면 sudoers 파일에 추가하세요.myuser
sudo
- 또는
Defaults always_set_home
sudoers 파일에 추가하여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::---