Скопируйте файл, не удаляя возможности назначения

У меня есть двоичный файл foo, сгенерированный из кода C++, для которого установлены специальные возможности:

sudo setcap cap_sys_rawio=ep ./foo

Теперь я хочу собрать еще одну версию этого двоичного файла, и выходные данные сборки (новый двоичный файл) помещаются в файл с именем bar. Очевидно, что bar не будет иметь тех же возможностей, что и foo. Я хотел бы скопировать содержимое bar поверх foo, чтобы foo представлял новый двоичный файл, но без удаления возможностей.

Этот ответ указывает, что изменение файла не влияет на возможности, но когда я пытаюсь использовать cp (который использует open(..., O_TRUNC) под прикрытием ) возможности удалены.


person BeeOnRope    schedule 14.01.2020    source источник
comment
Stack Overflow предназначен для вопросов по программированию, а не по использованию или настройке Unix и его утилит. Unix и Linux или Super User лучше всего подходят для вопросов. как это.   -  person Barmar    schedule 14.01.2020
comment
Используете ли вы какой-либо из параметров cp, которые копируют атрибуты, например -a или --preserve=xattr? Они заменят возможности foo на возможности bar.   -  person Barmar    schedule 14.01.2020
comment
Но они не хотят заменять foo возможностями bar; они хотят сохранить возможности foo и просто заменить содержимое foo содержимым bar.   -  person Richard Fearn    schedule 14.01.2020
comment
@Barmar - нет, я не использую никаких специальных опций.   -  person BeeOnRope    schedule 14.01.2020
comment
@Barmar - вы ошибаетесь в отношении объема SO. Это касается не только самого программирования. Речь также идет о программных инструментах, обычно используемых программистами. Я думаю, мы можем предположить, что вопрос о возможностях Linux в программе, которую я написал и построил, и о том, что нужны эти специальные возможности, полностью актуален здесь, как и многие вопросы, связанные со сборкой. Я согласен, хотя это было бы также в теме на других сайтах: применимость вопроса не является взаимоисключающей в сети SE.   -  person BeeOnRope    schedule 14.01.2020


Ответы (1)


Я не думаю, что это возможно. Комментарий к ответу, на который вы ссылаетесь, неверен; замена содержимого foo приведет к удалению возможностей из foo, как объясняется этот ответ.

Вы можете проверить это, используя следующую тривиальную программу на 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
person Richard Fearn    schedule 14.01.2020
comment
Спасибо. Я тоже делал подобный тест и пришел к такому же выводу. Я думаю, это имеет смысл, поскольку, если бы вы могли изменить двоичный файл, он казался бы гигантским целым с точки зрения безопасности, по сути, предоставляя пользователю полный доступ к ограничениям, поскольку они могли бы обновить двоичный файл, чтобы делать все, что им нужно, с полными заглавными буквами. - person BeeOnRope; 15.01.2020