Заметки · 27.02.2026

Самообновление без подвоха

Самое интересное в представленной функции — она стала не нужна ещё на стадии внедрения. Затирать не стал. Зачем пропадать добру? Может кому-то из читателей потребуется скрипт с функцией самообновления…

В последствии весь функционал обновления был переписан и преобразован в api http-сервера с целью получения целого ряда скриптов. Пока что — функция update_script:

update_script() 
{
    local url="$1"
    local temp_file="$2"

    echo "Проверка обновлений..."

    # Скачивание нового скрипта #
    curl -s -o "$temp_file" "$url"

    if [ $? -ne 0 ]; then
        echo "Ошибка: Не удалось загрузить скрипт."
        return 1
    fi

    # Получение хэш-суммы текущего и нового скрипта #
    local local_hash
    local remote_hash
    local current_script="$0"

    # Хэш текущего скрипта #
    local_hash=$(sha256sum "$current_script" | cut -d ' ' -f 1)

    # Хэш нового скрипта #
    remote_hash=$(sha256sum "$temp_file" | cut -d ' ' -f 1)

    # Сравнение хэшей #
    if [ "$local_hash" == "$remote_hash" ]; then
        echo "Скрипты идентичны. Обновление не требуется."
        rm "$temp_file"
        return 0
    else
        echo "Найдена новая версия скрипта. Обновление..."
        mv "$temp_file" "$current_script"
        chmod +x "$current_script"
        echo "Скрипт обновлен. Перезапустите его для применения изменений."
        exit 0
    fi
}

Достаточно скопипастить функцию в тело скрипта и вызвать там, где потребуется:

# URL для скачивания новой версии скрипта #
SCRIPT_URL="http://192.168.1.100/scripts/test.sh"

# Временный файл для скачанного скрипта #
TEMP_SCRIPT="/scripts/temp.sh"

# Вызов функции обновления #
update_script "$SCRIPT_URL" "$TEMP_SCRIPT"

Обращаю внимание, что функция принимает два параметра — url с адресом скрипта и путь с локальным расположением. Дальше уже в дело вступит магия сравнения контрольных сумм и всякое такое.