Подделка пути к каталогу без полного пути

Подделка пути к каталогу без полного пути

Я работаю с системой сборки, которая полагается на абсолютные пути для ссылки на исходные файлы и т. д. Когда я хочу протестировать сборку с различными цепочками инструментов, я монтирую каталог src в виртуальных машинах или chroot. Проблема в том, что путь к моему каталогу src на моей хост-машине очень сложный — скажем, /a/b/c/d/src — и он должен соответствовать смонтированному пути.

Я хочу иметь возможность монтировать свой каталог src куда-нибудь, например, /mnt/src, но мне всегда приходится создавать символическую ссылку /a/b/c/d/src на /mnt/src или просто указывать точку монтирования непосредственно в /a/b/c/d/src.

Кажется грязным иметь /a/b/c/d в файловой системе, и в целом у вас может даже не быть прав на создание файлов в /a/b/c/d (или в любом из родительских каталогов). Есть ли способ подделать этот путь, чтобы успокоить мою систему сборки?

решение1

Лучшим решением было бы объяснить системе сборки, что исходные пути и пути установки — это не одно и то же, но я предполагаю, что вы не сможете этого сделать.

Самый простой метод — сделать исходный путь таким, чтобы его можно было легко воспроизвести, например:/var/tmp/mybuild . Если система сборки не слишком противна, то достаточно сделать это символической ссылкой на место расположения файлов. Если система сборки настаивает на канонизации символических ссылок, вы сможете обмануть ее, используяпривязать креплениеВместо этого. С bindfs вам не нужны права root, вам нужно только иметь разрешение на запись в том месте, где вы хотите, чтобы файлы отображались.

Если вы не можете воздействовать на исходную систему, альтернативный подход заключается в следующем:предварительно загрузить динамическую библиотеку, которая перенаправляет определенные обращения к файлам. Это предполагает, что все исполняемые файлы, которые будут запущены, связаны динамически. Код в связанном примере демонстрирует, как это сделать из определенного файла; его можно настроить, чтобы перенаправить все файлы, путь которых начинается с определенного префикса. Заменить

if (!strcmp(path, FROM)) {
    path = TO;
}
return ret;

чем-то вроде (непроверено)

char *other_path = NULL;
if (!strncmp(path, FROM, strlen(FROM))) {
    other_path = malloc(strlen(path) - strlen(FROM) + strlen(TO) + 1);
    if (other_path == NULL) return -ENOENT; // return NULL in fopen
    memcpy(other_path, TO, strlen(TO));
    memcpy(other_path + strlen(TO), path + strlen(FROM), strlen(path) - strlen(FROM) + 1);
    path = other_path;
}
free(other_path);
return ret;

решение2

Если ваша цель — избежать загрязнения «хоста» остатками от тестовых сборок, то сборка внутри firejailс постоянным оверлеем должна быть хорошим вариантом. При таком подходе он будет собирать и, возможно, устанавливать, как будто по-настоящему, но файлы окажутся в оверлее, а не будут загрязнять «реальную» файловую систему.

Недостатком является то, что вам придется размещать результаты тестовых сборок в наложении, но в то же время это имеет возможное преимущество в виде сохранения результатов последовательных тестовых сборок, например, для их сравнения или для других последующих экспертиз, которые вам могут понадобиться.

Связанный контент