При попытке изменить файл без разрешения на запись в него вы получите ошибку permission denied. Глобальное изменение разрешения для рассматриваемого файла может быть неправильным подходом, поскольку это может привести к серьезным дырам в безопасности, подумайте о некоторых файлах в /etc.
[andreyex@host ~]$ touch donottouch.txt && sudo chown root donottouch.txt [andreyex@host ~]$ cat donottouch.txt [andreyex@host ~]$ echo "change stuff" > donottouch.txt -bash: donottouch.txt: Permission denied
Использование sudo before echo вам не поможет, поскольку перенаправление все равно будет применяться в вашей среде командной строки. Вот несколько подходов к этой проблеме.
Очевидно, что вы можете переключиться на привилегированного пользователя с помощью sudo -i (см. man sudo):
[andreyex@host ~]$ sudo -i Password: [root@host ~]$ echo "change stuff" > donottouch.txt
К сожалению, этот подход не работает, если вы пытаетесь автоматизировать задачу и не хотите, чтобы скрипт запускался от имени root. Одним из вариантов было бы использовать sudo и корректно вычислять код в однострочном:
[andreyex@host ~]$ sudo sh -c 'echo "change stuff" > donottouch.txt' [andreyex@host ~]$ cat donottouch.txt change stuff
Лучшим подходом, позволяющим использовать более детализированные разрешения в файле sudoers, было бы использовать комбинацию sudo и tee (она же pipe fitting).
Утилита tee копирует стандартный ввод в стандартный вывод, создавая копию в нулевых или более файлах. Вывод небуферизован.
[andreyex@host ~]$ echo "change stuff" | tee donottouch.txt -bash: donottouch.txt: Permission denied [andreyex@host ~]$ echo "change stuff" | sudo tee donottouch.txt Password: change stuff [andreyex@host ~]$ cat donottouch.txt change stuff
Если вы не хотите видеть текст, отображаемый tee, вам просто нужно перенаправить стандартный вывод на /dev/null.
$ echo "change stuff" | sudo tee donottouch.txt >/dev/null Password: $ cat donottouch.txt change stuff
Использование tee -a позволит вам добавлять содержимое так же, как вы бы делали с >>.
👉 Вы можете использовать тот же метод непосредственно из vim использования комбинации :w !sudo tee %. Содержимое буфера :w отправляется следующей команде. ! Выполните внешнюю команду и sudo tee будет сделано, как указано выше. % в vim укажите текущее имя файла.