?

Log in

А я-то думал, что в «базовом» юниксе меня удивить нечем. Но что для… - Оживший юзерпик

Jul. 10th, 2009

05:46 pm

Previous Entry Share Next Entry

А я-то думал, что в «базовом» юниксе меня удивить нечем. Но что для «mv a/ b/» каталог «a» должен быть доступен на запись — меня сегодня удивило.

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

Tags:
Current Mood: gigglygiggly

Comments:

[User Picture]
From:_slw
Date:July 10th, 2009 01:52 pm (UTC)
(Link)
freebsd 7 -- не должен
(Reply) (Thread)
[User Picture]
From:elentin
Date:July 10th, 2009 01:58 pm (UTC)
(Link)
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
(Reply) (Thread)
[User Picture]
From:elentin
Date:July 10th, 2009 02:00 pm (UTC)
(Link)
перепутала chmod 400 и chmod 100, но только с флагом на чтение всё то же самое, дают move.
(Reply) (Parent) (Thread)
[User Picture]
From:tobotras
Date:July 10th, 2009 02:09 pm (UTC)
(Link)
Да, был неточен. Если mv двигает каталог «a» в другой родительский каталог.
(Reply) (Parent) (Thread)
[User Picture]
From:elentin
Date:July 10th, 2009 02:12 pm (UTC)
(Link)
О, совсем другое дело :-)

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': Отказано в доступе
(Reply) (Parent) (Thread)
[User Picture]
From:svv
Date:July 10th, 2009 02:34 pm (UTC)
(Link)
Остроумно :-)

Вот и первоисточник 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;
	}
(Reply) (Thread)
From:ex_ivlad
Date:July 10th, 2009 02:48 pm (UTC)
(Link)
И если разобраться - логично. Если нам надо сменить родителя, надо же изменить ".." в каталоге.

Но если про это не думать, то неочевидно. :)
(Reply) (Parent) (Thread)
[User Picture]
From:shaman007
Date:July 10th, 2009 03:09 pm (UTC)
(Link)
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$

Логично.
(Reply) (Parent) (Thread)
[User Picture]
From:tobotras
Date:July 10th, 2009 03:53 pm (UTC)
(Link)
Ну, и я о том :-)
(Reply) (Parent) (Thread)
[User Picture]
From:avnik
Date:July 10th, 2009 02:35 pm (UTC)
(Link)
Я подозреваю чтобы обновить ".." внутри a/
(Reply) (Thread)
[User Picture]
From:tobotras
Date:July 10th, 2009 03:53 pm (UTC)
(Link)
Как в мане и написано.
(Reply) (Parent) (Thread)
From:dado
Date:July 10th, 2009 03:44 pm (UTC)
(Link)
ну и желательно на той же файловой системе :)
(Reply) (Thread)
[User Picture]
From:tobotras
Date:July 10th, 2009 03:53 pm (UTC)
(Link)
Зануда :-)
(Reply) (Parent) (Thread)
[User Picture]
From:bish0nen
Date:July 10th, 2009 04:08 pm (UTC)
(Link)
зачем топ-менеджерам юникс? «Windows 7» такая хорошая, и цифра счастилвая, и .. секретарше не видно! ты уэ совсем прям как гик какой-то!
(Reply) (Thread)
[User Picture]
From:bish0nen
Date:July 10th, 2009 04:26 pm (UTC)
(Link)
ответ "почему" в man link(2) конечно же. только там этого почти не написано Ж)
(Reply) (Thread)
[User Picture]
From:bish0nen
Date:July 10th, 2009 04:33 pm (UTC)
(Link)
да, и "должен" к root'у, как всегда, не относится.
(Reply) (Parent) (Thread)
[User Picture]
From:tobotras
Date:July 10th, 2009 04:37 pm (UTC)
(Link)
Топ-менеджеры не работают под рутом!
(Reply) (Parent) (Thread)
[User Picture]
From:bish0nen
Date:July 10th, 2009 04:52 pm (UTC)
(Link)
да-да, и я про на Administrator намекаю!
(Reply) (Parent) (Thread)
[User Picture]
From:tobotras
Date:July 10th, 2009 04:35 pm (UTC)
(Link)
Не знаю, какие у тебя маны, а у меня в man rename(2) все подробно написано.
(Reply) (Parent) (Thread)
[User Picture]
From:bish0nen
Date:July 10th, 2009 04:51 pm (UTC)
(Link)
хаха. операция rename(2) по сути неатомарна, она либо 1) модификация dir entry напрямую либо (переименование) 2) транслируется в link(2). право на запись в dir entries для "." и ".." насильно отобрано у всех, кроме root'а, а то так и / можно не пойми в куда замкнуть.
(Reply) (Parent) (Thread)
[User Picture]
From:tobotras
Date:July 10th, 2009 05:01 pm (UTC)
(Link)
Это не имеет отношения к отдельной проверке, имеет ли процесс право на запись в каталог. См. цитату svv выше по комментариям.
(Reply) (Parent) (Thread)
[User Picture]
From:bish0nen
Date:July 14th, 2009 12:54 am (UTC)
(Link)
на самом деле очень даже имеет. rename(2), как я уже поведал, неатомарный и сводится к link(2) в твоём случае в mv. у link(2) две функции - увеличить счётчик link count или обновить ".." для случая mv, если mv делается в пределах той же самой файловой системы. причина, по которой для случая (2) используется link(2) такая, что не-руту в явном виде запрещены манипуляции (на запись) с "." и ".." (через opendir, seekdir & write). проверка на разрешение записи здесь вторична и есть следствие униформности прав доступа в юниксе. я не возражаю, я дополняю Ж)
(Reply) (Parent) (Thread)
From:dserv
Date:July 30th, 2009 08:53 am (UTC)
(Link)
экий ты зануда, однако.. :)
(Reply) (Parent) (Thread)
[User Picture]
From:kamiram
Date:July 10th, 2009 09:50 pm (UTC)
(Link)
вобще невсегда.
но! ежели(а это 99%) происходит запись в данные нода, значит должен
(Reply) (Thread)
From:ex_xaocuc
Date:July 11th, 2009 06:00 am (UTC)
(Link)
круто, никогда не задумывался. виндовз-админ в жизни не догадается =)
(Reply) (Thread)