[linux] Linux 스크립트에서 터미널의 사용자 입력 숨기기

다음과 같은 bash 스크립트가 있습니다.

#!/bin/bash

echo "Please enter your username";
read username;

echo "Please enter your password";
read password;

사용자가 단말기에 암호를 입력 할 때 표시되지 않아야합니다 (또는 *******와 같은 내용이 표시되어야 함). 어떻게해야합니까?



답변

다음과 같이 읽기 호출에 -s를 제공하십시오.

$ read -s PASSWORD
$ echo $PASSWORD


답변

최신 정보

입력하는 *각 문자에 대해 를 출력하여 멋지게 만들고 싶다면 다음과 같이 할 수 있습니다 (andreas의 read -s솔루션 사용).

unset password;
while IFS= read -r -s -n1 pass; do
  if [[ -z $pass ]]; then
     echo
     break
  else
     echo -n '*'
     password+=$pass
  fi
done

화려하지 않고

echo "Please enter your username";
read username;

echo "Please enter your password";
stty -echo
read password;
stty echo


답변

bash없이 작동하는 솔루션 또는 에코를 비활성화 read하는 stty데 사용할 수있는 특정 기능

stty_orig=$(stty -g)
stty -echo
read password
stty $stty_orig


답변

여기 에 백 스페이스 지원이 추가 된 @SiegeX의 우수한 *인쇄 솔루션에 대한 변형이 있습니다 . 이렇게하면 일반적으로 암호 프롬프트에서 지원하는 것처럼 사용자가 키 ( Mac의 경우 키)사용하여 항목수정할 수 있습니다 .bash backspacedelete

#!/usr/bin/env bash

password=''
while IFS= read -r -s -n1 char; do
  [[ -z $char ]] && { printf '\n'; break; } # ENTER pressed; output \n and break.
  if [[ $char == $'\x7f' ]]; then # backspace was pressed
      # Remove last char from output variable.
      [[ -n $password ]] && password=${password%?}
      # Erase '*' to the left.
      printf '\b \b'
  else
    # Add typed char to output variable.
    password+=$char
    # Print '*' in its stead.
    printf '*'
  fi
done

노트 :

  • 0x7f백 스페이스 키를 누르면 문자 코드가 기록됩니다 . “최신 시스템에서 백 스페이스 키는 종종 삭제 문자 (ASCII 또는 유니 코드의 0x7f)에 매핑됩니다.” https://en.wikipedia.org/wiki/Backspace
  • \b \b왼쪽의 문자를 삭제하는 모양제공하는 데 필요합니다 . 를 사용 \b하면 커서가 왼쪽으로 이동하지만 문자는 그대로 둡니다 ( 비파괴 백 스페이스). 공백을 인쇄하고 다시 뒤로 이동하면 문자가 지워진 것처럼 보입니다 (감사합니다. C 의 “백 스페이스”이스케이프 문자 ‘\ b’, 예기치 않은 동작? ).

A의 POSIX 전용 (예를 들어, 쉘 sh데비안과 우분투에 sh있다 dash), 사용 stty -echo방법 (가 인쇄하지 않기 때문에, 차선책이다 아무것도 )이 있기 때문에, read내장은 지원하지 않습니다 -s-n옵션을.


답변

@lesmana의 답변과 약간 다릅니다 (그러나 대부분 비슷합니다)

stty -echo
read password
stty echo

간단하게 : 에코 숨기기


답변

다음은 기존 Bourne 셸 ( +=할당을 지원하지 않음)에서 작동하는 @SiegeX의 답변 변형입니다 .

password=''
while IFS= read -r -s -n1 pass; do
  if [ -z "$pass" ]; then
     echo
     break
  else
     printf '*'
     password="$password$pass"
  fi
done


답변

저는 항상 Ansi 이스케이프 문자를 사용하고 싶습니다.

echo -e "Enter your password: \x1B[8m"
echo -e "\x1B[0m"

8m텍스트를 보이지 않게하고 0m텍스트를 “보통”으로 재설정합니다. -e는 Ansi 이스케이프를 가능하게합니다.

유일한주의 사항은 거기에있는 텍스트를 복사하여 붙여 넣을 수 있다는 것입니다. 따라서 보안을 정말로 원한다면 이것을 사용해서는 안됩니다.

사용자가 암호를 입력 할 때 사람들이 암호를 보지 못하도록합니다. 나중에 컴퓨터를 켜두 지 마십시오. 🙂


노트:

위는 Ansi 이스케이프 시퀀스를 지원하는 한 플랫폼 독립적입니다.

그러나 다른 Unix 솔루션의 read경우 문자를 에코하지 않도록 간단히 말할 수 있습니다 .

printf "password: "
let pass $(read -s)
printf "\nhey everyone, the password the user just entered is $pass\n"