스크립트의 sudo/EOF 절 내에서 스크립트 변수 및 환경 변수에 액세스하는 방법...BASH

스크립트의 sudo/EOF 절 내에서 스크립트 변수 및 환경 변수에 액세스하는 방법...BASH

질문:

cp변수가 존재하지 않기 때문에 항상 오류가 발생하는 이 문제로 어려움을 겪고 있습니다 .

이것은 내 코드입니다.

if [ ! -z "$USER1" ]
then
     sudo -u "$USER1" bash <<'EOF'
     sleep 5
     BASHRC=.bashrc
     cp "$BASHRC" "$HOME"/.bashrc
     sleep 5
     wget https://raw.github.com/trapd00r/LS_COLORS/master/LS_COLORS -O "$HOME"/.dircolors
     sleep 5
     echo 'eval $(dircolors -b $HOME/.dircolors)' >> "$HOME"/.bashrc
     . "$HOME"/.bashrc
     sleep 5
     echo "Here is LS_COLORS in action: "
     ls -l "$HOME"
EOF
fi

질문:

sudo 절(많음)에서 스크립트 변수와 환경 변수에 액세스할 수 있게 하려면 어떻게 해야 합니까?

이 문제가 있는 것이 sudo 또는 here-document입니까?

편집하다:

EOF에서 따옴표를 제거하면 이전 문제가 발생했습니다.

./testing3892739.sh billy
cp: failed to access '/root/.bashrc': Permission denied

편집 2:

이제 스크립트는 다음과 같습니다 ...

    if [ ! -z "$USER1" ]
108 then
109     sudo -i -u "$USER1" bash <<'EOF'
110     sleep 5
111     cp -f .bashrc "$HOME"/.bashrc
112     sleep 5
113     wget https://raw.github.com/trapd00r/LS_COLORS/master/LS_COLORS -O "$HOME"/.dircolors
114     sleep 5
115     echo 'eval $(dircolors -b $HOME/.dircolors)' >> "$HOME"/.bashrc
116     . "$HOME"/.bashrc
117     sleep 5
118     echo "Here is LS_COLORS in action: "
119     ls -l "$HOME"
120 EOF
121 fi

스위치가 지난 문제 -i에 영향을 미쳤습니다 sudo...하지만 늘 그렇듯이 시간이 꽤 지났고 다양한 오류가 발생 cp하여실수그것은

cp: '.bashrc' and '/home/billy/.bashrc' are the same file

파일이 존재하지만 덮어써야 합니다.

cp나는 스크립트가 있는 디렉토리이고 서버를 업데이트하는 데 필요한 파일이 존재하는 경우 덮어쓰기 때문에 현재 숨겨진 파일에서 어디에서나 내 스크립트를 사용할 수 있기를 원합니다 ..bashrcdir$HOME

답변1

따라서 (주석을 기반으로) 호출 디렉터리의 파일을 .bashrc참조 하는 대신 대상 사용자의 홈 디렉터리로 확장하려고 합니다. 나sudo$HOME생각하다이를 수행하는 방법은 다음을 사용하는 것입니다 -H.

 -H, --set-home
             Request that the security policy set the HOME environment
             variable to the home directory specified by the target user's
             password database entry.  Depending on the policy, this may
             be the default behavior.

표시하려면:

$ sudo -Hu testuser bash -c 'echo \$PWD = $PWD; echo \$HOME = $HOME' 
$PWD = /home/steeldriver/forums/tests
$HOME = /home/testuser

그리고 "일반" sudo $HOME구문 분석은 호출 사용자의 구문 분석입니다.

$ sudo -u testuser bash -c 'echo \$PWD = $PWD; echo \$HOME = $HOME'
$PWD = /home/steeldriver/forums/tests
$HOME = /home/steeldriver

로그인 쉘이 $HOME대상 사용자의 로그인 쉘로 확인되지만 작업 디렉토리도 변경되는 경우:

$ sudo -iu testuser bash -c 'echo \$PWD = $PWD; echo \$HOME = $HOME'
/home/testuser = /home/testuser
/home/testuser = /home/testuser

둘 다 귀하의 응용 프로그램에 매우 유용하지 않습니다.

이는 sudo완전히 구성 가능하며 기본 동작은 Unix/Linux의 특정 버전 및 배포판에 따라 달라질 수 있습니다.

답변2

당신은 을 사용하고 있습니다 <<'EOF'. 따옴표 없이 사용 하면 <<EOF쉘이 변수를 확장합니다. 쉘이 특정 변수를 확장하는 것을 원하지 않으면 로 인용하십시오 \$.

관련 정보