Это только 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.