질문:
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
나는 스크립트가 있는 디렉토리이고 서버를 업데이트하는 데 필요한 파일이 존재하는 경우 덮어쓰기 때문에 현재 숨겨진 파일에서 어디에서나 내 스크립트를 사용할 수 있기를 원합니다 ..bashrc
dir
$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
쉘이 변수를 확장합니다. 쉘이 특정 변수를 확장하는 것을 원하지 않으면 로 인용하십시오 \$
.