Đọc mật khẩu mà không hiển thị trên màn hình trong Bash ScScript


20

Làm cách nào để đọc mật khẩu trong tập lệnh bash theo cách như các công cụ không hiển thị trên thiết bị đầu cuối?

(Thay đổi phông chữ thành màu đen trên màu đen có thể khó khăn bằng cách dễ dàng sao chép và dán - vì vậy đó không phải là giải pháp)


3
Đối với bất kỳ ai đọc điều này: KHÔNG đọc mật khẩu có tiếng vang và đen trên nền đen. Mật khẩu vẫn được truyền và nếu thiết bị đầu cuối không biết các chỉ thị của thiết bị đầu cuối bạn đã sử dụng, các ký tự sẽ lặp lại rõ ràng. Tắt tiếng vang. Sử dụng termios, stty, read -s, bất cứ điều gì mà hiện nó.
Alexios

Đó là lý do tại sao tôi đã viết, rằng nó không phải là một giải pháp;).
Grzegorz Wierzowiecki

Thật! Đôi khi mọi người đọc lướt qua các câu hỏi và đưa ra kết luận sai lầm. :)
Alexios

Câu trả lời:


30

Từ help read:

-s        do not echo input coming from a terminal

1
Tuyệt quá. Nó không được viết trong tôi man read, tôi đã không đăng ký help read. Tốt để biết.
Grzegorz Wierzowiecki

3
@GrzegorzWierzowiecki: Bạn đang xem hướng dẫn sử dụng sai. bạn phải đọc hướng dẫn sử dụng bash tức là man bashở đó bạn có thể tìm thấy tùy chọn -sSilent mode. If input is coming from a terminal, characters are not echoed.
pradeepchhetri

5

Tôi luôn luôn stty -echotắt tiếng vang, sau đó đọc và sau đó làm stty echo(đọc thêm bằng cách xem người đàn ông của stty- tức là man stty). Điều này hữu ích hơn từ góc độ lập trình viên khi bạn có thể tắt tiếng vang và sau đó đọc mật khẩu từ ngôn ngữ lập trình như Java, C (++), Python, v.v. với "trình đọc" chuẩn stdin của họ.

Trong bash, việc sử dụng có thể trông như thế này:

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

Python, ví dụ, sẽ trông như:

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)

Tôi đã phải làm điều này rất nhiều lần trong Python, vì vậy tôi biết nó khá rõ từ quan điểm đó. Điều này không khó để dịch sang các ngôn ngữ khác.


-1

Câu hỏi của bạn đọc loại khác nhau "theo cách như công cụ ???" Vì vậy, tôi không biết chính xác nếu điều này sẽ làm việc cho bạn:

system1 $ passwd=abc123
system1 $ printf "%s\n" "${passwd//?/*}"
******
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.