다음과 같은 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
backspace
delete
#!/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"