この状況があるとしましょう:
-rwxrwx-r- 1 user1 mygroup 0 Sep 12 16:53 testfile
開発者のグループが同じVM(Linux)に取り組んでいます。チェックアウト/チェックインの概念をシミュレートする必要があります。ユーザーがファイルをチェックアウトする場合、チェックインするまで誰もファイルを書き込めません。
ファイルの所有者を変更してみました。ユーザーがチェックアウトするたびに、ファイルの所有者になり、他のユーザーがファイルに書き込みできないようにし、ファイルの所有者をデフォルトに変更してチェックインし、ファイルのアクセス権をデフォルトに戻します。つまり、chown
とchmod
が必要ですが、これらのコマンドにはSudo
が必要であり、開発者にSudo
許可を与えることはできません。
特定のファイルのみをchown
およびchmod
する可能性をユーザーに与えることはできますか?
条件をチェックするスクリプトを作成してから、ユーザーにSudo
にthatスクリプトのみへのアクセス権を付与する必要があります。何かのようなもの:
#! /bin/bash
set -e
die()
{
printf "%s\n" "$@"
exit 1
}
if [[ $EUID != 0 ]]
then
die "This script must be run with Sudo."
fi
DEFAULT_USER=nobody
SOURCE_DIR=/some/dir
cd "$SOURCE_DIR"
# Get path of file relative to the source directory
# Then we can check if it is actually in the directory.
FILE=$(realpath -e --relative-base="$SOURCE_DIR" "${1?}")
if [[ $FILE == /* ]]
then
die "$1 is outside $SOURCE_DIR."
fi
FILE_OWNER=$(stat -c %U "$FILE")
case $FILE_OWNER in
$DEFAULT_USER)
# checkout
echo "Checking out $FILE..."
chown "$Sudo_USER" "$FILE"
;;
$Sudo_USER)
# checkin
echo "Checking in $FILE..."
chown nobody "$FILE"
;;
*)
die "Sorry, this file is checked out by $FILE_OWNER."
;;
esac
これを、たとえば/usr/local/bin/check
として保存し、次のsudoers
ルールを追加します。
%dev ALL = (root) /usr/local/bin/check
それは仮定しています:
dev
グループに属しています(そうでない場合は、ユーザー名またはグループを適宜使用してください)。/some/dir
にあります。それに応じて$SOURCE_DIR
を変更します。nobody
で、チェックされていないファイルはデフォルトのユーザーが所有しています。その後、開発者は次のことができます。
Sudo check some/file
/some/dir/some/file
をチェックアウトし、再度実行してチェックインします。
これを行うことができますが、おそらくこの種のコラボレーション向けに設計されたより実用的なソリューションがあると思います。
とにかく、ここで何をすべきかです:
グループを作成し、ユーザーをグループに追加し、グループに親ディレクトリへの書き込み許可を与えます。その後、chown
とchmod
を使用して、Sudo
を使用せずにファイルを作成できます。
デモンストレーション:
Sudo addgroup devs
Sudo adduser zanna devs
Sudo adduser pixie devs
mkdir development
chmod g+w development
Sudo chown root:devs development
touch development/testfile
cd development
Sudo chown root:devs testfile
これで設定は完了です。テストしてみましょう:
zanna@xubi:~/development$ chown $USER testfile
$ stat -C "%U %G" testfile
zanna devs
$ chmod 600 testfile
$ stat -c %a testfile
600
$ su pixie
[enter password...]
pixie@xubi:/home/zanna/development$ chown $USER testfile
$ stat -c %U testfile
pixie
など...しかし、これは、人々がchown
とchmod
の実行を開始する前にパーミッションをチェックするか、ファイルに書き込もうとする場合にのみ機能します。これはおそらく直感的ではありません...親ディレクトリに対する書き込み権限がある場合、使用するエディターによっては警告が表示されますが、常にファイルへの書き込みを強制できます。
ユーザーが次のSudo
コマンドを実行できる場合:
Sudo bash
彼は、任意のファイルのchown
を含む、任意のコマンドをルートとして実行できます。
特定のユーザーが特定のコマンドを実行できるように/etc/sudoers
を構成できます
例えば/etc/sudoers
で次の行を設定できます。
user2 ALL=(ALL) NOPASSWD: /bin/chown
user2 ALL=(ALL) NOPASSWD: /bin/chmod
注:誰かが
chown
およびchmod
をroot
として実行する能力を持っている場合、簡単にフルroot
アクセスを取得できます(たとえば、/etc/passwd)
70年代初期のオリジナルのものを含むsccs(ソースコード管理システム)は、バージョン管理と変更の文書を維持するため、共有ファイルをチェックインするのに適したソリューションであることに同意します。
Zannaの提案のアドオンとして、ユーザーが所有者であるかどうかを確認し、そうでない場合はグループに書き込み権限があるかどうかを確認する短いスクリプト。これは、チェックインされたことを意味します。使用可能な場合、権限を600に変更します(ファイルはビジーです)。それを解放するには、アクセス権を660に戻します。したがって、所有者名はそれをロックした人または最後にロックした人を示し、グループ許可はそれが利用可能かまだ使用中かを示します。