У меня есть текстовый файл, в котором я сохраняю все свои важные личные данные, такие как пароли всех моих учетных записей и ПИН-коды моих кредитных карт, на случай, если я их забуду. Очевидно, что этот файл должен быть зашифрован, поэтому я прибег к gpg (GNU Privacy Guard).

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

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

Сценарий на самом деле выглядит следующим образом:

рм $ 1.gpg
gpg -c $ 1
рм $ 1

Как я могу избежать этого, введя цикл управления, который подсчитывает сообщение об ошибке gpg, распознавая, когда что-то пошло не так, и новый архив не был создан?

Я знаю, что могу просто удалить первую строку, но я бы не хотел каждый раз отвечать «да» на перезаписывающее сообщение, поскольку я знаю, что архив уже существует. Кроме того, я хотел бы сохранить обновленный текстовый файл вместо старого архива, если произойдет какая-либо ошибка, поскольку я не хочу изменять файл в другой раз, повторяя редактирование (я, возможно, забыл его в любом случае).

1 ответ1

1

Если gpg возвращает ненулевой код выхода при возникновении ошибки, вы можете проверить это. Чтобы попытаться, выполните команду gpg , получите условие ошибки, а затем (при условии bash) введите echo $? , Если выходные данные не 0 , следующее будет выполнять rm только в том случае, если предыдущая команда (в данном случае gpg) была успешной:

if [[ $? -eq 0 ]] ; then
    rm "$1"
fi

В качестве альтернативы, вы можете убедиться, что файл .gpg существует до того, как вы rm текстовый файл.

if [[ -f "$1.gpg" ]] ; then
    rm "$1"
else
    echo "$1.gpg not found, keeping the text file"
fi

Конечно, вы можете объединить оба подхода, убедившись, что gpg успешно выполнен, а другой файл существует.

Обратите внимание, что вы должны заключать в кавычки любое использование переменных (см. Мой код в качестве примера), иначе ваш скрипт будет вести себя странно с именами файлов, содержащими, например, пробелы.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .