zsh
предоставляет множество возможностей, частью которых является функция _user_expand
для предоставления так называемых -«пользовательских расширений» случайных входных данных для случайных выходных данных. Например.
# turn on completion system
autoload -U compinit
compinit
# how to mangle inputs; this is a hash or "associative array" of terms
declare -A manglements
manglements=( fn function )
# register mangler and enable _user_expand
zstyle ':completion:*:user-expand:*' user-expand '$manglements'
zstyle ':completion:*' completer _user_expand _complete _ignored
С этим набором в .zshrc
или подобным,вводfn
вкладкапробел должен заменить этот текст наfunction
(или, по крайней мере, это так для меня. Ввод вышеуказанных строк в zsh 5.3.1 запускается как zsh -f
, чтобы избежать конфликта с любой существующей конфигурацией ). ]. Чтобы ограничить ввод только вкладкойfn
, установите параметр add-space
zstyle ':completion:*:user-expand:*' add-space 1
хотя, если вам действительно нужен волшебный пробел вместо табуляции , для этого необходимо, чтобы клавиша пробела была привязана к виджету, что немного более важно (и опасное )изменение.
declare -A manglements
manglements=( fn function )
function magic-space-bar {
local -a le_vlapoi
# split on words, see zshexpn(1)
le_vlapoi=(${(z)BUFFER})
# only mangle the first word, not surprisingly in middle of some
# "echo blah fn..." sequence (this is the same as the `alias -g`
# rake problem waiting to whap you in the face)
if [[ $#le_vlapoi -eq 1 ]]; then
local romoi
romoi=$manglements[$le_vlapoi[-1]]
if [[ -n $romoi ]]; then
le_vlapoi[-1]=$romoi
BUFFER="$le_vlapoi"
fi
fi
# ensure the typed space happens regardless
BUFFER="$BUFFER ";
CURSOR=$#BUFFER
}
zle -N magic-space-bar
autoload -U compinit
compinit
bindkey ' ' magic-space-bar
bindkey -M isearch ' ' self-insert
Утечка DNS происходит, когда система, использующая VPN-подключение, делает DNS-запрос с использованием DNS-серверов локального поставщика услуг Интернета вместо передачи DNS-запроса через VPN-туннель на DNS-сервер VPN-провайдера (или к любому другому DNS-серверу. сервер по вашему выбору ).
Если вы просто отбрасываете исходящие DNS-запросы на ваши не -сетевые интерфейсы VPN, ваш доступ к сети с использованием имен хостов может стать неудобно медленным (, так как необходимые DNS-запросы перед каждым новым подключением должны будут истечь по тайм-ауту перед альтернативным DNS-сервер, предположительно настроенный VPN, пробуется )или полностью останавливается (, если ваш локальный преобразователь DNS не получил новые DNS-серверы от VPN-клиента и продолжает повторять попытки только заблокированных вами серверов интернет-провайдера ). ].
Вместо того, чтобы просто пытаться «заблокировать утечку», вы должны выяснить, почему DNS-серверы VPN-провайдера не настраиваются для монопольного использования при активации вашего VPN-подключения.
Сначала следует убедиться, что при активации VPN-подключения настройки, относящиеся к DNS-серверам вашего интернет-провайдера, заменяются другими DNS-серверами, настроенными VPN-клиентом.
Чтобы узнать, где искать, сначала запустите grep hosts /etc/nsswitch.conf
и посмотрите на результат. Он будет иметь формат:
hosts: <some keywords>
Это определяет механизмы, используемые для разрешения имен хостов.
Вместо <some keywords>
должно быть как минимум files
(, относящееся к/etc/hosts
)и либо dns
, либо resolve
. Могут быть и другие ключевые слова.
dns
означает стандартную библиотеку преобразователя DNS glibc, которая будет искать конфигурацию в /etc/resolv.conf
. В системах, связанных с Debian -(, включая *Ubuntu, Mint и т.п. ), этот файл конфигурации часто управляется инструментом resolvconf
вместо непосредственного внесения изменений в /etc/resolv.conf
. Инструмент resolvconf
отслеживает настройки DNS, связанные с каждым сетевым интерфейсом, как для создания общего /etc/resolv.conf
в соответствии с настраиваемыми приоритетами сетевых интерфейсов, так и для обеспечения восстановления соответствующих настроек DNS при отключении сетевого интерфейса.
Если в вашей системе используется resolvconf
, прочтите man 5 interface-order
, а затем проверьте файл конфигурации /etc/resolvconf/interface-order
, чтобы убедиться, что ваш VPN-интерфейс будет иметь более высокий приоритет, чем физический интерфейс, поверх которого работает VPN-подключение.
resolve
означает, что используется новый systemd-resolved
; запустите resolvectl status
, чтобы увидеть его конфигурацию. Обычно это означает, что /etc/resolv.conf
будет содержать только строку nameserver 127.0.0.53
, перенаправляя любые DNS-запросы, выполненные с использованием старого преобразователя glibc, обратно в systemd-resolved
.
Если VPN-клиент не знает о существовании инструмента resolvconf
или механизма systemd-resolved
при использовании одного или обоих из них, результатом будет беспорядок. К сожалению, вам нужно убедиться, что ваш сервис openvpn полностью интегрируется с этими инструментами, если они используются в вашей системе.
Также возможно, что демон NetworkManager
используется для общего управления сетевыми интерфейсами. Этот демон может использовать resolvconf
и/или systemd-resolved
или просто обновлять /etc/resolv.conf
напрямую, если эти другие компоненты не используются в вашей системе.
Не зная названия и версии вашего дистрибутива Linux и вашей текущей конфигурации, будет сложно дать какой-либо совет.
Если вы хотите получить лучший ответ, отредактируйте свой вопрос, включив в него как можно больше следующей информации:
hosts:
в вашем /etc/nsswitch.conf
? NetworkManager
и/или resolvconf
или она будет редактировать /etc/resolv.conf
напрямую?