Получение прав суперпользователя на файле внутри VI?

голоса
227

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

sudo vi filename

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

Задан 04/08/2008 в 04:34
источник пользователем
На других языках...                            


11 ответов

голоса
1

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

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

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

Ответил 04/08/2008 в 04:39
источник пользователем

голоса
7

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

Если следующий шаг 2, использовать , :w!чтобы заставить файл , который будет записан.

Ответил 04/08/2008 в 05:04
источник пользователем

голоса
29

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

:w !sudo tee myfile
Ответил 04/08/2008 в 07:52
источник пользователем

голоса
-2

Быстрый хак вы можете рассмотреть делает 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)

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

Ответил 05/08/2008 в 23:20
источник пользователем

голоса
3

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

-- INSERT IGNORE  -- 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

Там, наверное, менее окольный способ сделать это, но это работает.

Ответил 12/08/2008 в 19:37
источник пользователем

голоса
276

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

:w !sudo tee %

( vimОбнаружит , что файл был изменен , и спросит , хотите ли вы это перезагрузиться.)

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

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

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

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

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

Ответил 31/08/2008 в 20:23
источник пользователем

голоса
10

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

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

Ответил 24/09/2008 в 05:12
источник пользователем

голоса
0

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

alias svim='sudo vim'

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

Ответил 19/03/2009 в 13:51
источник пользователем

голоса
1

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

Ответил 29/01/2010 в 18:21
источник пользователем

голоса
-7

использовать gksudo вместо Суда для GVim т.е.

cmap w!! w !gksudo tee >/dev/null %
Ответил 30/11/2010 в 07:33
источник пользователем

голоса
13

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

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

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

Решения

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

" 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принимает путь к файлу , который писать. :!сама по себе выполняет команду в оболочке (например, с помощью 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файл, создавая его , если он уже не существует:

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
Ответил 13/10/2012 в 07:54
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more