背景
下記のような環境構築コマンドで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 sudoHow to find owner and group of a directory?
0 件のコメント :
コメントを投稿