Это ошибка, идентифицированная Ubuntu: bugs.launchpad.net/ubuntu/+source/linux/+bug/1514907
Введите следующее в терминал (если вам удастся запустить один из них ):
$ sudo apt-get install -f
$ sudo apt-get clean
$ sudo apt-get update
Затем переустановите пакет или обновления.
Обратите внимание: версии ядра, так как этот разрешил проблему. Установите одно из последних ядер при получении обновления.
Как уже упоминалось в @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 не редактирует файл, на который у вас нет доступа для записи. Он удаляет файл из каталога, в котором у вас есть доступ на запись, а затем создается новый файл, к которому у вас также есть доступ на запись.
Как уже упоминалось в @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 не редактирует файл, на который у вас нет доступа для записи. Он удаляет файл из каталога, в котором у вас есть доступ на запись, а затем создается новый файл, к которому у вас также есть доступ на запись.
Это предупреждение 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 по-прежнему будет видеть исходный файл и может свободно читать или записывать в него. Как только программа закроет файл, файл исчезнет (освободится файловой системой).
См. :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
Это не совсем ответ, но если вы действительно хотите установить файл, чтобы никто не мог его изменить или удалить, вы можете сделать его неизменным.
Обычно, даже если файл принадлежащий 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.
Используя 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
До тех пор, пока у вас есть родительский каталог, который вы можете удалить, или замените файл независимо от разрешения, так как вы можете изменить содержимое каталога:).
Попробуйте его с помощью другой команды, такой как rm, он подскажет вам, но вы все равно можете это сделать.
Дополнение:
Просто попробовал, но пока я владею файлом, я все еще могу его изменить, даже если папка только для чтения , Однако при изменении права собственности на root: root он не может открыть файл для записи. Поэтому решает модифицирующие файлы, принадлежащие root (или кому-то еще)
Как ваш редактор vim-процесса, так и ваш файл несут ваше
getpwnam("navid")->pw_uid
право собственности, чтобы вы могли также выложить
:!chmod +w %
, и вы можете догадаться, что когда-то еще более простой
:!rm %
(требующий только + w, ut, отключить разрешение на, а не даже владение), стал слишком частым для кого-то типа, так что vim был перепрограммирован автоматически, и по запросу автоматически выполняет такие Операция.
Попробуйте перезаписать
/home/whoopi/.profile
вашей старшей сестры, как простой navid, и ставки - ваш vim дает вам желаемый отказ.
Это предупреждение 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 по-прежнему будет видеть исходный файл и может свободно читать или записывать в него. Как только программа закроет файл, файл исчезнет (освободится файловой системой).
См. :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
Это не совсем ответ, но если вы действительно хотите установить файл, чтобы никто не мог его изменить или удалить, вы можете сделать его неизменным.
Обычно, даже если файл принадлежащий 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.
Используя 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
До тех пор, пока у вас есть родительский каталог, который вы можете удалить, или замените файл независимо от разрешения, так как вы можете изменить содержимое каталога:).
Попробуйте его с помощью другой команды, такой как rm, он подскажет вам, но вы все равно можете это сделать.
Дополнение:
Просто попробовал, но пока я владею файлом, я все еще могу его изменить, даже если папка только для чтения , Однако при изменении права собственности на root: root он не может открыть файл для записи. Поэтому решает модифицирующие файлы, принадлежащие root (или кому-то еще)
Как ваш редактор vim-процесса, так и ваш файл несут ваше
getpwnam("navid")->pw_uid
право собственности, чтобы вы могли также выложить
:!chmod +w %
, и вы можете догадаться, что когда-то еще более простой
:!rm %
(требующий только + w, ut, отключить разрешение на, а не даже владение), стал слишком частым для кого-то типа, так что vim был перепрограммирован автоматически, и по запросу автоматически выполняет такие Операция.
Попробуйте перезаписать
/home/whoopi/.profile
вашей старшей сестры, как простой navid, и ставки - ваш vim дает вам желаемый отказ.