Предположим, что у нас есть такая ситуация:
-rwxrwx-r- 1 user1 mygroup 0 Sep 12 16:53 testfile
Группа разработчиков работает на той же VM (Linux). Мне нужно смоделировать концепцию checkout / checkin. Если пользователь проверяет файл, никто не сможет его записать, пока он не проверит его.
Я попытался изменить владельца файла; каждый раз, когда пользователь хочет проверить, он становится владельцем файла и не позволяет другим записывать на него, а затем проверяет, изменив владельца файла на значение по умолчанию и устанавливает права доступа к файлу по умолчанию. Это означает, что мне понадобятся 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
Это предполагается:
[d4 ] Все разработчики находятся в группе dev (если нет, используйте имена пользователей или группы соответственно). Файлы находятся в /some/dir. Измените $SOURCE_DIR соответственно. Пользователем по умолчанию является nobody, а непроверенные файлы принадлежат пользователю по умолчанию. Никто не имеет прав на запись в исходный каталог, кроме root.Затем разработчики могут выполнить:
sudo check some/file
, чтобы проверить /some/dir/some/file, и запустите его снова, чтобы проверить его.
Вам придется написать скрипт, который проверяет условия, а затем предоставить вашим пользователям 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, а непроверенные файлы принадлежат пользователю по умолчанию. Никто не имеет прав на запись в исходный каталог, кроме root.Затем разработчики могут выполнить:
sudo check some/file
, чтобы проверить /some/dir/some/file, и запустите его снова, чтобы проверить его.
Вам придется написать скрипт, который проверяет условия, а затем предоставить вашим пользователям 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, а непроверенные файлы принадлежат пользователю по умолчанию. Никто не имеет прав на запись в исходный каталог, кроме root.Затем разработчики могут выполнить:
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
Он сможет выполнить любую команду с правами root, включая chown в любом файле. [!d1 ]
Вы можете настроить /etc/sudoers, чтобы позволить конкретному пользователю выполнять определенные команды
, например вы можете установить следующую строку в /etc/sudoers:
user2 ALL=(ALL) NOPASSWD: /bin/chown
user2 ALL=(ALL) NOPASSWD: /bin/chmod
Примечание: если у кого-то есть возможность запускать chown и chmod в качестве root, они могут легко получить полный доступ root (например, путем редактирования /etc/passwd) Я согласен с тем, что sccs (Source Code Control System), включая исходную с начала 70-х, может быть хорошим решением для проверки в общих файлах, поскольку она поддерживает контроль версий, а также документацию об изменениях. [!d0 ]
Как дополнение к предложению Zanna, короткий скрипт, который проверяет, является ли пользователь владельцем, затем, если нет, проверяет, имеет ли группа разрешение на запись. Это означало бы, что он был проверен. Если он доступен, он будет chown, затем измените разрешения на 600 (файл занят). Чтобы освободить его, он изменит права доступа на 660. Таким образом, имя владельца будет указывать, кто заблокировал или кто последний заблокировал его, а групповое разрешение укажет, было ли оно доступно или все еще используется.
Я согласен с тем, что sccs (Source Code Control System), включая исходную с начала 70-х, может быть хорошим решением для проверки в общих файлах, поскольку она поддерживает контроль версий, а также документацию об изменениях.
Как дополнение к предложению Zanna, короткий скрипт, который проверяет, является ли пользователь владельцем, затем, если нет, проверяет, имеет ли группа разрешение на запись. Это означало бы, что он был проверен. Если он доступен, он будет chown, затем измените разрешения на 600 (файл занят). Чтобы освободить его, он изменит права доступа на 660. Таким образом, имя владельца будет указывать, кто заблокировал или кто последний заблокировал его, а групповое разрешение укажет, было ли оно доступно или все еще используется.
Если пользователь имеет возможность запускать следующую команду sudo:
sudo bash
Он сможет выполнить любую команду с правами root, включая chown в любом файле.
Вы можете настроить /etc/sudoers, чтобы позволить конкретному пользователю выполнять определенные команды
, например вы можете установить следующую строку в /etc/sudoers:
user2 ALL=(ALL) NOPASSWD: /bin/chown
user2 ALL=(ALL) NOPASSWD: /bin/chmod
Примечание: если у кого-то есть возможность запускать chown и chmod в качестве root, они могут легко получить полный доступ root (например, путем редактирования /etc/passwd) Я согласен с тем, что sccs (Source Code Control System), включая исходную с начала 70-х, может быть хорошим решением для проверки в общих файлах, поскольку она поддерживает контроль версий, а также документацию об изменениях.
Как дополнение к предложению Zanna, короткий скрипт, который проверяет, является ли пользователь владельцем, затем, если нет, проверяет, имеет ли группа разрешение на запись. Это означало бы, что он был проверен. Если он доступен, он будет chown, затем измените разрешения на 600 (файл занят). Чтобы освободить его, он изменит права доступа на 660. Таким образом, имя владельца будет указывать, кто заблокировал или кто последний заблокировал его, а групповое разрешение укажет, было ли оно доступно или все еще используется.
Если пользователь имеет возможность запускать следующую команду sudo:
sudo bash
Он сможет выполнить любую команду с правами root, включая chown в любом файле.
Вы можете настроить /etc/sudoers, чтобы позволить конкретному пользователю выполнять определенные команды
, например вы можете установить следующую строку в /etc/sudoers:
user2 ALL=(ALL) NOPASSWD: /bin/chown
user2 ALL=(ALL) NOPASSWD: /bin/chmod
Примечание: если у кого-то есть возможность запускать chown и chmod в качестве root, они могут легко получить полный доступ root (например, путем редактирования /etc/passwd)