Previous Entry Редактировать запись Редактировать метки В избранное Поделиться Отслеживать Next Entry
(без темы)
unix
[info]tobotras
А я-то думал, что в «базовом» юниксе меня удивить нечем. Но что для «mv a/ b/» каталог «a» должен быть доступен на запись — меня сегодня удивило.

Ответ «почему» — в man rename(2) :)
Метки:

elentin@falcon:~$ mkdir test
elentin@falcon:~$ chmod 100 test 
elentin@falcon:~$ ls -ld test 
d--x------ 2 elentin 1002 4096 Июл 10 17:55 test
elentin@falcon:~$ 
elentin@falcon:~$ mv test test_mv
elentin@falcon:~$ ls -ld test_mv/
d--x------ 2 elentin 1002 4096 Июл 10 17:55 test_mv/
elentin@falcon:~$ uname -a
Linux falcon 2.6.26-1-openvz-686 #1 SMP Fri Mar 13 20:20:40 UTC 2009 i686 GNU/Linux
elentin@falcon:~$ cat /etc/debian_version 
5.0.1

перепутала chmod 400 и chmod 100, но только с флагом на чтение всё то же самое, дают move.

Да, был неточен. Если mv двигает каталог «a» в другой родительский каталог.

О, совсем другое дело :-)

elentin@falcon:~/test$ ls -l
итого 4
dr-------- 2 elentin 1002 4096 Июл 10 18:09 a
elentin@falcon:~/test$
elentin@falcon:~/test$ mv a ../b
mv: невозможно переместить `a' в `../b': Отказано в доступе

Остроумно :-)

Вот и первоисточник http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=blob_plain;f=fs/namei.c;hb=HEAD
	/*
	 * If we are going to change the parent - check write permissions,
	 * we'll need to flip '..'.
	 */
	if (new_dir != old_dir) {
		error = inode_permission(old_dentry->d_inode, MAY_WRITE);
		if (error)
			return error;
	}

И если разобраться - логично. Если нам надо сменить родителя, надо же изменить ".." в каталоге.

Но если про это не думать, то неочевидно. :)

mac:~ apple$ mkdir a
mac:~ apple$ chmod 000 a
mac:~ apple$ mv a/ b/
mv: rename a/ to b/a/: Permission denied
mac:~ apple$ uname -a
Darwin mac.local 10.0.0b2 Darwin Kernel Version 10.0.0b2: Tue Jun 23 18:38:45 PDT 2009; root:xnu-1456.1.8~1/RELEASE_I386 i386
mac:~ apple$

Логично.

Я подозреваю чтобы обновить ".." внутри a/

ну и желательно на той же файловой системе :)

зачем топ-менеджерам юникс? «Windows 7» такая хорошая, и цифра счастилвая, и .. секретарше не видно! ты уэ совсем прям как гик какой-то!

ответ "почему" в man link(2) конечно же. только там этого почти не написано Ж)

да, и "должен" к root'у, как всегда, не относится.

Топ-менеджеры не работают под рутом!

Не знаю, какие у тебя маны, а у меня в man rename(2) все подробно написано.

хаха. операция rename(2) по сути неатомарна, она либо 1) модификация dir entry напрямую либо (переименование) 2) транслируется в link(2). право на запись в dir entries для "." и ".." насильно отобрано у всех, кроме root'а, а то так и / можно не пойми в куда замкнуть.

Это не имеет отношения к отдельной проверке, имеет ли процесс право на запись в каталог. См. цитату [info]svv выше по комментариям.

на самом деле очень даже имеет. rename(2), как я уже поведал, неатомарный и сводится к link(2) в твоём случае в mv. у link(2) две функции - увеличить счётчик link count или обновить ".." для случая mv, если mv делается в пределах той же самой файловой системы. причина, по которой для случая (2) используется link(2) такая, что не-руту в явном виде запрещены манипуляции (на запись) с "." и ".." (через opendir, seekdir & write). проверка на разрешение записи здесь вторична и есть следствие униформности прав доступа в юниксе. я не возражаю, я дополняю Ж)

вобще невсегда.
но! ежели(а это 99%) происходит запись в данные нода, значит должен

круто, никогда не задумывался. виндовз-админ в жизни не догадается =)


Групповое действие над комментариями:
Картинка пользователя

Вы читаете свой журнал