Часто при редактировании конфигурационных файлов я открываю один с помощью vi, а затем, когда иду, чтобы сохранить его, понимает, что я не печатал
sudo vi filename
Есть ли способ дать привилегии vi sudo для сохранения файла? Кажется, я вспомнил, что видел что-то об этом, когда искал кое-что о vi некоторое время назад, но сейчас я не могу его найти.
Ответы:
%
заменяется текущим именем файла, поэтому вы можете использовать:(
vim
обнаружит, что файл был изменен и спросит, хотите ли вы, чтобы он был перезагружен. Скажите да, выбрав,[L]
а не OK.)В качестве ярлыка вы можете определить свою собственную команду. Поместите следующее в свой
.vimrc
:С вышеупомянутым вы можете напечатать,
:W<Enter>
чтобы сохранить файл. Так как я написал это, я нашел более хороший способ (по моему мнению) сделать это:Таким образом, вы можете ввести текст,
:w!!
и он будет расширен до полной командной строки, оставив курсор в конце, так что вы можете заменить%
его именем файла, если хотите.источник
sudo: 1 incorrect password attempt
/etc/sudoers
файл, добавить егоyour_username ALL=(ALL) ALL
под строкойroot ALL=(ALL) ALL
, выйти и сохранить.visudo
.В общем, вы не можете изменить эффективный идентификатор пользователя процесса vi, но вы можете сделать это:
источник
:w !sudo tee % >/dev/null
или:w !sudo dd of=%
избегайте повторного отображения содержимого файла при сохранении файла.tee
и увидел, что это команда канала Unix, и!
вставил команду оболочки. Является ли:w
написание к стандарту, который получает по каналуtee
?Общие предостережения
Наиболее распространенный способ обойти проблему файла, доступного только для чтения, - открыть канал для текущего файла в качестве суперпользователя, используя реализацию
sudo tee
. Тем не менее, все самые популярные решения, которые я нашел в Интернете, имеют несколько возможных предостережений:Решения
Чтобы обойти все эти проблемы, вы можете использовать следующую команду:
Они могут быть сокращены, с уважением:
объяснение
:
начинает команду; вам нужно будет ввести этот символ в обычном режиме, чтобы начать ввод команды. Это должно быть опущено в сценариях.sil[ent]
подавляет вывод команды. В этом случае мы хотим остановитьPress any key to continue
приглашение -like, которое появляется после запуска:!
команды.exec[ute]
выполняет строку как команду. Мы не можем просто запустить,:write
потому что он не будет обрабатывать необходимый вызов функции.!
представляет:!
команду: единственная команда, которая:write
принимает. Обычно:write
принимает путь к файлу для записи.:!
Сам по себе запускает команду в оболочке (например, используяbash -c
). С помощью:write
он запустит команду в оболочке, а затем запишет весь файл вstdin
.sudo
должно быть очевидно, потому что именно поэтому ты здесь. Запустите команду как суперпользователь. В сети есть много информации о том, как это работает.tee
трубыstdin
к данному файлу.:write
напишетstdin
, затем суперпользовательtee
получит содержимое файла и запишет файл. Он не будет создавать новый файл - просто перезаписать содержимое - так что режимы и атрибуты файла будут сохранены.shellescape()
экранирует специальные символы в указанном пути к файлу в зависимости от текущей оболочки. Имея только один параметр, он обычно заключает путь в кавычки по мере необходимости. Поскольку мы отправляем в командную строку полной оболочки, мы хотим передать ненулевое значение в качестве второго аргумента, чтобы включить экранирование от обратной косой черты других специальных символов, которые в противном случае могли бы привести к отключению оболочки.@%
читает содержимое%
регистра, который содержит имя файла текущего буфера. Это не обязательно абсолютный путь, поэтому убедитесь, что вы не изменили текущий каталог. В некоторых решениях вы увидите, что рекламный символ опущен. В зависимости от местоположения,%
является допустимым выражением и имеет тот же эффект, что и чтение%
регистра. Однако, вложенный в другое выражение, ярлык, как правило, не разрешен: например, в этом случае.>NUL
и>/dev/null
перенаправитьstdout
на нулевое устройство платформы. Несмотря на то, что мы заставили команду замолчать, мы не хотим, чтобы все накладные расходы были связаны с передачейstdin
обратно в vim - лучше всего выкинуть ее как можно раньше.NUL
является пустым устройством в DOS, MS-DOS и Windows, не является допустимым файлом. Начиная с Windows 8 перенаправления на NUL не приводят к записи файла с именем NUL. Попробуйте создать файл на рабочем столе с именем NUL, с расширением или без него: вы не сможете это сделать. (В Windows есть несколько других имен устройств, о которых стоит узнать.)~ / .Vimrc
В зависимости от платформы
Конечно, вы все еще не хотите запоминать их и печатать каждый раз. Гораздо проще сопоставить соответствующую команду с более простой пользовательской командой. Чтобы сделать это в POSIX, вы можете добавить следующую строку в ваш
~/.vimrc
файл, создав его, если он еще не существует:Это позволит вам ввести команду: W (с учетом регистра), чтобы записать текущий файл с правами суперпользователя - гораздо проще.
Независимая платформа
Я использую независимый от платформы
~/.vimrc
файл, который синхронизируется между компьютерами, поэтому я добавил многоплатформенную функциональность в свой. Вот~/.vimrc
только с соответствующими настройками:источник
sudo
существует, но ее нет/dev/null
, поэтому вам нужно быть более изощренной, если вы хотите настоящую кроссплатформенную поддержку. Это скорее вступление - пища для размышлений. :)Если вы используете Vim , есть скрипт с именем sudo.vim . Если вы обнаружили, что открыли файл, для чтения которого вам нужен root-доступ, введите
Vim заменяет% на имя текущего файла иsudo:
дает команду сценарию sudo.vim вступить во владение для чтения и записи.источник
Совет Райана в целом хорош, однако, если вы выполните шаг 3, не перемещайте временный файл; у него будут неправильные права собственности и права доступа. Вместо этого
sudoedit
исправьте файл и прочитайте содержимое (используя:r
или подобное) временного файла.Если выполняется шаг 2, используйте
:w!
для принудительной записи файла.источник
Когда вы переходите в режим вставки файла, для редактирования которого вам необходим доступ sudo, вы получаете сообщение о состоянии
Если я скучаю по этому, как правило, я
..затем..
..или..
Есть, вероятно, менее окольный способ сделать это, но это работает.
источник
Быстрый Google, кажется, дает этот совет:
http://ubuntuforums.org/showthread.php?t=782136
источник
Вот еще один, который появился после того, как на этот вопрос был дан ответ, плагин, называемый SudoEdit, который предоставляет функции SudoRead и SudoWrite, которые по умолчанию будут пытаться сначала использовать sudo и su в случае сбоя: http://www.vim.org/scripts/ script.php? script_id = 2709
источник
У меня есть это в моем ~ / .bashrc:
Теперь, когда мне нужно отредактировать файл конфигурации, я просто открываю его с помощью svim.
источник
sudoedit
должна быть предпочтительной, поскольку она не требует запуска vim от имени пользователя root.Быстрый взлом, который вы можете рассмотреть, - это выполнить chmod для файла, который вы редактируете, сохранить с помощью vim, а затем chmod вернуться к первоначальному файлу.
Конечно, я не рекомендую такой подход в системе, где вы беспокоитесь о безопасности, поскольку в течение нескольких секунд любой может прочитать / изменить файл, даже не подозревая об этом.
источник