我正在编写一个脚本,该脚本下载具有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.sh
为bar
:
[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.sh
为foo
:
[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:withCAP_CHOWN
)可以任意更改组。
您的进程既没有特权,也没有将其拥有的文件组更改为所有者所在的组。
因此,您需要获得适当的特权。最简单的两种方法是
编写一个最小的二进制程序(可能用 C 语言)来设置该文件的所有权(我假设该文件的路径名可以是硬编码的,以防止滥用)并将其设置为 root,甚至更好,添加
CAP_CHOWN
功能sudo setcap cap_chown+ep <program_name>
,这不会使程序运行及其root
所有后果。写入适当的
/etc/sudoers
条目以允许在没有密码的情况下执行该特定命令sudo
:写入一行,例如bar ALL = (root) NOPASSWD: /bin/chown foo:server '/full/path/to/file'
到文件中
/etc/sudoers.d
(并检查是否/etc/sudoers
有相应的#includedir
指令 - 大多数 Linux 发行版都有)。确保您的脚本调用的命令完全匹配!