Оптимизация работы с op с помощью bash_completion

()

Ранее мы уже говорили об инструменте 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. Однако в большинстве случаев в этом нет существенной необходимости.

На этом всё. Приятной работы!

Ключевые слова: op, bash_completion.

Подписаться на обновления: RSS-лента Канал в TamTam Telegram канал Канал в ICQ

Комментарии:

Новый комментарий

Жирный текстКурсивный текстПодчёркнутый текстЗачёркнутый текстПрограммный кодСсылкаИзображение




© 2006-2024 Вадим Калинников aka MooSE
Политика конфиденциальности