web-dev-qa-db-ja.com

スクリプトまたはmakefileをBashしてアプリケーションをコンパイルし、アクセス許可の昇格操作を実行します

プロジェクトにgolangベースのアプリケーションと関連するsystemdファイルがあります。私は以下を(基本的にこの順序で)自動化するのに役立つbashスクリプト(install.sh)(またはそれがより良いオプションの場合はMakefile)に取り組んでいますが、アクセス許可の問題が発生しています:

目標:

  • Root以外のユーザーとしてアプリケーションバイナリのビルドを自動化する

  • 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
2
Geuis

いい質問です。考えられる解決策の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'

実行後、rootとそのプライマリグループが所有するSudo-FILEと、通常のユーザーとそのプライマリグループが所有するREGULAR-FILEファイルの2つのファイルが表示されます。

$ 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

SlackwareLinuxおよびFreeBSDでテスト済み。 su -lなどの通常のユーザーのシェルログインスクリプトを取得する~/.profileを使用することもできます。

ただし、このソリューションにどのような欠点と考えられる落とし穴があるのか​​わかりません。本番環境で使用する前に、必ずいくつかのテストを実行してください。

2

スクリプトを2つに分割します。

  • ルートとして実行する必要のないビルド用のもの。 (現在のinstall.shbuild.shに名前が変更されます)

  • インストールするもの。rootとして実行する必要があります。 (実際のdeploy.sh)。

そして、install.shと呼ばれる3番目のスクリプトを実行してみませんか。

  1. 定期的にbuild.shを呼び出します。
  2. Sudo deploy.shに電話する
0
binarym