sudo echo "что-то" >> /etc/привилегированныйФайл не работает
Заголовок: Проблема с использованием sudo для редиректа вывода в файл, на который нет разрешений
Текст вопроса:
Это довольно простая проблема, по крайней мере, так кажется. Я сталкиваюсь с ней, когда пытаюсь использовать sudo для изменения файловой системы в Linux, например, пытаюсь добавить информацию в файл <code>/etc/hosts</code>
или в аналогичный файл.
Я часто пытаюсь выполнить команду с использованием <code>></code>
или <code>>></code>
для перенаправления вывода, но в результате получаю сообщение об ошибке, даже если у меня есть привилегии root.
Вопрос: Есть ли способ осуществить редирект без необходимости переходить в режим root с помощью <code>su</code>
или <code>sudo su</code>
?
Спасибо за помощь!
5 ответ(ов)
Используйте tee --append
или tee -a
.
Для добавления строки в файл /etc/apt/sources.list
вы можете использовать следующую команду:
echo 'deb blah ... blah' | sudo tee -a /etc/apt/sources.list
Чтобы избежать вывода данных в консоль, перенаправьте вывод в /dev/null
:
echo 'deb blah ... blah' | sudo tee -a /etc/apt/sources.list > /dev/null
Не забудьте про флаг (-a
/--append
)! Просто tee
будет работать как >
, и перезапишет ваш файл. tee -a
работает как >>
и добавляет данные в конец файла.
Проблема заключается в том, что перенаправление вывода выполняется оболочкой, а не командой sudo
или echo
, поэтому это происходит от имени вашего обычного пользователя.
Попробуйте следующий фрагмент кода:
sudo sh -c "echo 'что-то' >> /etc/privilegedfile"
Проблема в том, что редирект обрабатывает ваша оболочка; она пытается открыть файл с вашими правами доступа, а не с правами процесса, который вы запускаете с помощью sudo.
Попробуйте использовать что-то вроде этого:
sudo sh -c "echo 'что-то' >> /etc/privilegedFile"
Команда sudo sh -c "echo 127.0.0.1 localhost >> /etc/hosts"
выполняет следующие действия:
sudo
— это команда, которая позволяет выполнять команды с привилегиями суперпользователя (root). Это необходимо, так как файл/etc/hosts
может быть доступен только для чтения обычным пользователям.sh -c
— это команда, которая запускает новую оболочку и выполняет указанный внутри неё скрипт или команду. В данном случае, это командаecho
.echo 127.0.0.1 localhost
— эта часть команды выводит строку127.0.0.1 localhost
, где127.0.0.1
— это IP-адрес, аlocalhost
— его стандартное имя.>> /etc/hosts
— данный оператор>>
используется для добавления (аппенда) вывода команды в конец указанного файла, в данном случае в файл/etc/hosts
. Если файл не существует, он будет создан.
Таким образом, вся команда добавляет строку 127.0.0.1 localhost
в файл /etc/hosts
. Это может быть полезно, если вы хотите убедиться, что имя "localhost" всегда ссылается на ваш локальный компьютер. Однако, будьте внимательны: многократное выполнение этой команды может привести к дублированию этой строки в файле, что не рекомендуется.
Использование
sudo sh -c "echo >> somefile"
должно сработать. Проблема в том, что >
и >>
обрабатываются вашей оболочкой, а не командой, выполненной с помощью sudo
. Поэтому права доступа будут определяться вашими правами, а не правами пользователя, в которых вы выполняете команду с помощью sudo
.
Для того чтобы избежать этой проблемы, вы можете использовать следующую команду:
echo "текст" | sudo tee -a somefile
Это поможет получить доступ к файлу с нужными правами. Команда tee
перенаправляет текст в файл и работает с правами пользователя, под которым вы выполнили sudo
, обеспечивая правильный доступ для записи в файл.
Как запросить ввод Yes/No/Cancel в скрипте оболочки Linux?
Как объявить и использовать логические переменные в shell-скрипте?
Как выводить команды оболочки по мере их выполнения
Как сделать паузу в shell-скрипте на одну секунду перед продолжением?
Как работает "cat << EOF" в bash?