Ранее мы уже говорили об инструменте op - более функциональной альтернативе sudo. Однако несмотря на все предоставляемые утилитой удобства работу с ней можно дополнительно упростить с помощь bash_completion.
Далее будет показано как именно можно упростить работы с помощью bash_completion. Допустим что файл конфигурации op имеет вид:
PRIV_USER=moose # Для наблюдения за логами tail /usr/bin/tail -f $1; users=PRIV_USER environment # Редактирование файлов с приелегиями суперпользователя edit /usr/bin/mcedit $1; users=PRIV_USER environment # Запуск tcpdump tcpdump /usr/sbin/tcpdump $*; users=PRIV_USER environment # Доступ к оболочке shell /bin/su -; users=PRIV_USER environment password # Перезапуск сервисов restart /usr/sbin/invoke-rc.d $1 restart; users=PRIV_USER environment # Установка пакета install /usr/bin/apt-get install $*; users=PRIV_USER environment # Удаление пакета и всех его зависимостей purge /bin/sh -c '/usr/bin/apt-get purge $* /usr/bin/apt-get autoremove --purge'; users=PRIV_USER environment # Обновление списка пакетов update /usr/bin/apt-get update; users=PRIV_USER environment # Обновление системы upgrade /usr/bin/apt-get dist-upgrade; users=PRIV_USER environment # Создание резервной копии системы backup /root/scripts/backup_server.sh; users=PRIV_USER environment
Для упрощения задачи будем считать что первым параметром у op идёт имя внутренней команды op, а вторым - имя файла (хотя в данном примере это и не всегда верно, но желающие могут усовершенствовать предлагаемое решение сами:)).
Список доступных команд можно получить командой:
op -l | grep ^[a-z] | awk '{print $1}'
Всё остальное можно почерпнуть в документации bash, потому сразу приведём готовое решение. Нужно добавить в в файл ~/.bashrc следующий код:
# Функция дополнения function _op_complete { local cur # Массив для вариантов дополнения COMPREPLY=() # Получаем список доступных команд COMMANDS_LIST=`op -l | grep ^[a-z] | awk '{print $1}'` # Получаем слово под курсором cur=${COMP_WORDS[COMP_CWORD]} # Если мы дополняем первое слово if [ 1 -eq ${COMP_CWORD} ]; then # Дополняем его возможными командами COMPREPLY=( $(compgen -W "${COMMANDS_LIST}" -- $cur ) ) # Если же все последующие сорва else # Дополняем именами файлов и директорий COMPREPLY=( $(compgen -fd -- $cur ) ) fi } # Назначем для дополнения op нашу функцию complete -F _op_complete op
Желающие могут усовершенствовать это решение добавив специфическое дополнение для каждой внутренней команды op. Однако в большинстве случаев в этом нет существенной необходимости.
На этом всё. Приятной работы!