Terá de escrever um script que verifique as condições e, em seguida, atribua aos seus utilizadores sudo
acesso ao script that sozinho. Algo como:
#! /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 " 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
Salve isso como, por exemplo, /usr/local/bin/check
, adicione a seguinte regra sudoers
:
%dev ALL = (root) /usr/local/bin/check
Isso está assumindo:
- Os desenvolvedores estão todos no grupo
dev
(se não, use nomes de usuários ou grupos de acordo). - Os arquivos estão em
/some/dir
. Modifique$SOURCE_DIR
de acordo. - O usuário padrão é
nobody
e os arquivos não verificados são de propriedade do usuário padrão. - Ninguém tem permissões de gravação no diretório de origem, exceto root.
Então os desenvolvedores podem fazer:
sudo check some/file
para fazer o checkout de /some/dir/some/file
e executá-lo novamente para verificá-lo.