Может ли сценарий bash включать собственные автодополнения?

Когда вы входите в систему через ssh и pam _afs _session.so активен, он генерирует билет Kerberos и использует его для создания токена AFS. Когда вы выйдете из системы, он удалит и билет Kerberos, и токен AFS.

Как вы заметили, билеты Kerberos хранятся в файлах, а токены AFS хранятся в ядре, в PAG (Process Authentication Group ). При подключении через второй сеанс SSH библиотека pam _afs _session.so создаст новый билет Kerberos в новом файле и новый токен AFS в новом PAG.

Самый простой способ сохранить активным токен AFS в сеансе экрана GNU — это:

  1. Создайте новый файл билета Kerberos. Существующий, вероятно, что-то вроде /tmp/krb5cc _UID _RANDOM . Сделайте один с новой строкой RANDOM.
  2. Скопируйте существующий файл билета в новый, который вы только что создали.
  3. Измените (и экспортируйте )переменную среды KRB5CCNAME на новое имя, которое вы создали.
  4. Экран запуска -r
  5. Теперь вы можете выйти из внешней оболочки. Это удалит ваш билет Kerberos из вашего старого файла билета, но ваша копия по-прежнему будет действительна во внутренней оболочке. Однако он также удаляет ваш токен AFS, поэтому...
  6. При повторном подключении к внутренней оболочке запустите aklog . Это скопирует ваш билет Kerberos (, который вы сохранили ), в новый токен AFS. Он должен оставаться действительным до истечения срока его действия. Прежде чем выйти из внутренней оболочки, вам, вероятно, следует запустить kdestroy , чтобы удалить билет Kerberos, который вам больше не нужен.
4
31.01.2020, 21:34
1 ответ

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

Я читал по этому вопросу, что такая функция вряд ли появится в Bash в ближайшее время из-за проблем с совместимостью и ресурсами — как оболочка, она предназначена для надежной работы на множестве различных систем с разнообразие целей и адаптация к предпочтениям самых разных пользователей; и у него есть только один человек в качестве разработчика и сопровождающего 1 .

В то время как Bash предоставляет инструменты для реализации автозавершения, генераторы автозавершения, по-видимому, задуманы как внешние средства. И действительно то, что вы ищете, может быть легко реализовано с помощью существующих инструментов и небольшого объема работы.

Учитывая пример скриптаfoo:

#!/bin/bash

# Setting up completion for foo. Only if the script is sourced
if [ "$0" != "$BASH_SOURCE" ]; then
    _foo() {
        local cur
        COMPREPLY=()
        cur="${COMP_WORDS[COMP_CWORD]}"
        COMPREPLY=( $(compgen -W 'bar baz' -- "$cur") )
        return 0
    }
    complete -F "_foo" "foo"
    return
fi

# The body of foo -- what it does when executed
echo foo "$*"
#...

с помощью bash -автодополнение , самодостаточное -автодополнение можно включить, добавив символическую ссылку на fooв каталог, в котором хранятся динамически загружаемые пользовательские дополнения:

ln -s /path/to/foo ~/.local/share/bash-completion/completions/

Точный путь может отличаться. Вы можете обратиться к часто задаваемым вопросам завершения bash -, чтобы узнать, как проверить его значение в вашей системе.

Без завершения bash -одним из подходов может быть определение функции завершения по умолчанию, которая ищет (файлы, соответствующие )командам, если они удовлетворяют определенным условиям; здесь мы используем ассоциативный массив в качестве белого списка (, чтобы избежать слепого поиска каждой команды в системе ). Этот код необходимо добавить в ваш.bashrc(или эквивалентный файл, т. е. файл, который загружается в текущей среде каждый раз, когда запускается интерактивная оболочка ):

.
_default_completion () {
    # Do nothing when completion is invoked for an empty command
    if [ "$1" = "" ]; then
        return 1
    fi
    # Get the command path, exit with failure if it can't be found
    cmd=$(type -p "$1") || return 1
    if [ "${_compwhitelist["${cmd##*/}"]}" = y ]; then
        # Source the file corresponding to the command; on success,
        # return 124 to trigger a new autocompletion attempt
        source "$cmd" && return 124
    fi
}
complete -D -F _default_completion -o bashdefault -o default

# The list of commands with embedded completion
declare -A _compwhitelist
_compwhitelist[foo]=y

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

1Ссылка :на домашнюю страницу Bash на веб-сайте Чета Рэми и пункт «A1» в соответствующем FAQ по Bash .

1
28.04.2021, 23:25

Теги

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