Сведения о вопросе

None

16:03, 1st July, 2020

Теги

linux   unix   vi    

Получение корневых разрешений на файл внутри vi?

Просмотров: 465   Ответов: 11

Часто при редактировании конфигурационных файлов я открываю один из них с vi, а затем, когда я иду, чтобы сохранить его, понимаю, что я не набирал

sudo vi filename

Есть ли способ предоставить vi sudo права на сохранение файла? Я, кажется, помню, что видел что-то об этом, когда искал что-то о vi некоторое время назад, но теперь я не могу найти это.



  Сведения об ответе

прога

18:03, 1st July, 2020

% заменяется на текущее имя файла, таким образом, вы можете использовать:

:w !sudo tee %

( vim обнаружит, что файл был изменен, и спросит, хотите ли вы, чтобы он был перезагружен. Скажите "да", выбрав [L] вместо OK.)

В качестве ярлыка вы можете определить свою собственную команду. Поместите следующее в свой .vimrc :

command W w !sudo tee % >/dev/null

С помощью вышеизложенного вы можете ввести :W<Enter> , чтобы сохранить файл. С тех пор как я написал это, я нашел более приятный способ (на мой взгляд) сделать это:

cmap w!! w !sudo tee >/dev/null %

Таким образом, вы можете ввести :w!! , и он будет расширен до полной командной строки, оставив курсор в конце, так что вы можете заменить % своим именем файла, если хотите.


  Сведения об ответе

COOL

18:03, 1st July, 2020

Как правило, вы не можете изменить эффективный идентификатор пользователя процесса vi, но вы можете сделать это:

:w !sudo tee myfile


  Сведения об ответе

lats

18:03, 1st July, 2020

Общие Предостережения

Самый распространенный способ обойти проблему с файлами только для чтения - Открыть канал для текущего файла в качестве суперпользователя, используя реализацию sudo tee . Тем не менее, все самые популярные решения, которые я нашел в Интернете, имеют сочетание нескольких потенциальных предостережений:

  • Весь файл записывается в terminal, а также сам файл. Это может быть медленным для больших файлов, особенно при медленном сетевом подключении.
  • Файл теряет свои режимы и аналогичные атрибуты.
  • Пути к файлам с необычными символами или пробелами могут обрабатываться неправильно.

Решения

Чтобы обойти все эти проблемы, можно использовать следующую команду:

" On POSIX (Linux/Mac/BSD):
:silent execute 'write !sudo tee ' . shellescape(@%, 1) . ' >/dev/null'

" Depending on the implementation, you might need this on Windows:
:silent execute 'write !sudo tee ' . shellescape(@%, 1) . ' >NUL'

Они могут быть сокращены, уважительно:

:sil exec 'w !sudo tee ' . shellescape(@%, 1) . ' >/dev/null'
:sil exec 'w !sudo tee ' . shellescape(@%, 1) . ' >NUL'

Объяснение

: запускает команду; вам нужно будет ввести этот символ в обычном режиме, чтобы начать ввод команды. Он должен быть опущен в скриптах.

sil[ent] подавляет вывод команды. В этом случае мы хотим остановить приглашение Press any key to continue-like, которое появляется после выполнения команды :! .

exec[ute] выполняет строку как команду. Мы не можем просто запустить :write , потому что он не будет обрабатывать необходимый вызов функции.

! представляет команду :! : единственная команда, которую принимает :write . Обычно :write принимает путь к файлу для записи. :! самостоятельно выполняет команду в shell (например, используя bash -c ). С помощью :write он выполнит команду в shell, а затем запишет весь файл в stdin .

sudo должно быть очевидно, так как именно поэтому вы здесь. Выполните команду от имени суперпользователя. В сети есть много информации о том, как это работает.

tee pipes stdin к данному файлу. :write будет записывать в stdin, затем суперпользователь tee получит содержимое файла и запишет его. Он не создает новый файл-просто перезаписывает содержимое-так что режимы файлов и атрибуты будут сохранены.

shellescape() экранирует специальные символы в данном пути к файлу, соответствующие текущему shell. С помощью всего одного параметра он обычно просто заключает путь в кавычки по мере необходимости. Поскольку мы посылаем в полную командную строку shell, нам нужно будет передать ненулевое значение в качестве второго аргумента, чтобы включить экранирование обратной косой черты других специальных символов, которые в противном случае могли бы споткнуться о shell.

@% считывает содержимое регистра % , который содержит имя файла текущего буфера. Это не обязательно абсолютный путь, поэтому убедитесь, что вы не изменили текущий каталог. В некоторых решениях, вы увидите торгово-символ пропущен. В зависимости от расположения % является допустимым выражением и имеет тот же эффект, что и чтение регистра % . Вложенный в другое выражение ярлык обычно запрещен, однако: например, в этом случае.

>NUL и >/dev/null перенаправляют stdout на устройство платформы null. Несмотря на то, что мы отключили команду, мы не хотим, чтобы все накладные расходы, связанные с трубопроводом stdin , вернулись к vim-лучше всего сбросить их как можно раньше. NUL -это устройство null на DOS, MS-DOS и Windows, а не допустимый файл. По состоянию на Windows 8 перенаправлений на NUL не приводят к записи файла с именем NUL. Попробуйте создать файл на вашем рабочем столе с именем NUL, с расширением файла или без него: вы не сможете этого сделать. (Есть несколько других имен устройств в Windows,которые, возможно, стоит узнать.)

~/.vimrc

платформо-зависимый

Конечно, вы все еще не хотите запоминать их и печатать каждый раз. Гораздо проще сопоставить соответствующую команду с более простой командой пользователя. Чтобы сделать это на POSIX, вы можете добавить следующую строку в свой файл ~/.vimrc , создав его, если он еще не существует:

command W silent execute 'write !sudo tee ' . shellescape(@%, 1) . ' >/dev/null'

Это позволит вам ввести команду :W (с учетом регистра) для записи текущего файла с правами суперпользователя-гораздо проще.

платформо-независимый

Я использую независимый от платформы файл ~/.vimrc , который синхронизируется между компьютерами,поэтому я добавил к своему многоплатформенному функционалу. Вот ~/.vimrc с только соответствующими настройками:

#!vim
" Use za (not a command; the keys) in normal mode to toggle a fold.
" META_COMMENT Modeline Definition: {{{1
" vim: ts=4 sw=4 sr sts=4 fdm=marker ff=unix fenc=utf-8
"   ts:     Actual tab character stops.
"   sw:     Indentation commands shift by this much.
"   sr:     Round existing indentation when using shift commands.
"   sts:    Virtual tab stops while using tab key.
"   fdm:    Folds are manually defined in file syntax.
"   ff:     Line endings should always be <NL> (line feed #09).
"   fenc:   Should always be UTF-8; #! must be first bytes, so no BOM.


" General Commands: User Ex commands. {{{1
    command W call WriteAsSuperUser(@%)         " Write file as super-user.


" Helper Functions: Used by user Ex commands. {{{1
    function GetNullDevice() " Gets the path to the null device. {{{2
        if filewritable('/dev/null')
            return '/dev/null'
        else
            return 'NUL'
        endif
    endfunction

    function WriteAsSuperUser(file) " Write buffer to a:file as the super user (on POSIX, root). {{{2
        exec '%write !sudo tee ' . shellescape(a:file, 1) . ' >' . GetNullDevice()
    endfunction


" }}}1
" EOF

  Сведения об ответе

ITSME

18:03, 1st July, 2020

Если вы используете Vim, то имеется скрипт с именем sudo.vim . Если вы обнаружили, что открыли файл, для чтения которого вам нужен root-доступ, введите

:e sudo:%
Vim заменяет % именем текущего файла, а sudo: указывает скрипту sudo.vim взять на себя функции чтения и записи.


  Сведения об ответе

LIZA

18:03, 1st July, 2020

Однако Совет Райана в целом хорош, если после выполнения шага 3 не перемещайте временный файл; у него будут неправильные права собственности и разрешения. Вместо этого, sudoedit правильный файл и считывает содержимое (используя :r или подобное) временного файла.

Если следовать шагу 2, Используйте :w! для принудительной записи файла.


  Сведения об ответе

COOL

18:03, 1st July, 2020

Когда вы переходите в режим вставки файла, к которому вам нужен доступ sudo для редактирования, вы получаете сообщение о состоянии, говорящее:

-- INSERT -- W10: Warning: Changing a readonly file

Если я этого не замечаю, то, как правило, да

:w ~/edited_blah.tmp
:q
..

затем..

sudo "cat edited_blah.tmp > /etc/blah"
..

или..

sudo mv edited_blah.tmp /etc/blah

Возможно, есть и менее окольный способ сделать это, но он работает.


  Сведения об ответе

ITSME

18:03, 1st July, 2020

Вот еще один, который появился после ответа на этот вопрос, плагин под названием SudoEdit, который предоставляет функции SudoRead и SudoWrite, которые по умолчанию будут пытаться использовать sudo сначала и Су, если это не удастся: http://www.vim.org/scripts/script.php?script_id=2709


  Сведения об ответе

FAriza

18:03, 1st July, 2020

Быстрый Google, кажется, дает этот совет:

  1. Не пытайтесь редактировать, если он доступен только для чтения.
  2. Возможно, вы сможете изменить разрешения для этого файла. (Позволит ли это вам сэкономить или нет, зависит от экспериментов.)
  3. Если вы все равно редактировали, сохраните его во временный файл, а затем переместите.

http://ubuntuforums.org/showthread.php?Т=782136


  Сведения об ответе

dump

18:03, 1st July, 2020

У меня это есть в моем ~/.bashrc:

alias svim='sudo vim'

Теперь всякий раз, когда мне нужно отредактировать конфигурационный файл, я просто открываю его с помощью svim.


  Сведения об ответе

lool

18:03, 1st July, 2020

Быстрый хак, который вы можете рассмотреть, это выполнение chmod на редактируемом файле, сохранение с помощью vim, а затем chmod обратно к тому, что файл был изначально.

ls -l test.file (to see the permissions of the file)
chmod 777 test.file
[This is where you save in vim]
chmod xxx test.file (restore the permissions you found in the first step)

Конечно, я не рекомендую этот подход в системе, где вы беспокоитесь о безопасности, так как в течение нескольких секунд любой может прочитать/изменить файл без вашего ведома.


  Сведения об ответе

dumai

18:03, 1st July, 2020

используйте gksudo вместо sudo для GVim, т. е.

cmap w!! w !gksudo tee >/dev/null %


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться