tgoop.com/interface31/4165
Create:
Last Update:
Last Update:
Перенаправление и права в Linux
Если нам нужно что-либо записать или дописать в файл, то мы обычно делаем так:
echo “Hello” > file.txt
Или
echo “Hello” >> file.txt
В первом случае мы перепишем содержимое файла, во втором – допишем в конец. Кстати, это важный момент, запомните и не путайте!
Но как быть, если нужно выполнить запись в файл, который не принадлежит текущему пользователю?
Напрашивается привычное:
sudo echo “Hello” >> file.txt
Но неожиданно получим «Отказано в доступе», почему? Давайте разбираться кто за что отвечает. При входе пользователя в систему в ней сразу запускается командная оболочка, тоже самое происходит если мы запускаем эмулятор терминала.
Оболочка запускается от имени текущего пользователя, и именно она позволяет нам выполнять команды, она же занимается перенаправлениями и конвейером.
Команда sudo позволяет нам выполнить команду с правами суперпользователя и этой командой будет echo, которая выведет указанный текст в стандартный поток вывода. На этом ее работа закончилась. Перенаправлением потока будет заниматься оболочка, которая запущена от обычного пользователя.
Чтобы все-таки выполнить запись в файл мы можем сделать так:
sudo bash -c ‘echo “Hello” >> file.txt’
В этом случае мы запустим с повышенными правами еще один экземпляр оболочки, который выполнит указанную команду и завершит свою работу. А так как оболочка запущена с повышенными правами, то и проблем с перенаправлением у нас не возникнет.
Аналогичная ситуация возникает и с конвейером, так как этим занимается оболочка, то все команды в цепочке будут выполняться от имени того пользователя, кто запустил оболочку, если не указано иного.
Например, для решения нашей задачи можно использовать:
echo “Hello” | tee -a file.txt
Если мы напишем:
sudo echo “Hello” | tee -a file.txt
То с повышенными правами будет выполнено только echo, а tee получит отказ в доступе, так как запустивший ее пользователь не имеет прав доступа.
Правильно:
echo “Hello” | sudo tee -a file.txt
Для выполнения первой команды нам повышенные права не нужны, а вот tee нужно дать доступ к файлу и поэтому мы запускаем ее через sudo.
Поэтому, работая с оболочкой всегда помните, кто выполняет те или иные действия и какие права при этом имеет, что поможет избежать подобных ошибок и недоразумений.
BY Записки IT специалиста

Share with your friend now:
tgoop.com/interface31/4165