Как энергия крадет корневые файлы?

Также изучите ~/.snapshot, если файл был недавно удален.

39
19.12.2012, 14:43
3 ответа

Вы, glen, владелец каталога (см. . файл в Вашем списке). Каталог является просто списком файлов, и у Вас есть разрешение изменить этот список (например, добавить файлы, удалить файлы, владения изменения для создания его Вашим снова, и т.д.). Вы не можете изменять содержание файла непосредственно, но можно считать и удалить связь (удаляют) файл в целом и добавляют новые файлы впоследствии 1 Только наблюдение прежде и после, это может быть похожим на файл, был изменен.

Vim использует файлы подкачки и перемещает файлы под водой, так, чтобы объяснил, почему это, кажется, пишет в тот же файл, как Вы делаете в своей оболочке, но это не та же вещь 2

Так, что делает Vim, сводится к этому:

cat temp > .temp.swp          # copy file by contents into a new glen-owned file
echo nope >> .temp.swp        # or other command to alter the new file
rm temp && mv .temp.swp temp  # move temporary swap file back

1This важное различие в обработке разрешения файла между Windows и Нельдами. В Windows каждый обычно не в состоянии удалить файлы, для которых у Вас нет разрешения записи.

2 обновления: как отмечено в комментариях, Vim на самом деле не делает этого этот путь к изменению владения как inode число на temp файл не изменяется (сравнение ls -li прежде и после). Используя strace мы видим точно что vim делает. Интересная часть здесь:

open("temp", O_WRONLY|O_CREAT|O_TRUNC, 0664) = -1 EACCES (Permission denied)
unlink("temp")                               = 0
open("temp", O_WRONLY|O_CREAT|O_TRUNC, 0664) = 4
write(4, "more text bla\n", 14)              = 14
close(4)                                     = 0
chmod("temp", 0664)                          = 0

Это показывает, что только удаляет связь, но не закрывает дескриптор файла к temp. Это скорее просто перезаписывает свое целое содержание (more text bla\n в моем случае). Я предполагаю, что это объясняет, почему inode число не изменяется.

51
27.01.2020, 19:35
  • 1
    FWIW можно проверить это, происходит путем выполнения ls -il прежде и после..., если tempчисло inode изменилось, Вы знаете, что это - другой файл с тем же именем. –  Useless 19.12.2012, 16:12
  • 2
    можно было добавить, что комната на самом деле не удаляет файл, но просто удаляет ссылку на файл и файл, не становится удаленным, прежде чем количество ссылок уменьшится к 0. комната просто удаляет запись в файл в каталоге. Если корень имеет другую ссылку (жесткая ссылка) на файл в другом каталоге, пользователь не может удалить файл. –  gerrit 19.12.2012, 16:21
  • 3
    @Useless, который я попробовал, и число, не изменился хотя владелец и измененная метка времени! –  amyassin 19.12.2012, 20:45
  • 4
    @amyassin Вы правы! Я обновил свой ответ с strace выборкой, объяснив это. –  gertvdijk 19.12.2012, 21:09
  • 5
    Как в стороне к Вашему примечанию о Windows по сравнению с полномочиями Unix, если Вы хотите подобное Окнам поведение в Unix, можно создать каталог, принадлежавший корню (или другой пользователь, который должен иметь универсальный, удалять/переименовывать/и т.д. полномочия), и установите липкий бит на каталоге. Затем пользователи только смогут удалить свои собственные файлы. –  Matthew Crumley 19.12.2012, 21:39

прежде:

-rw-r--r-- 1 root staff 0 19 Dec 12:38 temp

после:

-rw-r--r-- 1 glen staff 7 19 Dec 12:38 temp

Энергия не прорывается через барьер разрешения. Просто взгляните на информацию о файле, перечисленную тщательно затем, Вы могли узнать, что энергия на самом деле удалила исходный файл (потому что у Вас есть разрешение удалить файл, хотя Вы не можете измениться, его содержание) затем создал новый файл Вас собственный (см., что владелец больше не является 'корнем').

И в то время как Вы редактируете исходный файл в энергии, он предупреждает, что Вы изменяете файл только для чтения. Таким образом, когда Вы вводите команду :wq!(вызовите операцию), что может, энергия только сделать должна удалить существующий файл и создать новый файл, который имеет идентичное имя.

Надежда, которая помогает.

16
27.01.2020, 19:35

Используйте -i опция ls видеть inode число, которое является уникальным идентификатором (в файловой системе) файла или другого объекта.

Вы будете видеть, что файл был заменен другим объектом: inode число, вероятно, изменится.

Наблюдение того же inode числа не является доказательством ничего: может быть переработано inode число. Если мы удаляем последнюю ссылку на файл и затем создаем новый файл, мы могли бы добраться один с тем же inode числом. Но этого не может произойти, если старый файл удален после того, как новый создается. Например. mv file file.tmp; touch file; rm file.tmp. Я подозреваю, что энергия на самом деле делает что-то аналогичное этому echo new_content > tmpfile; mv tmpfile file. mv операция переведет в a rename системный вызов, таким образом, присвоение inode чисел зависит от того, как файловая система реализует переименовывание, которое удаляет связь с местом назначения.

1
27.01.2020, 19:35

Теги

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