debootstrap chroot x11 не может открыть дисплей 0 нет ошибки протокола

Это только GNU?

Нет. Это rm поведение восходит к 40 годам и было стандартизировано .

В чем причина такого поведения?

Из справочной страницы 1-го издания для rm :

Для удаления файла требуется разрешение на запись в его каталог, но не на чтение ни права записи для самого файла.

ОШИБКИ
rm, вероятно, должен спросить, действительно ли файл только для чтения должен быть удаленный.

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

В архиве TUHS отсутствуют страницы руководства 2-го издания и исходный код rm, но страница руководства 3-го издания для rm показывает, что это было решено:

Если нет разрешения на запись для {{ 1}} файл, предназначенный для удаления, rm напечатает имя файла, его режим, а затем прочитает строку из стандартного ввода. Если строка начинается с 'y ', файл удаляется, в противном случае - нет. Необязательный аргумент -f предотвращает указанное выше взаимодействие.

Unix и большинство его команд в конечном итоге получили стандартизованные , и именно поэтому rm ведет себя именно так сегодня.

При использовании rm от имени root этого не происходит в моей системе. Это нормальное поведение?

Сначала нет, но сейчас это нормальное поведение.

Самый ранний исходный код, который мне удалось найти, взят из V5 :

    if(getuid() == buf->uid)
        b = 0200; else
        b = 2;
    if((buf->mode & b) == 0)    {
        printf("%s: %o mode ", arg, buf->mode);
        i = b = getchar();
        i = b;
        while(b != '\n' && b != '\0')
            b = getchar();
        if(i != 'y')
            return;
    }

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

В V7 rm был изменен на использование недавно добавленного системного вызова access :

    if (access(arg, 02)<0) {
        printf("rm: %s %o mode ", arg, buf.st_mode&0777);
        if(!yes())
            return;
    }

Поскольку access считает, что root имеет доступ на запись к любому файла (если он не находится в файловой системе только для чтения), rm обычно не запрашивает подтверждения при запуске от root.

1
10.05.2019, 07:11
0 ответов

Теги

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