banner
李大仁博客

李大仁博客

天地虽大,但有一念向善,心存良知,虽凡夫俗子,皆可为圣贤。

CentOS使用run-as-user.shで実行環境のユーザーの異なる問題を処理します。

多くの場合、デプロイされた実行環境のユーザーと実際に実行されるユーザーは異なります。環境の制約により、次のシナリオに遭遇した場合、問題が発生し、実行を実現するためにスクリプトを作成する必要があります。 1. su や sudo を使用できない場合 2. ユーザーがログインをサポートしていない場合、例えば nobody やサービスユーザーのような場合 3. Docker などのコンテナを使用する場合 4. SSH でリモートコマンドを実行するが、ログインユーザーを使用できない場合

前提条件 1. 実行ユーザーのユーザー名、ユーザーグループ、およびパスワードが必要です。 2. 実行ユーザーの PUID と PGID が必要です。

実行する前に、コード内の実際の実行ユーザーを変更してください。また、ユーザーが存在することを確認してください。

./run-as-user.sh コマンド コマンドの引数

#!/bin/sh

##############################################################################

PUID/PGID 環境変数が存在する場合、それらの値を `uid` と `gid` としてスクリプトを実行する際に使用し、#

そうでなければ、dev ユーザーの uid と gid をプロジェクトディレクトリの所有者と一致させ、そのユーザーとしてコマンドを実行します。#

~/.ssh ディレクトリが存在し、それが root 以外の所有である場合は、代わりにそのユーザーとして切り替えて実行します。#

##############################################################################

stat_dir="/app"
if [ -d "/home/dev/.ssh" ] && [ "0" != "$(stat -c '%g' /home/dev/.ssh)" ] && [ "0" != "$(stat -c '%u' /home/dev/.ssh)" ]; then
stat_dir="/home/dev/.ssh"
fi

PUID 環境変数が存在する場合、それを優先するユーザー ID として扱います。そうでなければ、$stat_dir を使用します。#

if [ "" != "$PUID" ]; then
uid=$PUID
else
uid=$(stat -c '%u' $stat_dir)
fi

PGID 環境変数が存在する場合、それを優先するグループ ID として扱います。そうでなければ、$stat_dir を使用します。#

if [ "" != "$PGID" ]; then
gid=$PGID
else
gid=$(stat -c '%g' $stat_dir)
fi

指定された UID がイメージ内で既に存在している場合、sudoers ファイルに正しいユーザー ID が利用可能であることを確認します。#

id -nu $uid > /dev/null 2>&1
if [ 0 -eq $? ]; then
echo "$(id -nu $uid) ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers
fi

指定された UID/GID の値で dev ユーザーを更新します。#

groupmod -g $gid -o dev > /dev/null 2>&1
usermod -u $uid -o dev > /dev/null 2>&1
chown -R dev ~dev/ > /dev/null 2>&1

このスクリプトへの循環呼び出しを防止します(レガシーサポート)#

cmd="$@"
cmda=`expr "x$cmd" : "x.\{0\}\(.\{0,12\}\)"`
cmdb=`expr "x$cmd" : "x.\{1\}\(.\{1,12\}\)"`

while [ "/run-as-user" = "${cmda}" ] || [ "/run-as-user" = "${cmdb}" ]; do
shift
cmd="$@"
done

sudo -u dev $@

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。