首页 > 解决方案 > 复制文件而不删除目标功能

问题描述

我有一个foo从 C++ 代码生成的二进制文件,它具有以下特殊功能:

sudo setcap cap_sys_rawio=ep ./foo

现在我想构建这个二进制文件的另一个版本,构建的输出(新的二进制文件)进入一个名为bar. 显然,bar不会具有与foo. 我想复制barover的内容foo,以便foo代表新的二进制文件,但不删除功能。

这个答案表明修改文件不会影响功能,但是当我尝试使用cpopen(..., O_TRUNC)在幕后使用)时,功能被删除。

标签: linuxlinux-capabilities

解决方案


我不认为这是可能的。您链接到的答案的评论不正确;替换 的 内容foo将导致从 中删除功能foo,如this answer所述。

您可以使用以下简单的 C 程序对此进行测试(另存为editfoo.c):

#include <fcntl.h>
#include <unistd.h>

int main(int argc, char** argv) {
    int fd = open("foo", O_WRONLY);
    write(fd, "bar", 3);
    return 0;
}

然后:

$ gcc editfoo.c -o editfoo

$ echo "foo" > foo

$ sudo setcap cap_sys_rawio=ep foo

$ cat foo
foo

$ getcap foo
foo = cap_sys_rawio+ep

$ ./editfoo

$ cat foo
bar

$ getcap foo

推荐阅读