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


1
22.07.2015, 22:43
3 ответа

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

$ 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 затем либо усечет, либо просто - добавит к нему , не меняя владельца:

     $ touch writeProtectedFile # создает файл как стандартный пользователь 
     $ echo $ текст | sudo tee writeProtectedFile 
     $ rm writeProtectedFile 
     
  • Измените владельца файла перед попыткой его удаления:

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

     $ echo $ text | sudo tee writeProtectedFile 
     $ rm --force writeProtectedFile 
     
4
27.01.2020, 23:27

Если файл, который вы создаете, находится в / 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 .

0
27.01.2020, 23:27

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

sudo echo "whatever" >> /etc/someFile

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

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

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

-1
27.01.2020, 23:27

Теги

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