애플리케이션을 컴파일한 후 권한 상승 작업을 수행하는 데 사용되는 Bash 스크립트 또는 makefile

애플리케이션을 컴파일한 후 권한 상승 작업을 수행하는 데 사용되는 Bash 스크립트 또는 makefile

내 프로젝트에 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하고 다음을 수행해 보세요.

  1. 정기적으로 전화하십시오 build.sh.
  2. 부르다sudo deploy.sh

관련 정보