Как зайти в Даркнет?!
25th January, 01:11
6
0
Как в tkinter из поля ввода Entry получить значение в одну переменную и обновить строку кнопкой, затем получить ещё одно введённое значение и затем сложить их. Ниже пример кода
21st July, 19:00
895
0
Программа, которая создает фейковые сервера в поиске игровых серверов CS 1.6 Steam
21st March, 17:43
948
0
Очень долго работает Update запрос Oracle
27th January, 09:58
914
0
не могу запустить сервер на tomcat HTTP Status 404 – Not Found
21st January, 18:02
905
0
Где можно найти фрилансера для выполнения поступающих задач, на постоянной основе?
2nd December, 09:48
938
0
Разработка мобильной кроссплатформенной военной игры
16th July, 17:57
1724
0
период по дням
25th October, 10:44
3955
0
Пишу скрипты для BAS только на запросах
16th September, 02:42
3720
0
Некорректный скрипт для закрытия блока
14th April, 18:33
4613
0
прокидывать exception в блоках try-catch JAVA
11th March, 21:11
4381
0
Помогите пожалуйста решить задачи
24th November, 23:53
6086
0
Не понимаю почему не открывается детальное описание продукта
11th November, 11:51
4351
0
Нужно решить задачу по программированию на массивы
27th October, 18:01
4396
0
Метода Крамера С++
23rd October, 11:55
4309
0
помогите решить задачу на C++
22nd October, 17:31
4002
0
Помогите решить задачу на python с codeforces
22nd October, 11:11
4492
0
Python с нуля: полное руководство для начинающих
18th June, 13:58
2599
0
Получение корневых разрешений на файл внутри vi?
Часто при редактировании конфигурационных файлов я открываю один из них с vi, а затем, когда я иду, чтобы сохранить его, понимаю, что я не набирал
sudo vi filename
Есть ли способ предоставить vi sudo права на сохранение файла? Я, кажется, помню, что видел что-то об этом, когда искал что-то о vi некоторое время назад, но теперь я не могу найти это.
% заменяется на текущее имя файла, таким образом, вы можете использовать:
:w !sudo tee %
( vim обнаружит, что файл был изменен, и спросит, хотите ли вы, чтобы он был перезагружен. Скажите "да", выбрав [L] вместо OK.)
В качестве ярлыка вы можете определить свою собственную команду. Поместите следующее в свой .vimrc :
command W w !sudo tee % >/dev/null
С помощью вышеизложенного вы можете ввести :W<Enter> , чтобы сохранить файл. С тех пор как я написал это, я нашел более приятный способ (на мой взгляд) сделать это:
cmap w!! w !sudo tee >/dev/null %
Таким образом, вы можете ввести :w!! , и он будет расширен до полной командной строки, оставив курсор в конце, так что вы можете заменить % своим именем файла, если хотите.
Общие Предостережения
Самый распространенный способ обойти проблему с файлами только для чтения - Открыть канал для текущего файла в качестве суперпользователя, используя реализацию 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
Однако Совет Райана в целом хорош, если после выполнения шага 3 не перемещайте временный файл; у него будут неправильные права собственности и разрешения. Вместо этого, sudoedit правильный файл и считывает содержимое (используя :r или подобное) временного файла.
Если следовать шагу 2, Используйте :w! для принудительной записи файла.
Когда вы переходите в режим вставки файла, к которому вам нужен доступ 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
Возможно, есть и менее окольный способ сделать это, но он работает.
Вот еще один, который появился после ответа на этот вопрос, плагин под названием SudoEdit, который предоставляет функции SudoRead и SudoWrite, которые по умолчанию будут пытаться использовать sudo сначала и Су, если это не удастся: http://www.vim.org/scripts/script.php?script_id=2709
Быстрый Google, кажется, дает этот совет:
- Не пытайтесь редактировать, если он доступен только для чтения.
- Возможно, вы сможете изменить разрешения для этого файла. (Позволит ли это вам сэкономить или нет, зависит от экспериментов.)
- Если вы все равно редактировали, сохраните его во временный файл, а затем переместите.
http://ubuntuforums.org/showthread.php?Т=782136
Быстрый хак, который вы можете рассмотреть, это выполнение 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)
Конечно, я не рекомендую этот подход в системе, где вы беспокоитесь о безопасности, так как в течение нескольких секунд любой может прочитать/изменить файл без вашего ведома.