Bash 스크립트에서 화면에 표시하지 않고 비밀번호 읽기


20

터미널에서 암호를 표시하지 않는 도구와 같은 방식으로 bash 스크립트에서 암호를 읽는 방법은 무엇입니까?

(복사 및 붙여 넣기가 쉬워서 글꼴을 검은 색으로 검은 색으로 변경하는 것은 까다로울 수 있으므로 해결책이 아닙니다)


3
이 글을 읽는 사람 : 에코가 켜져 있고 검은 색이 검은 색인 암호를 읽지 마십시오. 암호는 여전히 전송되며, 터미널이 사용한 터미널 지시문을 모르면 문자가 눈에 띄게 반향됩니다. 에코를 끕니다. 사용 termios, stty, read -s, 그것을 않습니다 아무것도.
Alexios

그래서 내가 쓴 이유는 솔루션이 아닙니다.).
Grzegorz Wierzowiecki

과연! 때때로 사람들은 질문을 훑어보고 잘못된 결론을 내립니다. :)
Alexios

답변:


30

보낸 사람 help read:

-s        do not echo input coming from a terminal

1
큰. 에 쓰지 man read않았습니다. 체크인하지 않았습니다 help read. 알아 둘만 한.
Grzegorz Wierzowiecki

3
@GrzegorzWierzowiecki : 잘못된 매뉴얼을보고 있습니다. 당신은 bash의 매뉴얼을 읽어야한다. man bash그리고 거기에서 찾을 수있다 -s 옵션Silent mode. If input is coming from a terminal, characters are not echoed.
pradeepchhetri

5

나는 항상 stty -echo반향을 끄고 읽은 후에 stty echo읽었습니다 ( stty즉, 사람을 보면서 더 읽으십시오 man stty). 이 방법은 에코 관점을 끄고 표준 stdin "리더"를 사용하여 Java, C (++), Python 등과 같은 프로그래밍 언어에서 암호를 읽을 수 있으므로 프로그래머 관점에서 더 유용합니다.

bash에서 사용법은 다음과 같습니다.

echo -n "USERNAME: "; read uname
echo -n "PASSWORD: "; stty -echo; read passwd; stty echo; echo
program $uname $passwd
passwd= # get rid of passwd

예를 들어 파이썬은 다음과 같습니다.

from sys import stdout
from os import system as term

uname = raw_input("USERNAME: ") # read input from stdin until [Enter] in 2
stdout.write("PASSWORD: ")
term("stty -echo") # turn echo off
try:
    passwd = raw_input()
except KeyboardInterrupt: # ctrl+c pressed
    raise SystemExit("Password attempt interrupted")
except EOFError: # ctrl+d pressed
    raise SystemExit("Password attempt interrupted")
finally:
    term("stty echo") # turn echo on again

print "username:", uname
print "password:", "*" * len(passwd)

파이썬 에서이 작업을 여러 번 수행해야했기 때문에 그 관점에서 잘 알고 있습니다. 그러나 이것은 다른 언어로 번역하기가 그리 어렵지 않습니다.


-1

귀하의 질문은 "도구와 같은 방식으로"다른 종류의 내용을 읽습니다. 그래서 이것이 당신에게 효과가 있는지 정확히 모르겠습니다.

system1 $ passwd=abc123
system1 $ printf "%s\n" "${passwd//?/*}"
******
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.