Создание процесса считать другой файл для того же имени файла

Можно добавить правила бухгалтерского учета к iptables конфигурации. Они должны произойти перед принятием УСТАНОВЛЕННОГО и СВЯЗАННОГО трафика, или Вы избежите считать трафик, который передает. Для подсчета веб-трафика пробуют правило как:

iptables -A INPUT -p tcp --dport 80 

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

Брандмауэр Shorewall позволяет Вам легко добавлять правила бухгалтерского учета к своему набору правила.

9
27.11.2019, 10:05
3 ответа

В последних версиях Linux можно не совместно использовать пространство имен монтирования. Таким образом, можно запустить процессы, которые просматривают виртуальную файловую систему по-другому (с файловыми системами, смонтированными по-другому).

Это может также быть, покончили chroot, но unshare более адаптирован к Вашему случаю.

Как chroot, Вам нужен суперпользователь priviledged к unshare пространство имен монтирования.

Так, скажите, что Вы имеете ~/.configuration и ~/.configuration-for-that-cmd файлы.

Можно запустить процесс для который ~/.configuration на самом деле связывание - монтируются ~/.configuration-for-that-cmd там, и выполниться that-cmd там.

как:

sudo unshare -m sh -c "
   mount --bind '$HOME/.configuration-for-that-cmd' \
                '$HOME/.configuration' &&
     exec that-cmd"

that-cmd и все его порожденные процессы будут видеть другое ~/.configuration.

that-cmd выше будет работать как root, использовать sudo -u another-user that-cmd если это должно работать как другой-пользователь.

6
27.01.2020, 20:06
  • 1
    я думаю Ваше решение, вероятно, лучше двух, данных до сих пор (и данный, что OP после, перенаправление на основе времени или результатов процесса обнаружения кажется сомнительным мне), но я думаю, что они желают, чтобы единственный файл обнаружился по-другому. Таким образом, они должны были бы, вероятно, смонтировать его в другом месте и использовать символьную ссылку, рассчитывая на отличающиеся точки монтирования для действия как реальная точка перенаправления. –  Bratchley 28.06.2013, 18:38
  • 2
    @JoelDavis, можно связать - монтируют любой файл, не только каталога. –  Stéphane Chazelas 28.06.2013, 19:28
  • 3
    . Есть ли управление безопасностью с этим, хотя? Я попробовал его с помощью подкаталога, где я был в (связывающий от/etc/fstab), и это возвратило "Не каталог", но я сделал в значительной степени то же самое под /test и это работало без проблемы. –  Bratchley 28.06.2013, 19:36
  • 4
    На самом деле, nm I видят различие, я сделал это к каталогу в первый раз и файл следующее. Я предполагал, что это просто перенаправит/изменит VFS как соответствующий. Anywho, спасибо за новую игрушку. –  Bratchley 28.06.2013, 19:48

Гибкие ссылки.

Создайте два файла конфигурации, и укажите одному из них с гибкой ссылкой большую часть времени, но измените гибкую ссылку для указания на другую, когда специальное приложение будет работать.

(Я знаю, что это - ужасный взлом, но это немного более надежно, чем изменяющееся содержание файла).

Или, управляйте $HOME.

В сценарии, который запускает раздражающий процесс, $HOME набора, чтобы быть чем-то в соответствии с обычным каталогом $HOME и Вашим приложением должен затем использовать файл конфигурации, расположенный там (протестированный, и работы для основных команд оболочки, ~ расширяется до $HOME).

В зависимости от чего еще процесс делает, изменение $HOME может иметь непреднамеренные последствия (т.е. выходные файлы могли бы оказаться в неправильном месте).

3
27.01.2020, 20:06

Это можно сделать с помощью трюка LD_PRELOAD . Вот реализация, которая отображает пути, начинающиеся с определенного префикса, в другое место. Код также находится на гитхабе .

Например, вы можете подделать существование файла в / etc / , не будучи пользователем root. Это было необходимо для клиента owncloud, который отказывается работать, когда файл /etc/ownCloud/sync-exclude.list не существует.

Он работает путем переопределения функций open () и open64 () для сопоставления одного каталога с другим, например, все вызовы open () для / etc / ownCloud / ... можно перенаправить на /home/user1/.etc/ownCloud / ... .

Просто настройте path_map , затем скомпилируйте и запустите вашу программу с предварительно загруженной библиотекой:

gcc -std=c99 -Wall -shared -fPIC path-mapping.c -o path-mapping.so -ldl

LD_PRELOAD=/path/to/my/path-mapping.so someprogram

Исходный код path-mapping.c :

#define _GNU_SOURCE

#include <stdio.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <dlfcn.h>
#include <stdio.h>
#include <fcntl.h>
#include <stdarg.h>
#include <malloc.h>

// List of path pairs. Paths beginning with the first item will be
// translated by replacing the matching part with the second item.
static const char *path_map[][2] = {
    { "/etc/ownCloud/", "/home/user1/.etc/ownCloud/" },
};

__thread char *buffer = NULL;
__thread int buffer_size = -1;

typedef FILE* (*orig_fopen_func_type)(const char *path, const char *mode);
typedef int (*orig_open_func_type)(const char *pathname, int flags, ...);

static int starts_with(const char *str, const char *prefix) {
    return (strncmp(prefix, str, strlen(prefix)) == 0);
}

static char *get_buffer(int min_size) {
    int step = 63;
    if (min_size < 1) {
        min_size = 1;
    }
    if (min_size > buffer_size) {
        if (buffer != NULL) {
            free(buffer);
            buffer = NULL;
            buffer_size = -1;
        }
        buffer = malloc(min_size + step);
        if (buffer != NULL) {
            buffer_size = min_size + step;
        }
    }
    return buffer;
}

static const char *fix_path(const char *path)
{
    int count = (sizeof path_map) / (sizeof *path_map); // Array length
    for (int i = 0; i < count; i++) {
        const char *prefix = path_map[i][0];
        const char *replace = path_map[i][1];
        if (starts_with(path, prefix)) {
            const char *rest = path + strlen(prefix);
            char *new_path = get_buffer(strlen(path) + strlen(replace) - strlen(prefix));
            strcpy(new_path, replace);
            strcat(new_path, rest);
            printf("Mapped Path: %s  ==>  %s\n", path, new_path);
            return new_path;
        }
    }
    return path;
}


int open(const char *pathname, int flags, ...)
{
    const char *new_path = fix_path(pathname);

    orig_open_func_type orig_func;
    orig_func = (orig_open_func_type)dlsym(RTLD_NEXT, "open");

    // If O_CREAT is used to create a file, the file access mode must be given.
    if (flags & O_CREAT) {
        va_list args;
        va_start(args, flags);
        int mode = va_arg(args, int);
        va_end(args);
        return orig_func(new_path, flags, mode);
    } else {
        return orig_func(new_path, flags);
    }
}

int open64(const char *pathname, int flags, ...)
{
    const char *new_path = fix_path(pathname);

    orig_open_func_type orig_func;
    orig_func = (orig_open_func_type)dlsym(RTLD_NEXT, "open64");

    // If O_CREAT is used to create a file, the file access mode must be given.
    if (flags & O_CREAT) {
        va_list args;
        va_start(args, flags);
        int mode = va_arg(args, int);
        va_end(args);
        return orig_func(new_path, flags, mode);
    } else {
        return orig_func(new_path, flags);
    }
}
1
27.01.2020, 20:06

Теги

Похожие вопросы