Завершение avfs фальсифицирует каталоги в zsh

Если Вы не имеете никакого контроля над сетью вообще, и также никакое управление клиентскими компьютерами и Вашим сервером не доступно снаружи, я боюсь это не возможный. Предположите, что это было бы, что будет препятствовать тому, чтобы Вы перенаправили Google или stackexchange к Вашему серверу?

Что можно сделать, должен попросить администратор создавать запись DNS для abcd указать на Ваш IP-адрес. Затем все, в чем Вы нуждаетесь, является веб-сервером, слушающим на стандартных портах. Если он отказывается от всего, что можно сделать, доступ веб-сервер через IP-адрес вместо имени хоста.

37
20.05.2017, 02:38
2 ответа

В ZSH вы можете использовать Compctl -k , чтобы зарегистрировать свою собственную функцию для параметров завершения генерации. Например:

compctl -f -c -u -r -K myAVFScompletion "*" -tn

Затем вам нужно определить свою собственную функцию:

myAVFScompletion () {
    read -c COMMAND ARGS

    # Decide what paths you want to suggest completion for
    # by looking inside the ~/.avfs folder.

    # Place your suggestions into an array:
    reply=( a_path b_path ... )
}

Очевидно, что вышеупомянутая потребуется еще некоторую работу, но с чего начать.

Аналогичная (но другая) пользовательская функция завершения может быть зарегистрирована для Bash.

Вот пример с реализациями для Bash и ZSH . (Он предлагает завершение параметров командной строки, схватив параметры на странице человека команды.)

И вот некоторые быстрые догадки у вещей, которые могут работать внутри вашей функции завершения:

if [[ -d "$ARGS#" ]]
then reply=( "$ARGS#" )
else reply=
fi

или, возможно, это:

reply=( $(find ~/.avfs -type f -name "*.tgz" -or -name "*.zip" | sed 's+$+#+') )

Удачи!

0
27.01.2020, 19:36

Фальшивый ответ кажется недостаточным для этого поддельного вопроса; поддержка сборки zsh для каталогов автомобилей работает на каталогах (fake-файлы dir:names), а не на шаблонах файлов в них. Это удобно для добавления специфических именованных файлов в каталог, который может подходить для automount или sshfs или настройки типа NetApp .snapshot, в которых каталог, монтируемый в каталог, является известным статическим именем, ALAS.

autoload -U compinit
compinit
zstyle ':completion:*' fake-files $HOME/.avfs:'ALAS POOR YORICK'

zshall(1) говорит, что "имена" - это строки, а эксперименты указывают на мета-символы (например # или \# или '*(e: "echo hi":)') "не работают" по-разному, поэтому я не знаю, как прокрасть глобус в часть имен утверждения fake-файлов . (Рассмотрение Src/Zle/computil.c может точно показать, какими могут быть имена, но это было бы больше похоже на работу). (Также, использование рекурсивных глобусов в позиции каталога для именования архивных файлов не летало, но опять же, потребуется погружение на C, чтобы увидеть, сколько подделок позволяет вам уйти от этого. )

С помощью compdef можно перечислить завершения каталога .avfs:

compdef '_files -g $HOME/.avfs/\*' -p \^
function andthehash {
  reply=($REPLY $REPLY\#)
}
compdef "_files -g $HOME/.avfs/'*(+andthehash)'" -p \^

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

Использование zstyle приближает вас к следующему .zshrc:

autoload -U compinit
compinit

function UnderAVFS {
  local pdir
  [[ -z $1 ]] && return 1
  pdir=$1:a
  [[ ! -d $pdir ]] && pdir=$pdir:h
  [[ ! -d $pdir || $pdir == . ]] && return 1
  while [[ $pdir != / ]]; do
    [[ $pdir == $HOME/.avfs ]] && return 0
    pdir=$pdir:h
  done
  return 1
}

function AVFSExtras {
  if UnderAVFS $REPLY; then
    reply=($REPLY)
    # TODO embiggen list of archive suffixes
    [[ $REPLY == *.(bz2|tbz2) ]] && reply+=($REPLY\#)
  fi
}

# Try to match avfs, otherwise the default pattern. Probably could greatly
# benefit from caching, to avoid hits on UnderAVFS function.
zstyle ':completion:*' file-patterns '*(+AVFSExtras):avfs-files' '%p:all-files'

Однако, он может заполнять только до \#/ бита (на debian squeeze virt с настройкой avfs по умолчанию), но не в виртуальную файловую систему для архива, поэтому потребуется дополнительная работа, чтобы занести заполненные файлы в архивы. Я предполагаю через _call_program ... ls или что-то в этом роде для завершения в бите \#, если только нет более элегантного способа обмануть zsh, чтобы поверить в то, что каталоги, которых не существует, существуют.

Плохие новости! Завершение не проходит через _path_files для поддельных каталогов; подозреваю, что это связано с zsh globbing. Как zsh 4.something on, так и zsh 5.0.8 демонстрируют проблему. Поэтому я подозреваю, что для полного исправления потребовались бы патчи к _path_files, или чтобы написать что-нибудь другое, что в противном случае завершилось бы на этих поддельных каталогах. Отладочная трасса завершения может быть сгенерирована путем ввода ls /root/.avfs/root/sometar.gz\#/, а затем в конце этого ввода controll-x и затем ? , предполагая, что связующая клавиша -e и что _complete_debug обязательно скажет клавишу keycombo, если кто-то захочет разобраться, почему это не удается.

1
27.01.2020, 19:36

Теги

Похожие вопросы