私のプロジェクトに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-FILE
1 つはルートと基本グループが所有し、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
。
このソリューションの欠点と潜在的な落とし穴が何であるかよくわかりません。したがって、本番環境で使用する前にいくつかのテストを実行してください。
答え2
スクリプトを2つの部分に分けましょう。
1つをビルドするには、rootとして実行する必要はありません。 (現在の名前が
install.sh
変更されますbuild.sh
)1つをインストールしてrootとして実行する必要があります。 (本物
deploy.sh
)。
そして3番目のスクリプトを呼び出して、次のことをinstall.sh
試してみてください。
- 定期的に電話してください
build.sh
。 - 呼ぶ
sudo deploy.sh