Neovim: сохранение файлов от root

Опубликовано 20.11.2024 в OpenBSD

Никогда Ахмет не считал, что ночь создана для сна. Ему она всегда казалась тем, что в армии звалось личным временем, а на гражданке не звалось никак. До Всего Этого только ночью он чувствовал себя более-менее собой, свободным от беззвучного гвалта в ушах... Аль-Атоми, Беркем. "Мародер".

Вот и я за полночь уже, в личное своё время, решил причинить себе пользу. Найти что-нибудь такое раздражающее и настроить для вящего своего удовольствия. Вот, например: как старый вимер, я давно обзавелся одной вредной привычной: открывать на редактирование всякие там файлы конфигураций в /etc, обычно доступные только root, не используя, как белые люди, всякий там sudoedit, а так просто, в обычном vim от непривилегированного пользователя. Почему? Потому что в vim можно было применить давно известное заклинание :w !sudo tee %, ввести пароль и изменения в readonly-файл сохранялись от root.

Но некоторое время назад я перелез с vim на neovim, где эта уже родная мне фича, оказывается, не работает. Причем, утверждается, что это не баг, а так и было задумано - создатели neovim заигрались в клиент-серверную модель и недовольным предлагают пойти в сад. В смысле, искать обходные пути.

А их, обходных, есть: например, можно установить себе добрыми людьми написанный плагин suda.vim, добавляющий в редактор новые команды: :SudaRead позволяет открыть текущий файл через sudo, а :SudaWrite, соответственно, записать в него изменения через sudo. И я установил.

Но есть еще один жирный нюанс: из коробки плагин предполагает наличие в системе той самой утилиты sudo. А в OpenBSD, верной принципу "не усложняй" (или идеологии "просто - это когда просто устроено"), из коробки в базовой системе идет для этих же целей утилита doas - более просто и прозрачно конфигурируемая, легкая и, соответственно, менее подверженная всяческим уязвимостям (меньше кода - меньше ошибок). В плагине же suda.vim присутствует лишь "рудиментарная" поддержка doas, а именно: можно пользоваться doas только если текущему пользователю разрешено выполнять команды без ввода пароля (поскольку doas не умеет читать пароль из stdin, а пытается открыть tty). Но это не наш метод!

Можно, разумеется, просто установить себе этот самый sudo. В пакетной базе OpenBSD оно присутствует и даже в разных вариантах - но я как раз не хотел бы тащить sudo себе в систему. Можно, наверное, найти и еще какие-нибудь обходные варианты, но я решил использовать утилиту su - присутствующую по умолчанию и OpenBSD и вообще везде. Правда, в этом случае, в отличие от sudo, вводить нужно будет пароль root, а не текущего пользователя.

Итак, пишем скриптик-обертку ~/.config/nvim/nvim-su.sh следующего содержания:

#!/usr/bin/env sh
exec su -l root -c "$*"

и в настройках neovim (где-нибудь в ~/.config/nvim/lua/options.lua) вписываем вызов этого скрипта:

vim.g["suda#executable"] = '~/.config/nvim/nvim-su.sh'

там же можно изменить отображаемую при вводе пароля подсказку (чтоб не забыть, что нужен именно пароль root) и создать пользовательскую команду для пущего удобства (я выбрал :W по аналогии с :w):

vim.g["suda#prompt"] = 'Enter ROOT password: '
vim.api.nvim_create_user_command('W', ':SudaWrite', {})

На этом, собственно, всё: можно снова предаваться вредной своей привычке, редактируя системные конфиги под текущим юзером.

TODO: Надо будет когда-нибудь собраться и вместо использования плагина написать собственную функцию на lua, делающую то же самое (благо код плагина достаточно прозрачен). Но это потом.