プロジェクトにgolangベースのアプリケーションと関連するsystemdファイルがあります。私は以下を(基本的にこの順序で)自動化するのに役立つbashスクリプト(install.sh
)(またはそれがより良いオプションの場合はMakefile)に取り組んでいますが、アクセス許可の問題が発生しています:
目標:
Root以外のユーザーとしてアプリケーションバイナリのビルドを自動化する
Systemdファイルを正しいパスにコピーします(昇格された権限が必要です)
サービスを停止/開始して、更新されたアプリケーションをロードします(昇格されたアクセス許可が必要です)。
Bashスクリプトの理想的な手順:
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'
実行後、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つに分割します。
ルートとして実行する必要のないビルド用のもの。 (現在のinstall.sh
はbuild.sh
に名前が変更されます)
インストールするもの。rootとして実行する必要があります。 (実際のdeploy.sh
)。
そして、install.sh
と呼ばれる3番目のスクリプトを実行してみませんか。
build.sh
を呼び出します。Sudo deploy.sh
に電話する