Комментарии 6
А выпускающую организацию нельзя заставить присылать уведомление о выпуске сертификата на корпоративную почту? Я бы хотел чтобы Контур по моей конторе просто присылал алерт что сертификат получен пользователем, но ещё не смотрел в эту строну
предложениям по оптимизации bash скрипта
1
Сразу скажу, что #!/bin/sh
и конструкции вида [[ ... ]]
или (( ... <= ... ))
(которые назыаются башизмами) - несовместимые вещи. Такой шебанг в начале скрипта предполагает, что это будет классифеский шелл, который не поддерживает удобные, расширенные возможности баша.
Поэтому: или #!/usr/bin/env bash
и используйте всю мощь баша или откажитесь от башизмов.
2
Выхлоп команды всегда оборачивайте в двойные кавычки. Хотя это уже давно не так, но не каждый шелл понимает, что строка вида "слово слово слово" это одна цельная строка а не одно слово как значение переменной, а все остальное это некоторая команда, которую шелл может и выполнить.
3
Надо оптимизировать скрипт: я насчитал 5 вызовов команды certmgr -list
. При этом в трех местах используется grep -E "Subject "
. Понятно, что в каждый момент вы собираете разную информацию, но это очень не рационально.
4
Ваш скрипт построен по принципу
команда1 > FILE
команда2 >> FILE
cat FILE
Вероятно нет смысла вначале все сохранять в файл, а потом этот файл выводить. надо сразу писать в STDOUT. Если промежуточный результат надо еще как-то дополнительноо обработать, то можно сделать примерно так:
что-то-писать() {
команда1
команда2
}
что-то-писать | как-то-обрабатывать
5
Простите, но cat FILE | tail -n $COUNTER | head -n 1
- это ужасно. Определенно, требуется оптимизация в части пунктов 3 и 4.
Я понимаю, что оно уже работает и чего его трогать. Но неоптимально написанный код в будущем порождает "неоптимальную оптимизацию".
6. Резюме
Я не знаю, как работает certmgr
и каков его выхлоп, но смею предположить, что однократный вызов certmgr -list | grep -e 'Subject ' -e 'Not valid after' > "$TMP/certmgr-$$.out"
уже будет существенной оптимизацией. А дальше работать с файлом "$TMP/certmgr-$$.out"
.
Выразительных средств awk/perl будет достаточно, чтобы оптимизировать скрипт, поддерживать его в дальнейшем и даже, при необходимости, с легкостью улучшать.
Забыл сказать. Хранить временные файлы в текущем каталоге - не есть хорошо. Если вы рут, то вы просто засоряете ФС. Если рядовой - у вас может не быть прав на текущий каталог и результат вашего скрипта - не предсказуем.
Почему это важно. Скрипт можно завершить разными способами: клавишами CTRL-C
, командой kill
. В результате - команды rm FILE
в конце скрипта могут быть и не выполнены. А в ФС вы оставите следы выполнения скрипта в произвольном месте.
Лучшее решение для этого (но этого не гарантирует от полной очистки ФС и, тем более, от авадакедавры типа kill -9
) - в начале скрипта описать что-то вида:
# Какой-то временный файл, который нужен только на время выполнения скрипта
# $$ - PID текущего процесса в имени файла, обеспечивает уникальность файла
TMPFILE="${TMP:-/tmp}/certmgr-list-$$.out"
# ловушка - код, который будет выполнен по выходу (`EXIT`) из скрипта
# может быть внешней или внутренней командой или шелл-функцией
trap 'rm -f "$TMPFILE"' EXIT
И вам уже не надо писать отдельные команды для удаления временных файлов.
Можно ведь обойтись без временных файлов - склеивать строки в памяти мы умеем https://stackoverflow.com/questions/2250131/how-do-you-append-to-an-already-existing-string
Автоматизированный сбор информации о сроке годности сертификатов в Криптопро