假设我们有这种情况:
-rwxrwx-r- 1 user1 mygroup 0 Sep 12 16:53 testfile
一组开发人员正在同一个虚拟机 (Linux) 上工作。我需要模拟签出/签入的概念。如果用户签出一个文件,则在他签入之前,任何人都不能写入该文件。
我尝试更改文件所有者;每次用户想要签出时,他都会成为文件所有者并阻止其他人对其进行写入,然后通过将文件所有者更改为默认所有者来签入并将文件的权限重新设置为默认权限。这意味着我需要chown
,chmod
但这些命令需要sudo
,我无法sudo
向开发人员授予权限。
我能否让用户仅访问chown
特定chmod
的文件?
答案1
您必须编写一个脚本来检查条件,然后授予用户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
,然后再次运行以进行签入。
答案2
你可以这样做,但我认为可能有专为这种协作而设计的更实用的解决方案。
无论如何,以下是要做的事情:
创建一个组,将用户添加到该组,并授予该组对父目录的写权限。然后他们将能够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
这可能不是直观的......如果他们对父目录具有写权限,他们将始终能够强制写入文件,尽管他们应该得到一些警告,这取决于他们使用的编辑器。
答案3
如果用户有能力运行以下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)
答案4
我同意 sccs(源代码控制系统)包括 70 年代早期的原始系统可能是签入和签出共享文件的良好解决方案,因为它维护版本控制以及更改文档。
作为 Zanna 建议的补充,一个简短的脚本会检查用户是否是所有者,如果不是,则检查组是否具有写入权限。这意味着它已签入。如果可用,它将 chown 然后将权限更改为 600(文件忙)。要释放它,它会将权限改回 660。因此,所有者名称将指示谁锁定了它或谁最后锁定了它,而组权限将指示它是否可用或仍在使用中。