2022年4月3日日曜日

sudoで実行したスクリプトで、実行対象ディレクトリの所有者としてコマンドを実行する


背景

下記のような環境構築コマンドでsudoを使いつつも部分的にローカルユーザーとして実行したい場面に出くわしました。
sudo apt install python3-pip
pip3 install -r requirements.txt

試行錯誤したところディレクトリの所有者としてコマンドを実行する方法が分かったので、備忘録を兼ねて記事を残します。

使ったもの

bash環境
Ubuntu20.04のbash5.0.17で動作を確認しました。

ディレクトリの所有者を取得

statコマンドでディレクトリの所有者を取得できます。
DIR=.
OWNER=`stat -c %U $DIR`
echo $OWNER

コマンドをファイル上で実行する場合は、$0とdirnameとrealpathを組み合わせることで、そのファイルが存在するディレクトリのパスを取得できます。
DIR=$(dirname $(realpath $0))
echo $DIR

sudoコマンドの-uオプションを使って特定のユーザーとしてコマンドを実行

下記のコマンドで指定するユーザーでコマンドを実行できます。
sudo -u $OWNER some command to run as owner

余談 su -lでも特定のユーザーとしてコマンドを実行可能

sudoを呼べないけど管理者権限で実行している環境の場合は、下記のようにsuと-lオプションを利用しても実行できます。
ただし、suコマンドは指定するユーザーのホームディレクトリでコマンドが実行されるため、コマンド実行前にディレクトリの異動が必要になります。
su -l $OWNER -c "cd $DIR && some command to run as owner"

終わり

ということで、背景で紹介したコマンドは下記のようなshell scriptファイルでsudoとローカルユーザーの処理を両方実行できます。

#!/bin/bash

DIR=$(dirname $(realpath $0))
OWNER=`stat -c %U $DIR`

sudo apt install python3-pip
sudo -u $OWNER pip3 install -r requirements.txt

コマンドを1つのファイルにまとめられて嬉しいです。

参考

5.3. Running Commands as Another User via sudo
How to find owner and group of a directory?

0 件のコメント :