Как определить, принадлежит ли файловая система Linux рабочей системе или нет

Предположение Вас только хочет принять входящий трафик TCP, можно использовать эти правила ограничить исходящий трафик установленными соединениями TCP (который, должно быть, инициировался с внешней стороны), и IP-адреса вне LAN:

iptables -A INPUT -p tcp -i lo -j ACCEPT
iptables -A INPUT -p tcp -p 22 -j ACCEPT   # repeat for other ports you want to allow
iptables -P INPUT -j DENY
iptables -A OUTPUT -o lo -j ACCEPT
iptables -A OUTPUT -p tcp \! -d 10.0.0.0/8 -j ACCEPT  # replace by your LAN's network(s)
iptables -A OUTPUT -p tcp \! --syn -j ACCEPT
iptables -P OUTPUT -j DENY

Учитывая Ваши требования, можно предпочесть применять некоторые правила конкретно к процессам, выполняемым сторонниками. Предположим, они находятся в supporters группа, следующие правила отклонят сторонников (и только сторонников) все соединения (поступление или выход) в Вашей LAN:

iptables -I INPUT \! -i lo -s 10.0.0.0/8 -m owner --gid-owner supporters -j DENY
iptables -I OUTPUT \! -o lo -d 10.0.0.0/8 -m owner --gid-owner supporters -j DENY

Отметьте это gid-owner тестирует fsgid процесса, который является почти всегда эффективным GID. Если процесс не выполняется setgid или переключает свой эффективный GID на дополнительную группу, основную группу пользователя (зарегистрированный в пользовательской базе данных, например. /etc/passwd) применяется.

2
14.01.2013, 10:45
2 ответа

Я записал функцию, которая возвращается 1 если аргументом является корневое устройство, 0 если это не, и отрицательная величина для ошибки:

#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>

static int
root_check(const char *disk_dev)
{
        static const char  root_dir[] = "/";
        struct stat        root_statb;
        struct stat        dev_statb;

        if (stat(root_dir, &root_statb) != 0)
        {
                perror(root_dir);
                return -1;
        }
        if (!S_ISDIR(root_statb.st_mode))
        {
                fprintf(stderr, "Error: %s is not a directory!\n", root_dir);
                return -2;
        }
        if (root_statb.st_ino <= 0)
        {
                fprintf(stderr, "Warning: %s inode number is %d; "
                                "unlikely to be valid.\n",
                                        root_dir, root_statb.st_ino);
        }
        else if (root_statb.st_ino > 2)
        {
                fprintf(stderr, "Warning: %s inode number is %d; "
                                "probably not a root inode.\n",
                                        root_dir, root_statb.st_ino);
        }
        if (stat(disk_dev, &dev_statb) != 0)
        {
                perror(disk_dev);
                return -1;
        }
        if (S_ISBLK(dev_statb.st_mode))
                /* That's good. */ ;
        else if (S_ISCHR(dev_statb.st_mode))
        {
                fprintf(stderr, "Warning: %s is a character-special device; "
                                "might not be a disk.\n", disk_dev);
        }
        else
        {
                fprintf(stderr, "Warning: %s is not a device.\n", disk_dev);
                return(0);
        }
        if (dev_statb.st_rdev == root_statb.st_dev)
        {
                printf("It looks like %s is the root file system (%s).\n",
                                        disk_dev, root_dir);
                return(1);
        }
        // else
        printf("(It looks like %s is NOT the root file system.)\n", disk_dev);
        return(0);
}

Первые два теста являются в основном проверками работоспособности: если stat("/", …) сбои или “/” не каталог, Ваша файловая система повреждается. st_ino тесты являются чем-то вроде выстрела в темноте. AFAIK, inode числа никогда не должен быть отрицательным или нуль. Исторически (которым я имею в виду 30 лет назад), корневой каталог всегда имел inode номер 1. Это может все еще быть верно для нескольких разновидностей *, отклоняют (кто-либо слышал о “Minix”?), и это может быть верно для специальных файловых систем, как /proc, и для Windows (FAT) файловые системы, но самый современный Unix и подобные Unix системы, кажется, используют inode номер 1 для отслеживания сбойных блоков, продвигая корень до inode номера 2.

S_ISBLK верно для “блочных устройств”, как /dev/sda1, откуда вывод ls -l начинается “b”. Аналогично, S_ISCHR верно для “устройств посимвольного ввода-вывода”, где вывод от ls -l начинается “c”. (Можно иногда видеть дисковые имена как /dev/rsda1; “r” обозначает “сырые данные”. Устройства неструктурированного диска иногда используются для fsck и резервное копирование, но не монтирование.) Каждый inode имеет a st_dev, который говорит, какая файловая система, что inode идет. Inodes для устройств также имеют st_rdev поля, которые говорят, каковы устройство они. (Два разделенных от запятой числа Вы видите вместо размера файла когда Вы ls -l устройство составляет два байта st_rdev.)

Так, прием должен видеть ли st_rdev из дискового устройства соответствует st_dev из корневого каталога; т.е. указанное устройство то это “/” идет?

0
27.01.2020, 23:06
  • 1
    Вопрос состоял в том, смонтирована ли файловая система, не, смонтировано ли это как корневой каталог. –  psusi 20.04.2013, 01:28
  • 2
    @psusi: На Jan 14 в 18:23 JLledo выпустил этот комментарий: «первая опция, "файловая система является корнем существующей системы – та, на которой работает Ваша программа"». решенная проблема –  Scott 20.04.2013, 02:30
  • 3
    Привет!! Я протестировал его, и на самом деле работает!! огромное спасибо!! Я неправильно искал некоторый файл или каталог, который мог дать мне, что информация, но я не думал об использовании stat функции. Это - лучшее решение. –  jlledom 21.04.2013, 02:03
  • 4
    я рад, что мог помочь. –  Scott 21.04.2013, 02:57

Можно проверить, смонтировано ли устройство, и где:

awk -v device=/dev/sda1 ' $1 == device {print $2}' /proc/mounts

Это не обнаруживает устройства, используемые подсистемой ядра, такие как mdraid или LVM. Они видимы через /sys/class/block/sda1/holders (что каталог содержит символьную ссылку на объект картопостроителя устройства, который использует устройство).

0
27.01.2020, 23:06
  • 1
    Спасибо!, но то, что я должен знать, не только, смонтирована ли файловая система, но также и является ли это корневым каталогом и работает прямо сейчас (включенный). Моя ошибка! Я отредактировал вопрос... –  jlledom 14.01.2013, 13:07
  • 2
    @JLledo, я не уверен, что понимаю вопрос. Вы пытаетесь узнать, смонтирована ли та файловая система на /? Это рассчитывает, если это смонтировано в VM? Это рассчитывает, если в прошлый раз что-нибудь произошло с ним, это было смонтировано в /, но затем разрушенная система? –  Gilles 'SO- stop being evil' 15.01.2013, 00:02

Теги

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