アプリケーションのコンパイル後に特権昇格操作を実行するために使用されるBashスクリプトまたはmakefile

アプリケーションのコンパイル後に特権昇格操作を実行するために使用されるBashスクリプトまたはmakefile

私のプロジェクトにgolangベースのアプリケーションと関連するシステムファイルがあります。次のタスク(デフォルトではこの順序で)を自動化するのに役立つbashスクリプト(またはこれがより良い選択である場合はMakefile)を開発していますが、権限の問題が発生しましたinstall.sh

ターゲット:

  • 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

ベストアンサー1

良い質問。考えられる解決策の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-FILE1 つはルートと基本グループが所有し、REGULAR-FILEもう 1 つは一般ユーザーと基本グループが所有します。

$ 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

このソリューションの欠点と潜在的な落とし穴が何であるかよくわかりません。したがって、本番環境で使用する前にいくつかのテストを実行してください。

おすすめ記事