Скажем, то, что у нас есть эта ситуация:
-rwxrwx-r- 1 user1 mygroup 0 Sep 12 16:53 testfile
Группа разработчиков работает над тем же VM (Linux). Я должен моделировать понятие контроля/регистрации. Если пользователь проверяет файл, никто не должен мочь записать в нем, пока он не регистрирует его.
Я пытался изменить владельца файла; каждый раз, когда пользователь хочет к контролю, он становится владельцем файла и предотвращает другой от записи до него и затем регистрируется путем изменения владельца файла на значение по умолчанию и задерживает полномочия на файле к значению по умолчанию. Это означает, что мне будет нужно chown
и chmod
но эти команды требуют sudo
и я не могу дать sudo
разрешение разработчикам.
Я могу дать пользователю возможность chown
и chmod
только определенный файл?
Необходимо будет записать сценарий, который проверяет на условия, и затем дайте пользователям sudo
доступ к одному только тому сценарию. Что-то как:
#! /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
, и неконтролируемые файлы принадлежат пользователю по умолчанию.Затем devs может сделать:
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)
Я соглашаюсь, что sccs (Система управления исходным кодом) включая исходную с начала 70-х мог бы быть хорошим решением для регистрации совместно используемые файлы, так как это поддерживает управление версиями, а также документацию изменений.
Как дополнение к предложению Zanna, короткому сценарию, который проверяет, является ли пользователь владельцем, то, в противном случае проверки, если у группы есть разрешение записи. Это означало бы, что в этом зарегистрировались. При наличии это было бы показанный затем изменять полномочия на 600 (файл занят). Для выпуска его он возвратил бы полномочия к 660. Таким образом имя владельца указало бы, кому заблокировали его или кто продержался, заблокировал его, и разрешение группы укажет, было ли это доступно или все еще используемо.