
Сохранить файл Vim/Vi без root прав в Unix/Linux
Сейчас я покажу как можно сохранить файл при использовании vi/vim редактора, если у вас, нет root-прав (прав суперпользователя). На первый взгляд, можно подумать — как такое возможно? Как? Нет прав же… Это можно, но для этого нужны sudo права. Если кто-то подумал что записать файл вообще без прав и от обычного юзера — конечно нет. Тогда образовалась дыра в системе. Не так ли?
Смотрим под каким юзером сейчас я нахожусь:
$ echo -e "ID: `id -u` \nUsername: `id -u -n`" ID: 0 Username: root
И так, я root- пользователь. Как известно всем, для него нет преград. логинимся в другого юзера, например:
# su - dexm238
И проверим какой ИД у этого юзера:
$ echo -e "ID: `id -u` \nUsername: `id -u -n`"
Получаем:
ID: 1000 Username: dexm238
Попробуем создать файл, и прописать в него что-то, например:
$ vim /etc/nginx/conf.d/test.conf
При сохранении, получим ошибку:
"/etc/nginx/conf.d/test.conf" E212: Can't open file for writing Press ENTER or type command to continue
Ну что, давайте обойдем все это дело….
И так, открыли файл, прописали в него что нужно, при сохранении, вводим:
:w !sudo tee %
Где,
- :w – Записать данные у файл (буфер).
- !sudo – Вызвать sudo.
- tee – При вызове «:w», все перенаправляется в tee.
- % — это текущее название файла ( у меня это -/etc/nginx/conf.d/test.conf). Другими словами, команда tee запускается как root, и она принимает стандартный ввод (буфер) и записывает его в файл, представленный в %.
Однако это заставит перезагрузить файл снова (нажмите L, чтобы загрузить изменения в самом vim).
Можно использовать утилиту dd, например:
:w !sudo dd of=%
Или:
:w !sudo dd of=% > /dev/null
Можно использовать уилиту cat, например:
:w !sudo sh -c "cat > %"
Для удобства, можно прописать команду, открываем ~/.vimrc файл:
# vim ~/.vimrc
И прописываем в него:
command W :execute ':silent w !sudo tee % > /dev/null' | :edit!
Вот еще несколько других вариаций команды:
command W w !sudo tee % >/dev/null
Можно названичить команду на букву, например:
cmap w!! w !sudo tee >/dev/null %
Или:
map w :execute ':silent w !sudo tee % > /dev/null' <bar> :edit! <cr>
Так же:
command W :silent execute 'write !sudo tee ' . shellescape(@%, 1) . ' >/dev/null'
Или:
command W :sil exec 'w !sudo tee ' . shellescape(@%, 1) . ' >/dev/null'
Можно использовать шорткат:
cnoremap w!! w !sudo tee > /dev/null %
Или:
cnoremap w!! execute 'silent! write !sudo tee % >/dev/null' <bar> edit!
PS: В таком случае — сохранение будет «w!!».
Сохраняем файл, и пробуем что-то отредактировать, например:
$ vi /etc/hosts
И сейчас, чтобы сохранится — используем W.
Вот и все, статья «Сохранить файл Vim/Vi без root прав в Unix/Linux» завершена.
давно пользуюсь такой фишкой, только в упрощенном варианте