Почему я могу писать в файл, на который у меня нет разрешения? [dубликат]

Это ошибка, идентифицированная Ubuntu: bugs.launchpad.net/ubuntu/+source/linux/+bug/1514907

Введите следующее в терминал (если вам удастся запустить один из них ):

$ sudo apt-get install -f
$ sudo apt-get clean
$ sudo apt-get update

Затем переустановите пакет или обновления.

Обратите внимание: версии ядра, так как этот разрешил проблему. Установите одно из последних ядер при получении обновления.

41
задан 23 August 2016 в 18:06

14 ответов

Как уже упоминалось в @Rob, вы можете сделать это, только если у вас есть доступ на запись в каталог, содержащий файл. Попытка сделать то же самое в файле, например, /etc, не удастся.

Как это делает vim, он удаляет файл и воссоздает его. Чтобы проверить это, я создал файл, принадлежащий root:

echo foo | sudo tee fff

И затем приступил к редактированию файла с vim в том виде, который вы описываете, но привязывая процесс к strace, чтобы увидеть что происходит:

strace vim fff 2> strace.out

Затем я проверил strace.out и нашел:

unlink("fff") = 0 open("fff", O_WRONLY|O_CREAT|O_TRUNC, 0644) = 4 write(4, "foasdasdao\n", 11) = 11

Итак, файл был сначала удален (unlink("fff")), а затем новый файл одно и то же имя было создано (open("fff", O_WRONLY|O_CREAT|O_TRUNC, 0644)), и сделанные мной изменения были написаны (write(4, "foasdasdao\n", 11)). Если вы попробуете это дома, вы увидите, что после того, как вы отредактируете его с помощью vim, файл теперь будет принадлежать вам, а не root.

Итак, строго говоря, vim не редактирует файл, на который у вас нет доступа для записи. Он удаляет файл из каталога, в котором у вас есть доступ на запись, а затем создается новый файл, к которому у вас также есть доступ на запись.

57
ответ дан 18 July 2018 в 07:39

Как уже упоминалось в @Rob, вы можете сделать это, только если у вас есть доступ на запись в каталог, содержащий файл. Попытка сделать то же самое в файле, например, /etc, не удастся.

Как это делает vim, он удаляет файл и воссоздает его. Чтобы проверить это, я создал файл, принадлежащий root:

echo foo | sudo tee fff

И затем приступил к редактированию файла с vim в том виде, который вы описываете, но привязывая процесс к strace, чтобы увидеть что происходит:

strace vim fff 2> strace.out

Затем я проверил strace.out и нашел:

unlink("fff") = 0 open("fff", O_WRONLY|O_CREAT|O_TRUNC, 0644) = 4 write(4, "foasdasdao\n", 11) = 11

Итак, файл был сначала удален (unlink("fff")), а затем новый файл одно и то же имя было создано (open("fff", O_WRONLY|O_CREAT|O_TRUNC, 0644)), и сделанные мной изменения были написаны (write(4, "foasdasdao\n", 11)). Если вы попробуете это дома, вы увидите, что после того, как вы отредактируете его с помощью vim, файл теперь будет принадлежать вам, а не root.

Итак, строго говоря, vim не редактирует файл, на который у вас нет доступа для записи. Он удаляет файл из каталога, в котором у вас есть доступ на запись, а затем создается новый файл, к которому у вас также есть доступ на запись.

57
ответ дан 24 July 2018 в 18:50

Это предупреждение VIM, которое может быть относительно важным, учитывая, как разрешения работают в UNIX. Очевидная неинтуитивность этого заключается в том, что файловые системы UNIX имеют разрешения на файл, хранящийся в i-узле файла. Структура каталога как-то раздельна и связывает только эти i-узлы. У каталогов также есть свои разрешения, которые говорят, можете ли вы связать / отменить связь с файлами в нем или прочитать его или перейти в подкаталоги. Эта конструкция позволяет отображать один и тот же файл в нескольких разных местах структуры каталогов (через жесткие ссылки). Говоря «add! To override», VIM пытается предупредить вас, что исходный файл будет отсоединен (так что он останется во всех других местах нетронутым), и новый файл будет создан и привязан к исходному месту в структуре каталогов. Если счетчик ссылок исходного файла уменьшается до нуля, исходный файл будет освобожден, но если нет, вы эффективно клонируете файл. Открытие файла также считается ссылкой, поэтому, если какая-то программа открыла файл, и вы соглашаетесь «добавить! Переопределить», программа не увидит изменений, внесенных вами в файл с помощью VIM. Файл будет отсоединен от директории VIM и после закрытия файла другой программой файл будет освобожден, если только он не был связан где-то в другом месте.

Обратите внимание, что в Windows разрешения на файлы хранятся в каталог, поэтому с точки зрения парадигмы разрешений Windows это поведение vim действительно может показаться странным. Для записи в файл Windows логически может также проверять некоторые разрешения на доступ к каталогам, даже разрешения суперкаталогов. Как было сказано выше, в UNIX права на каталоги не имеют отношения к манипуляции с файлом, насколько вы могли его перечислить и открыть (т. Е. Были х для всех супер-каталогов).

Например, у вас есть файл / home / user1 / foo, и он является тем же файлом, что и (т.е. hardlinked to) / home / user2 / foo, и файл не доступен для записи кем-либо и в настоящее время открыт программой P (открыт чтение-запись программой, запущенной с помощью root). Если user1 открывает его с помощью vim и перезаписывает, он создает свою собственную копию и больше не видит исходный файл. Если впоследствии user2 откроет свою связь с vim и запишет в нее, он снова отключится, и он создаст другую копию. Программа P по-прежнему будет видеть исходный файл и может свободно читать или записывать в него. Как только программа закроет файл, файл исчезнет (освободится файловой системой).

2
ответ дан 18 July 2018 в 07:39

См. :help write-readonly:

write-readonly When the 'cpoptions' option contains 'W', Vim will refuse to overwrite a readonly file. When 'W' is not present, ":w!" will overwrite a readonly file, if the system allows it (the directory must be writable).

Поскольку у вас есть права на запись в каталоге (это означает, что вы можете создавать, удалять или переименовывать файлы в нем), система действительно разрешает это.

Значение по умолчанию :help write-readonly не содержит W:

'cpoptions' 'cpo' cpo 'cpoptions' 'cpo' string (Vim default: "aABceFs", Vi default: all flags) global
9
ответ дан 18 July 2018 в 07:39

Это не совсем ответ, но если вы действительно хотите установить файл, чтобы никто не мог его изменить или удалить, вы можете сделать его неизменным.

Обычно, даже если файл принадлежащий root, вы все равно можете удалить файл, если у вас есть права на запись в папку.

Чтобы сделать файл неизменным (вам нужно sudo):

sudo chattr +i myFile.txt

Вы можете видеть это с lsattr (буква i в результате):

$ lsattr myFile.txt ----i--------e-- myFile.txt

Чтобы снова сделать файл нормальным:

sudo chattr -i myFile.txt

Чтобы уточнить: когда файл неизменен

Стоит прочитать man chattr, потому что файлы могут иметь несколько полезных атрибутов.

Вы также можете указать, что вы не можете удалить, переименовать, изменить или даже сложно связать. найти «ограниченное удаление» полезно. Если он помещен в папку (а не файл), это означает, что тому, кто создает файл в папке, разрешено изменять или удалять этот файл, но никто не является (кроме root). В папке /tmp установлен этот флаг. Вы можете видеть это с флагом t в /tmp:

$ ls -l --directory /tmp drwxrwxrwt 10 root root 4096 Sep 6 09:00 /tmp

Чтобы установить или удалить флаг ограниченной цели в папке:

chmod +t myFolder # Add the restricted deletion flag. chmod -t myFolder # Remove the restricted deletion flag.
1
ответ дан 18 July 2018 в 07:39

Используя w!, вы удаляете исходный файл (который вам разрешено делать) и вместо этого записываете свою версию.

, который вам разрешено делать

$ mkdir foo $ echo hi > foo/file $ chmod 777 foo $ chmod 700 foo/file $ ls -l foo/file -rwx------ 1 ravexina ravexina 7 Aug 31 03:19 foo/file

Теперь позвольте мне переключить пользователя и изменить файл

$ sudo -u user2 -s $ vi foo/a # save using w! (I wrote into the file bye) $ ls -l foo/a -rwx------ 1 user2 user2 7 Aug 31 03:20 foo/file

Теперь посмотрим, что там есть:

$ cat foo/file bye
15
ответ дан 18 July 2018 в 07:39

До тех пор, пока у вас есть родительский каталог, который вы можете удалить, или замените файл независимо от разрешения, так как вы можете изменить содержимое каталога:).

Попробуйте его с помощью другой команды, такой как rm, он подскажет вам, но вы все равно можете это сделать.

Дополнение:

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

15
ответ дан 18 July 2018 в 07:39

Как ваш редактор vim-процесса, так и ваш файл несут ваше

getpwnam("navid")->pw_uid

право собственности, чтобы вы могли также выложить

:!chmod +w %

, и вы можете догадаться, что когда-то еще более простой

:!rm %

(требующий только + w, ut, отключить разрешение на, а не даже владение), стал слишком частым для кого-то типа, так что vim был перепрограммирован автоматически, и по запросу автоматически выполняет такие Операция.

Попробуйте перезаписать

/home/whoopi/.profile

вашей старшей сестры, как простой navid, и ставки - ваш vim дает вам желаемый отказ.

2
ответ дан 18 July 2018 в 07:39

Это предупреждение VIM, которое может быть относительно важным, учитывая, как разрешения работают в UNIX. Очевидная неинтуитивность этого заключается в том, что файловые системы UNIX имеют разрешения на файл, хранящийся в i-узле файла. Структура каталога как-то раздельна и связывает только эти i-узлы. У каталогов также есть свои разрешения, которые говорят, можете ли вы связать / отменить связь с файлами в нем или прочитать его или перейти в подкаталоги. Эта конструкция позволяет отображать один и тот же файл в нескольких разных местах структуры каталогов (через жесткие ссылки). Говоря «add! To override», VIM пытается предупредить вас, что исходный файл будет отсоединен (так что он останется во всех других местах нетронутым), и новый файл будет создан и привязан к исходному месту в структуре каталогов. Если счетчик ссылок исходного файла уменьшается до нуля, исходный файл будет освобожден, но если нет, вы эффективно клонируете файл. Открытие файла также считается ссылкой, поэтому, если какая-то программа открыла файл, и вы соглашаетесь «добавить! Переопределить», программа не увидит изменений, внесенных вами в файл с помощью VIM. Файл будет отсоединен от директории VIM и после закрытия файла другой программой файл будет освобожден, если только он не был связан где-то в другом месте.

Обратите внимание, что в Windows разрешения на файлы хранятся в каталог, поэтому с точки зрения парадигмы разрешений Windows это поведение vim действительно может показаться странным. Для записи в файл Windows логически может также проверять некоторые разрешения на доступ к каталогам, даже разрешения суперкаталогов. Как было сказано выше, в UNIX права на каталоги не имеют отношения к манипуляции с файлом, насколько вы могли его перечислить и открыть (т. Е. Были х для всех супер-каталогов).

Например, у вас есть файл / home / user1 / foo, и он является тем же файлом, что и (т.е. hardlinked to) / home / user2 / foo, и файл не доступен для записи кем-либо и в настоящее время открыт программой P (открыт чтение-запись программой, запущенной с помощью root). Если user1 открывает его с помощью vim и перезаписывает, он создает свою собственную копию и больше не видит исходный файл. Если впоследствии user2 откроет свою связь с vim и запишет в нее, он снова отключится, и он создаст другую копию. Программа P по-прежнему будет видеть исходный файл и может свободно читать или записывать в него. Как только программа закроет файл, файл исчезнет (освободится файловой системой).

2
ответ дан 24 July 2018 в 18:50

См. :help write-readonly:

write-readonly When the 'cpoptions' option contains 'W', Vim will refuse to overwrite a readonly file. When 'W' is not present, ":w!" will overwrite a readonly file, if the system allows it (the directory must be writable).

Поскольку у вас есть права на запись в каталоге (это означает, что вы можете создавать, удалять или переименовывать файлы в нем), система действительно разрешает это.

Значение по умолчанию :help write-readonly не содержит W:

'cpoptions' 'cpo' cpo 'cpoptions' 'cpo' string (Vim default: "aABceFs", Vi default: all flags) global
9
ответ дан 24 July 2018 в 18:50

Это не совсем ответ, но если вы действительно хотите установить файл, чтобы никто не мог его изменить или удалить, вы можете сделать его неизменным.

Обычно, даже если файл принадлежащий root, вы все равно можете удалить файл, если у вас есть права на запись в папку.

Чтобы сделать файл неизменным (вам нужно sudo):

sudo chattr +i myFile.txt

Вы можете видеть это с lsattr (буква i в результате):

$ lsattr myFile.txt ----i--------e-- myFile.txt

Чтобы снова сделать файл нормальным:

sudo chattr -i myFile.txt

Чтобы уточнить: когда файл неизменен

Стоит прочитать man chattr, потому что файлы могут иметь несколько полезных атрибутов.

Вы также можете указать, что вы не можете удалить, переименовать, изменить или даже сложно связать. найти «ограниченное удаление» полезно. Если он помещен в папку (а не файл), это означает, что тому, кто создает файл в папке, разрешено изменять или удалять этот файл, но никто не является (кроме root). В папке /tmp установлен этот флаг. Вы можете видеть это с флагом t в /tmp:

$ ls -l --directory /tmp drwxrwxrwt 10 root root 4096 Sep 6 09:00 /tmp

Чтобы установить или удалить флаг ограниченной цели в папке:

chmod +t myFolder # Add the restricted deletion flag. chmod -t myFolder # Remove the restricted deletion flag.
1
ответ дан 24 July 2018 в 18:50

Используя w!, вы удаляете исходный файл (который вам разрешено делать) и вместо этого записываете свою версию.

, который вам разрешено делать

$ mkdir foo $ echo hi > foo/file $ chmod 777 foo $ chmod 700 foo/file $ ls -l foo/file -rwx------ 1 ravexina ravexina 7 Aug 31 03:19 foo/file

Теперь позвольте мне переключить пользователя и изменить файл

$ sudo -u user2 -s $ vi foo/a # save using w! (I wrote into the file bye) $ ls -l foo/a -rwx------ 1 user2 user2 7 Aug 31 03:20 foo/file

Теперь посмотрим, что там есть:

$ cat foo/file bye
15
ответ дан 24 July 2018 в 18:50

До тех пор, пока у вас есть родительский каталог, который вы можете удалить, или замените файл независимо от разрешения, так как вы можете изменить содержимое каталога:).

Попробуйте его с помощью другой команды, такой как rm, он подскажет вам, но вы все равно можете это сделать.

Дополнение:

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

15
ответ дан 24 July 2018 в 18:50
  • 1
    Похоже, что VIM выбирает из нескольких стратегий, в том числе переписывать на месте или отменить связь + писать новый файл. – Peter Cordes 23 August 2016 в 22:01
  • 2
    @PeterCordes Да. По-видимому, он будет очень стараться делать то, что вы ему рассказываете :) очень хитрый. :) – Rob 23 August 2016 в 22:18

Как ваш редактор vim-процесса, так и ваш файл несут ваше

getpwnam("navid")->pw_uid

право собственности, чтобы вы могли также выложить

:!chmod +w %

, и вы можете догадаться, что когда-то еще более простой

:!rm %

(требующий только + w, ut, отключить разрешение на, а не даже владение), стал слишком частым для кого-то типа, так что vim был перепрограммирован автоматически, и по запросу автоматически выполняет такие Операция.

Попробуйте перезаписать

/home/whoopi/.profile

вашей старшей сестры, как простой navid, и ставки - ваш vim дает вам желаемый отказ.

2
ответ дан 24 July 2018 в 18:50
  • 1
    Спасибо @Zanna за редактирование кода, хотя это стоило мне новичка крошечной репутацией, правда, правда. – Roman Czyborra 8 October 2017 в 00:09

Другие вопросы по тегам:

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