在 bash 脚本中运行 chown 会产生错误

在 bash 脚本中运行 chown 会产生错误

我正在编写一个脚本,该脚本下载具有bar:bar所有权的文件,然后将所有权更改为foo:server.所以我写了一个辅助脚本( chown_test.sh)来通过chown.一旦工作,我会将其注入主脚本中,但我遇到了一个问题(如下所示),可能是由于我缺乏使用chown.

笔记:我尝试在下面包含所有必要的信息,但如果您需要更多信息,请通过评论告诉我。

目录结构、所有权和权限:

+ drwxrwxr-x 2 foo:server chown_test  # test directory
├─  -rwxrwxr-- 1 foo:server chown_test.sh  # side script
├─  -rwxrwxr-- 1 bar:bar    file           # empty file

相关条目来自/etc/group

sudo:x:27:foo
bar:x:33:foo
foo:x:1000:
server:x:1003:bar,foo

代码chown_test.sh

#!/bin/bash

echo "User: $USER"
chown foo:server ./file

我也尝试过,sudo chown foo:server ./file但这提示我输入 sudo 密码bar,而它没有 sudo 密码。

运行的输出chown_test.shbar

[16:13 foo@Opus]:~/chown_test$ sudo -H -u bar bash -c ./chown_test.sh
User: bar
chown: changing ownership of ‘./file’: Operation not permitted

运行的输出chown_test.shfoo

[16:14 foo@Opus]:~/chown_test$ ./chown_test.sh 
User: foo
chown: changing ownership of ‘./file’: Operation not permitted


有人可以解释一下我的困境吗?
感谢您阅读我的问题。


更新:

在来自的帮助下托比·斯佩特的回答和评论,我找到了一个快乐的媒介。

自从,“只有特权进程(Linux:具有该CAP_CHOWN功能的进程)可以更改文件的所有者。文件的所有者可以将文件的组更改为该所有者所属的任何组。”,然后我决定只更改组,而不更改所有者。

chown我通过将命令更改chown_test.sh为:

chown :server ./file

结果:

├─  -rwxrwxr-- 1 bar:server file

哪个适合我,但如果不适合你,请看看托比·斯佩特的回答请参阅下文了解更多信息。

答案1

chown(2)手册页:

只有特权进程(Linux:具有该CAP_CHOWN能力的进程)才能更改文件的所有者。文件的所有者可以将文件的组更改为该所有者所属的任何组。特权进程(Linux:with CAP_CHOWN)可以任意更改组。

您的进程既没有特权,也没有将其拥有的文件组更改为所有者所在的组。

因此,您需要获得适当的特权。最简单的两种方法是

  1. 编写一个最小的二进制程序(可能用 C 语言)来设置该文件的所有权(我假设该文件的路径名可以是硬编码的,以防止滥用)并将其设置为 root,甚至更好,添加CAP_CHOWN功能sudo setcap cap_chown+ep <program_name>,这不会使程序运行及其root所有后果。

  2. 写入适当的/etc/sudoers条目以允许在没有密码的情况下执行该特定命令sudo:写入一行,例如

    bar ALL = (root) NOPASSWD: /bin/chown foo:server '/full/path/to/file'
    

    到文件中/etc/sudoers.d(并检查是否/etc/sudoers有相应的#includedir指令 - 大多数 Linux 发行版都有)。确保您的脚本调用的命令完全匹配!

相关内容