ИТ Блог. Администрирование серверов на основе Linux (Ubuntu, Debian, CentOS, openSUSE)

Перенаправление стандартного вывода в файл с помощью sudo и tee

Перенаправление стандартного вывода в файл с помощью sudo и tee

При попытке изменить файл без разрешения на запись в него вы получите ошибку 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 укажите текущее имя файла.

Exit mobile version