Linux 스크립트의 터미널에서 사용자 입력 숨기기
다음과 같은 bash 스크립트가 있습니다.
#!/bin/bash
echo "Please enter your username";
read username;
echo "Please enter your password";
read password;
사용자가 단말기에 비밀번호를 입력할 때 비밀번호를 표시하지 않도록 하고 싶다(*************************************************어떻게 하면 좋을까요?
다음과 같이 읽기 호출에 -s를 입력합니다.
$ read -s PASSWORD
$ echo $PASSWORD
갱신하다
*
한 이렇게 하면 (안드레아스'의 '안드레아스'의 '안드레아스'의 '안드레아스'의 '안드레아스'의 '안드레아스'의 '안드레아스'의 '안드레아스'의 '안드레아스'를 사용).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
하면 .stty
를 무효로
bash의 특정 하지 않고 합니다.read
stty_orig=$(stty -g)
stty -echo
read password
stty $stty_orig
셸 스크립트로 이것을 사용하는 경우는 에코를 복원하는 종료 핸들러도 설정합니다.
#! /bin/sh
stty_orig=$(stty -g)
trap "stty ${stty_orig}" EXIT
stty -echo
...
이는 스크립트의 종료 방법에 관계없이 에코가 복원되도록 하기 위한 것입니다.그렇지 않으면 스크립트에러가 발생해도 에코가 꺼집니다.
수동으로 에코를 다시 켜려면 다음 명령을 입력합니다.
stty echo
타이핑한 내용이 보이지 않기 때문에 맹목적으로 타이핑을 해야 합니다.
먼저 Ctrl+c를 눌러 이전에 입력한 다른 내용을 지울 것을 권장합니다.
잡동사불란
echo
입력된 내용을 화면에 에코하는 것을 의미합니다.
이것은 우리가 텔레타이프라이터를 작업할 때부터의 것입니다(그것이 tty의 의미입니다).텔레타이프라이터는 타자기와 비슷하지만 다른 텔레타이프라이터나 컴퓨터에 연결되어 있다.일반적으로는 전화 케이블을 경유합니다.
텔레타이프라이터의 워크플로우는 대략 다음과 같습니다.명령어(또는 상대편 메시지)를 입력합니다.그러면 텔레타이프라이터가 다른 쪽에서 응답을 출력합니다.
당신이 텔레타이프라이터로 작업할 때 당신은 타이핑할 때 당신의 입력을 볼 수 있다.이는 텔레타이프라이터도 타자기이기 때문에 누르면 문자가 인쇄되기 때문입니다.
화면에 의해 대체된 텔레타이프라이터는 더 이상 입력을 타이핑하는 타이프라이터가 없었다.대신 입력된 내용을 입력하는 대로 출력하는 "필수" 함수를 신중하게 코드화해야 했습니다.
모르겠다stty -echo
또한 텔레타이프라이터에서 인쇄가 비활성화되었습니다.
동작하고 있는 텔레타이프 라이터에 대해서는, 여기를 참조해 주세요.https://www.youtube.com/watch?v=2XLZ4Z8LpEE (첫 번째 부분은 restore 입니다).약 12분 후에 시작하는 액션)
기타 텔레타이프라이터 복원: https://www.youtube.com/playlist?list=PL-_93BVApb5-9eQLTCk9xx16RAGEYHH1q
은 @의 뛰어난 @SiegeX의*
- - - - for for for for - 。bash
는 백스페이스 지원을 추가했습니다.이를 통해 사용자는 일반적으로 패스워드 프롬프트에서 지원되는 키(delete
Mac에서는 키)를 사용하여 엔트리를 수정할 수 있습니다.
#!/usr/bin/env bash
password=''
while IFS= read -r -s -n1 char; do
[[ -z $char ]] && { printf '\n' >/dev/tty; 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' >/dev/tty
else
# Add typed char to output variable.
password+=$char
# Print '*' in its stead.
printf '*' >/dev/tty
fi
done
주의:
- 가 문자
0x7f
: "현대 시스템에서는 백스페이스 키가 삭제 문자(ASCII 또는 Unicode의 경우 0x7f)에 매핑되는 경우가 많습니다." \b \b
왼쪽의 문자를 삭제하기 위해 필요합니다.\b
커서를 왼쪽으로 이동하지만 문자를 그대로 유지합니다(파괴적 백스페이스).공백을 인쇄하고 다시 뒤로 이동하면 문자가 지워진 것처럼 보입니다(감사합니다. "백스페이스" 이스케이프 문자 '\b: 예기치 않은 동작?).
POSIX 전용 셸(예:sh
에서는, 「Debian」과「Ubuntu의 양쪽 모두를 으로 하고 있습니다.sh
dash
어프로치(인쇄하지 않기 때문에 차선책)를 사용합니다.read
은 ""를 .-s
★★★★★★★★★★★★★★★★★」-n
★★★★★★★★★★★★★★★★★★.
@lesmana의 대답과는 조금 다르다(그러나 대부분 비슷하다).
stty -echo
read password
stty echo
심플: 숨김에코 당신의 물건에 에코를 보여 주세요.
항상 ANSI 이스케이프 문자를 사용합니다.
echo -e "Enter your password: \x1B[8m"
echo -e "\x1B[0m"
8m
않게 , 「」는 「」0m
정상' 이스케이프를 하게 합니다e는 ANSI 를 가능하게 합니다.
유일한 주의사항은 여기에 있는 텍스트를 복사하여 붙여넣을 수 있다는 것입니다. 따라서 보안을 정말로 원할 경우 이 텍스트를 사용하지 않는 것이 좋습니다.
비밀번호를 입력할 때 다른 사람이 보지 못하도록 합니다.그 후에는 컴퓨터를 켜놓지 마세요.:)
주의:
위는 ANSI 이스케이프 시퀀스를 지원하는 한 플랫폼에 의존하지 않습니다.
솔루션의 는, 「」, 「Unix」, 「Unix」를 알 수 .read
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
printf "password: "
let pass $(read -s)
printf "\nhey everyone, the password the user just entered is $pass\n"
쉘('Bourne'을하지 않음)과 연동되는 @입니다.+=
★★★★★★★★★★★★★★★★★★」
password=''
while IFS= read -r -s -n1 pass; do
if [ -z "$pass" ]; then
echo
break
else
printf '*'
password="$password$pass"
fi
done
사용자 이름 및 비밀번호 가져오기
읽기 쉽도록 표시하되 화면보다 더 좋은 위치에 놓으십시오.
#!/bin/bash
clear
echo
echo
echo
counter=0
unset username
prompt=" Enter Username:"
while IFS= read -p "$prompt" -r -s -n 1 char
do
if [[ $char == $'\0' ]]; then
break
elif [ $char == $'\x08' ] && [ $counter -gt 0 ]; then
prompt=$'\b \b'
username="${username%?}"
counter=$((counter-1))
elif [ $char == $'\x08' ] && [ $counter -lt 1 ]; then
prompt=''
continue
else
counter=$((counter+1))
prompt="$char"
username+="$char"
fi
done
echo
unset password
prompt=" Enter Password:"
while IFS= read -p "$prompt" -r -s -n 1 char
do
if [[ $char == $'\0' ]]; then
break
elif [ $char == $'\x08' ] && [ $counter -gt 0 ]; then
prompt=$'\b \b'
password="${password%?}"
counter=$((counter-1))
elif [ $char == $'\x08' ] && [ $counter -lt 1 ]; then
echo
prompt=" Enter Password:"
continue
else
counter=$((counter+1))
prompt='*'
password+="$char"
fi
done
@SiegeX와 @mklement0의 뛰어난 공헌에 대한 변화: 마스크 사용자 입력, 핸들 백스페이스, 그러나 사용자가 입력한 길이의 백스페이스(따라서 같은 줄의 다른 문자를 삭제하지 않습니다) 및 핸들 컨트롤 문자 등...이 용액은 파헤친 끝에 여기서 발견됐어요!
#!/bin/bash
#
# Read and echo a password, echoing responsive 'stars' for input characters
# Also handles: backspaces, deleted and ^U (kill-line) control-chars
#
unset PWORD
PWORD=
echo -n 'password: ' 1>&2
while true; do
IFS= read -r -N1 -s char
# Note a NULL will return a empty string
# Convert users key press to hexadecimal character code
code=$(printf '%02x' "'$char") # EOL (empty char) -> 00
case "$code" in
''|0a|0d) break ;; # Exit EOF, Linefeed or Return
08|7f) # backspace or delete
if [ -n "$PWORD" ]; then
PWORD="$( echo "$PWORD" | sed 's/.$//' )"
echo -n $'\b \b' 1>&2
fi
;;
15) # ^U or kill line
echo -n "$PWORD" | sed 's/./\cH \cH/g' >&2
PWORD=''
;;
[01]?) ;; # Ignore ALL other control characters
*) PWORD="$PWORD$char"
echo -n '*' 1>&2
;;
esac
done
echo
echo $PWORD
언급URL : https://stackoverflow.com/questions/4316730/hiding-user-input-on-terminal-in-linux-script
'source' 카테고리의 다른 글
Postgre에 인덱스가 있는 열 나열SQL (0) | 2023.04.11 |
---|---|
식별자가 "인 앱 ID를 사용할 수 없습니다.다른 문자열을 입력하십시오. (0) | 2023.04.11 |
범용 인텔리센스의 새로운 완전한 구현 (0) | 2023.04.11 |
목록에서 어떻게 추가할 수 있을까요? (0) | 2023.04.11 |
에서 JSON Web Service를 호출하는 가장 좋은 방법입니다.NET 콘솔 (0) | 2023.04.06 |