允许用户在没有 sudo 的情况下更改特定文件的文件所有权

允许用户在没有 sudo 的情况下更改特定文件的文件所有权

假设我们有这种情况:

-rwxrwx-r- 1 user1 mygroup  0 Sep 12 16:53 testfile

一组开发人员正在同一个虚拟机 (Linux) 上工作。我需要模拟签出/签入的概念。如果用户签出一个文件,则在他签入之前,任何人都不能写入该文件。

我尝试更改文件所有者;每次用户想要签出时,他都会成为文件所有者并阻止其他人对其进行写入,然后通过将文件所有者更改为默认所有者来签入并将文件的权限重新设置为默认权限。这意味着我需要chownchmod但这些命令需要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

等等......但这只有当人们在开始运行之前检查权限或尝试写入文件时才会起作用chownchmod这可能不是直观的......如果他们对父目录具有写权限,他们将始终能够强制写入文件,尽管他们应该得到一些警告,这取决于他们使用的编辑器。

答案3

如果用户有能力运行以下sudo命令:

sudo bash

他将能够以 root 身份执行任何命令,包括chown针对任何文件执行的命令。

您可以配置/etc/sudoers允许特定用户运行特定命令

例如,您可以设置以下行/etc/sudoers

user2 ALL=(ALL) NOPASSWD: /bin/chown
user2 ALL=(ALL) NOPASSWD: /bin/chmod

注意:如果有人有能力运行,chown并且他们可以轻松获得完全访问权限(例如通过编辑chmodrootroot/etc/passwd)

答案4

我同意 sccs(源代码控制系统)包括 70 年代早期的原始系统可能是签入和签出共享文件的良好解决方案,因为它维护版本控制以及更改文档。

作为 Zanna 建议的补充,一个简短的脚本会检查用户是否是所有者,如果不是,则检查组是否具有写入权限。这意味着它已签入。如果可用,它将 chown 然后将权限更改为 600(文件忙)。要释放它,它会将权限改回 660。因此,所有者名称将指示谁锁定了它或谁最后锁定了它,而组权限将指示它是否可用或仍在使用中。

相关内容