Команда 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
Если файл, который вы создаете, находится в / 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
парирует среду, так что некоторые переменные могут не существовать, а другие могли быть сброшены. В примере $$
будет представлен pid вызывающего а не sh
.