내 프로젝트에 golang 기반 애플리케이션과 관련 시스템 파일이 있습니다. 다음 작업(기본적으로 이 순서대로)을 자동화하는 데 도움이 되는 bash 스크립트(또는 이것이 더 나은 선택인 경우 Makefile)를 개발 중이지만 install.sh
권한 문제가 발생했습니다.
표적:
루트가 아닌 사용자로 애플리케이션 바이너리를 자동으로 빌드
systemd 파일을 올바른 경로에 복사합니다(높은 권한 필요)
업데이트된 애플리케이션을 로드하려면 서비스를 중지/시작하세요(상승된 권한 필요).
Bash 스크립트의 이상적인 단계:
- sudo/권한이 없는 사용자로 기존 바이너리를 삭제하고 다시 빌드하세요
go build -o binary_name .
. 이 단계는 내 사용자로 실행해야 합니다. (코드를 sudo로 컴파일하는 것은 좋은 생각이 아닙니다.) - 권한 상승
- 기존
/etc/systemd/system/binary_name.service
파일을 삭제합니다. - 업데이트될 경우를
binary_name.service
대비해 파일을 복사하세요 ./etc/systemd/system/binary_name.service
- 서비스 를 중지했다가 다시 시작하십시오
binary_name
.
내가 겪고 있는 문제: - 를 실행하면 sudo install.sh
"sudo/root로 컴파일하지 않음" 문제가 발생합니다. 또한 go
환경 설정이 다르기 때문에 패키지를 찾을 수 없습니다. - sudo 없이 실행할 경우 install.sh
스크립트가 서비스 파일을 삭제/복사하려고 할 때 권한 문제가 있습니다.
다음은 현재 스크립트의 축약된 버전입니다.
#!/bin/bash
case "$1" in
(das_application)
cd /usr/local/apps/das_application/
# rebuild das_application binary
echo "Removing old das_application binary"
rm das_application
echo "Building updated das_application binary"
go build -o das_application .
echo "Done building das_application binary"
echo "Stopping das_application service"
sudo systemctl stop das_application
echo "Copying das_application.service to /etc/systemd/system"
rm /etc/systemd/system/das_application.service
cp ./conf/das_application.service /etc/systemd/system/das_application.service
systemctl daemon-reload
echo "Starting das_application service"
systemctl start das_application.service
exit 1
;;
(*)
echo "Use as ./install.sh das_application"
exit 2
;;
esac
답변1
좋은 질문. 가능한 해결 방법 중 하나는 스크립트가 실행 중인지 확인 sudo
하고 그렇지 않은 경우 종료하여 일반 사용자로 실행해야 하는 명령을 실행할 수 있는 권한을 일시적으로 포기하는 것입니다. 이 같은:
#!/usr/bin/env sh
if [ -z "$SUDO_USER" ]
then
printf "Not running with sudo. Exiting\n"
exit 1
fi
touch SUDO-FILE
# drop privileges temporarily
su "$SUDO_USER" -c 'touch REGULAR-FILE'
실행 후에는 2개의 파일을 볼 수 있습니다. SUDO-FILE
하나는 루트와 기본 그룹이 소유하고 REGULAR-FILE
다른 하나는 일반 사용자와 기본 그룹이 소유합니다.
$ ls -Alhtr SUDO-FILE REGULAR-FILE
-rw-r--r-- 1 root root 0 Dec 5 21:06 SUDO-FILE
-rw-r--r-- 1 ja users 0 Dec 5 21:06 REGULAR-FILE
Slackware Linux 및 FreeBSD에서 테스트되었습니다. 또한 su -l
이를 사용하여 일반 사용자를 위한 쉘 로그인 스크립트를 얻을 수도 있습니다(예: ) ~/.profile
.
이 솔루션의 단점과 잠재적인 함정이 무엇인지 잘 모르겠습니다. 따라서 프로덕션에서 사용하기 전에 몇 가지 테스트를 수행하십시오.
답변2
스크립트를 두 부분으로 나누겠습니다.
하나를 빌드하려면 루트로 실행할 필요가 없습니다. (현재 이름이
install.sh
변경됩니다build.sh
)하나를 설치하고 루트로 실행해야 합니다. (진짜
deploy.sh
).
그리고 세 번째 스크립트를 호출 install.sh
하고 다음을 수행해 보세요.
- 정기적으로 전화하십시오
build.sh
. - 부르다
sudo deploy.sh