Как я могу удалить файл защиты, сделанный tee?

У меня небольшая программа, и я хочу убедиться, что она работает как с защищенными от записи файлами, так и с защитой от несанкционированных файлов. Итак, вместо использования echo $text > $file или echo $text >> $file , вместо этого я вынужден использовать echo $text | sudo tee $file echo $text | sudo tee $file и echo $text | sudo tee --append $file echo $text | sudo tee --append $file , соответственно. Когда я использую sudo tee , даже если я изменяю разрешения, всякий раз, когда я использую rm в файле, это вызывает меня так:

 $ ls someFile writeProtectedFile $ rm someFile $ ls writeProtectedFile $ rm writeProtectedFile rm remove write-protected regular file 'writeProtectedFile'? yes $ ls 

Затем я толкнул в Интернете, ища возможные решения моей дилеммы. Там было только два: я мог найти: неправильные разрешения или измененный набор разрешений. Я знал, что вопрос о разрешениях неверен, потому что я мог легко изменить разрешения, запустив sudo chmod xxx filename , что приведет к успешному изменению прав доступа. Я предположил тогда, что возникла проблема с файловыми атрибутами, поэтому я запустил lsattr в файле, и он выдаст -------------e-- , как и любой другой файл в каталоге.

Обновить

Причина, по которой я использовал tee заключалась в том, чтобы эхо-текст записывал защищенные файлы, но в качестве побочного эффекта он также записывал защищенные обычные файлы … Моя цель состояла в том, чтобы сделать что-то вроде sudo echo "whatever" >> /etc/someFile , который не работает, поэтому я нашел решение в echo "whatever" | sudo tee /etc/someFile echo "whatever" | sudo tee /etc/someFile .

Команда tee , когда передается несуществующий файл в качестве параметра, создаст этот файл перед записью вывода на него. Предоставляя эту команду с помощью sudo , вы запрашиваете у вашей оболочки команду tee как root . Следствием этого является то, что файл, созданный tee , принадлежит пользователю, начинающему команду: root , и поэтому доступен только для чтения для других пользователей. Вы можете это увидеть самостоятельно, если запустите ls -l и посмотрите на столбцы user и group .

 $ rm -f writeProtectedFile # Removing the file in case it already exists $ echo $text | sudo tee writeProtectedFile yourtext $ ls -l total 4 -rw-r--r-- 1 root root 9 22.07.2015 14:26 writeProtectedFile 

Существует несколько вариантов преодоления этого:

  • Создайте файл в качестве стандартного пользователя перед тем, как попросить tee написать ему. tee будет либо усекать, либо просто – --append к нему, не изменяя его права собственности:

     $ touch writeProtectedFile # creates the file as standard user $ echo $text | sudo tee writeProtectedFile $ rm writeProtectedFile 
  • Измените права собственности на файл, прежде чем пытаться его удалить:

     $ echo $text | sudo tee writeProtectedFile $ sudo chown $(whoami) writeProtectedFile # `whoami` returns the current user name $ rm writeProtectedFile 
  • Скажите rm чтобы игнорировать тот факт, что файл защищен от записи, используя -f, --force :

     $ echo $text | sudo tee writeProtectedFile $ rm --force writeProtectedFile 

Если файл, который вы создаете, находится в /etc , вам все равно не удастся его удалить. То есть, если мы являемся обычным пользователем, и мы делаем это:

 $ sudo touch /etc/foobar $ rm /etc/foobar 

touch будет работать, но rm будет работать, потому что у нас нет прав на запись в каталог /etc

На уровне ядра операционной системы права на запись в файл не имеют отношения к его удалению (или переименовать / переместить). Запрос об удалении защищенного от записи файла – это просто функция уровня приложения, приготовленная в программе rm . Когда вы скажете « y в приглашении, rm делает вызов операционной системе (скорее всего, unlink функцию), чтобы удалить файл, не изменяя сначала его разрешения. (Обратите внимание, что поскольку вы не являетесь владельцем файла, изменение его прав даже не разрешено!)

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

Итак, вкратце, здесь нужно сделать следующее:

 $ sudo rm -f /etc/foobar 

sudo должно быть root, чтобы иметь необходимый доступ для записи в /etc и -f для подавления запроса из rm .

Вы говорите, что ваша цель эквивалентна

 sudo echo "whatever" >> /etc/someFile 

но с перенаправлением >> также заданы права root. Вы рассматривали эту альтернативу?

 sudo sh -c "echo 'whatever' >> /etc/someFile" 

Я использовал двойные кавычки вокруг выражения, так что переменные оболочки (если они есть) интерполируются до sudo sh , вместо того, чтобы пытаться отложить оценку для sh . Это происходит главным образом из-за того, что sudo отключает среду, поэтому некоторые переменные могут отсутствовать, а другие могут быть сброшены. Пример Fo $$ будет представлять pid вызывающего, а не sh .