🔒 Скрытие пользовательского ввода в скриптах bash

Это может быть полезно, когда вы просите пользователей ввести пароли, API-токены или что-то еще, что вы не хотите выводить на экран.

Мы рассмотрим два решения.

Одно работает с любой оболочкой Bash или Bash-подобной оболочкой, а другое соответствует POSIX, если вам нужна максимальная совместимость.

Скрипт ниже включает в себя оба решения.

Это пример, который вы можете запустить, но в нем есть только 1-3 строки кода в середине, которые сосредоточены на скрытии пользовательского ввода.

Вы можете раскомментировать вариант 1 или 2 в зависимости от вашего случая использования.

#!/usr/bin/env bash



set -o errexit

set -o nounset



while true; do

  printf "Please input your API key and hit enter: "



  # ВАРИАНТ 1: ТРЕБУЕТСЯ ОБОЛОЧКА BASH ИЛИ BASH-ПОДОБНАЯ ОБОЛОЧКА (BASH, ZSH, ASH И Т. Д.)

  read -sr key



  # ВАРИАНТ 2: ДЛЯ МАКСИМАЛЬНОЙ СОВМЕСТИМОСТИ С ОБОЛОЧКАМИ (SH, DASH И Т. Д.)

  # stty -echo

  # read -r key

  # stty echo



  if [ -z "${key}" ]; then

    printf "nnPlease input your API key or hit CTRL+c to halt this scriptnn"

  else

    # TODO: Вставьте свою пользовательскую логику, которая использует этот ключ.

    printf "nnFor demo purposes, your API key is: %sn" "${key}"

    break

  fi

done


Основное отличие заключается в том, что флаг -s из read недоступен в sh и других минимальных оболочках.

Флаг -s не позволяет передавать ввод пользователя через echo.

Чтобы обойти это ограничение, мы можем использовать stty, чтобы отключить эхо, возвращающее наш чувствительный текст, записать этот ввод в переменную, а затем снова включить echo.

🐧 Как установить и перечислить переменные среды в Linux

Технически вы можете пропустить последний stty echo, и наш вывод будет показан, но мы заметили, что при использовании sh или bash ваш интерпретатор перестает выдавать эхо после выхода из этого скрипта.

Более современные оболочки, такие как zsh, похоже, автоматически исправляют это, но мы не знаем точных деталей.

 



2024-02-13T14:32:56
Скрипты