Membaca kata sandi tanpa tampil di layar dalam Bash Script

20

Bagaimana membaca kata sandi dalam skrip bash dengan cara seperti alat yang tidak ditampilkan di terminal?

(Mengganti font menjadi hitam menjadi hitam mungkin gampang-gampang susah untuk disalin & tempel - jadi itu bukan solusi)

Grzegorz Wierzowiecki
sumber
3
Bagi siapa pun yang membaca ini: JANGAN membaca kata sandi dengan gema aktif dan hitam-hitam. Kata sandi masih ditransmisikan, dan jika terminal tidak mengetahui arahan terminal yang Anda gunakan, karakter akan bergema dengan jelas. Matikan gema. Gunakan termios, stty, read -s, apa pun yang melakukannya.
Alexios
Itu sebabnya saya menulis, bahwa itu bukan solusi;).
Grzegorz Wierzowiecki
Memang! Terkadang orang membaca sekilas pertanyaan dan sampai pada kesimpulan yang salah. :)
Alexios

Jawaban:

30

Dari help read:

-s        do not echo input coming from a terminal
Ignacio Vazquez-Abrams
sumber
1
Bagus. Itu tidak tertulis di saya man read, saya belum check-in help read. Senang mendengarnya.
Grzegorz Wierzowiecki
3
@GrzegorzWierzowiecki: Anda melihat manual yang salah. Anda harus membaca manual bash yaitu man bashdan di sana Anda dapat menemukan opsi -sSilent mode. If input is coming from a terminal, characters are not echoed.
pradeepchhetri
5

Saya selalu stty -echomematikan gema, kemudian membaca dan setelah itu melakukan stty echo(baca lebih lanjut dengan melihat man stty- yaitu man stty). Ini lebih berguna dari perspektif pemrogram karena Anda dapat mematikan gema dan kemudian membaca kata sandi dari bahasa pemrograman seperti Java, C (++), Python, dll. Dengan stdin standar "pembaca".

Dalam bash, penggunaannya bisa seperti ini:

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

Python, misalnya, akan terlihat seperti:

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)

Saya harus melakukan ini berkali-kali dengan Python, jadi saya tahu itu cukup baik dari perspektif itu. Ini tidak terlalu sulit untuk diterjemahkan ke bahasa lain.

Dylan
sumber
-1

Pertanyaan Anda berbunyi agak berbeda "dengan cara seperti alat ???" jadi saya tidak tahu persis apakah ini akan bekerja untuk Anda:

system1 $ passwd=abc123
system1 $ printf "%s\n" "${passwd//?/*}"
******
2bc
sumber