Saya memiliki skrip yang mengotomatiskan proses yang membutuhkan akses ke sistem yang dilindungi kata sandi. Sistem diakses melalui program baris perintah yang menerima kata sandi pengguna sebagai argumen.
Saya ingin meminta pengguna untuk mengetikkan kata sandi mereka, menetapkannya ke variabel shell, dan kemudian menggunakan variabel itu untuk membangun baris perintah dari program pengaksesan (yang tentu saja akan menghasilkan keluaran aliran yang akan saya proses).
Saya seorang programmer shell yang cukup kompeten di Bourne / Bash, tapi saya tidak tahu bagaimana menerima input pengguna tanpa harus gema ke terminal (atau mungkin gema itu menggunakan karakter '*').
Adakah yang bisa membantu dengan ini?
read
dengan-r
argumen ketika membaca password. Kalau tidak, backslash bisa hilang. Tidak ada jawaban yang menyebutkan ini. Jawaban yang diterima untuk pertanyaan duplikat mencakup ini dan beberapa kasus tepi lainnya. Misalnya pengaturanIFS=
agar ruang trailing tidak longgar.Jawaban:
Berikut cara lain untuk melakukannya:
The
read -s
akan mematikan gema untuk Anda. Ganti sajaecho
pada baris terakhir dengan perintah yang ingin Anda jalankan.sumber
read
perintah:read -s -p "Password:" password
read -s
tidak ada dalam POSIX, skrip Anda tergantung pada bash jika Anda menggunakannya. Jika Anda ingin menjadi POSIX-compliant, Anda sebaiknya menggunakanstty -echo
solusi yang disarankan di bawah ini, karenastty
danecho
parameternya didefinisikan dalam POSIX.echo -n
juga tidak ada dalam POSIX. Gunakanprintf
sebagai gantinya./bin/bash
dan tidak dengan/bin/sh
, hanya untuk memperjelas ini.echo "$REPLY" | sed -r 's/./*/g'
(atau bahkan sejumlah tanda bintang) alih-alih kosongecho
untuk memberi tahu mereka bahwa kata sandi mereka telah terlihat (jika mereka mengetikkannya. Saya memiliki kata sandi standar jika mereka memilih untuk melewatkan prompt pada khususnya script)Jawaban yang sesuai dengan POSIX. Perhatikan penggunaan
/bin/sh
bukan/bin/bash
. (Ini berfungsi dengan bash, tetapi tidak memerlukan bash.)sumber
stty
jika Anda ingin menjadi POSIX compliant. Kode dalam jawaban ini berjalan dengan sempurna bahkan pada bash, tetapi sebenarnya pada semua shell yang sesuai dengan POSIX.echo -n "Password: " && read -s password || { stty -echo; read password; stty echo; }
Satu liner:
Di Linux (dan cygwin) formulir ini berfungsi di bash dan sh. Ini mungkin bukan standar Unix sh.
Untuk info dan opsi lebih lanjut, dalam bash, ketik "help read".
sumber
The
-s
pilihan untukread
tidak didefinisikan dalam standar POSIX. Lihat http://pubs.opengroup.org/onlinepubs/9699919799/utilities/read.html . Saya menginginkan sesuatu yang bisa digunakan untuk shell POSIX, jadi saya menulis sedikit fungsi yang digunakanstty
untuk menonaktifkan echo.Fungsi ini berperilaku sangat mirip dengan
read
perintah. Berikut ini adalah penggunaan sederhanaread
diikuti oleh penggunaan seruparead_secret
. Input untukread_secret
muncul kosong karena tidak digaungkan ke terminal.Berikut ini adalah
-r
opsi lain yang menggunakan opsi untuk mempertahankan garis miring terbalik pada input. Ini berfungsi karenaread_secret
fungsi yang didefinisikan di atas melewati semua argumen yang diterimanya keread
perintah.Akhirnya, berikut adalah contoh yang menunjukkan cara menggunakan
read_secret
fungsi untuk membaca kata sandi dengan cara yang sesuai dengan POSIX.sumber
oldtty = stty -g
dan kemudian di akhirstty $oldtty
untuk mengembalikan pengaturan sebelumnya. Kalau tidak, itu bagus.Saya menemukan bahwa
askpass
perintah itu bermanfaatSetiap karakter input diganti dengan *. Lihat: Berikan kata sandi ****
sumber
/lib/cryptsetup/askpass
? Ini tentunya bukan alat * * nix (atau GNU / Linux) standar.sudo apt-get install cryptsetup
.Ctrl+C
itu mengacaukan terminal/lib/cryptsetup/askpass "Give a password" > pass.txt
Sangat berguna, terima kasih!Matikan
echo
menggunakanstty
, lalu nyalakan kembali setelah.sumber
Anda juga dapat meminta kata sandi tanpa menetapkan variabel di shell saat ini dengan melakukan sesuatu seperti ini:
Contohnya:
Anda bisa menambahkan beberapa nilai yang diminta ini dengan jeda baris, dengan melakukan ini:
sumber
Bagi siapa pun yang membutuhkan kata sandi, Anda mungkin tertarik untuk menggunakannya encpass.sh . Ini adalah skrip yang saya tulis untuk tujuan yang sama menangkap rahasia saat runtime dan kemudian mengenkripsi untuk kesempatan berikutnya. Proses selanjutnya tidak meminta kata sandi karena hanya akan menggunakan nilai terenkripsi dari disk.
Ia menyimpan kata sandi terenkripsi dalam folder tersembunyi di bawah direktori home pengguna atau dalam folder khusus yang dapat Anda tentukan melalui variabel lingkungan ENCPASS_HOME_DIR. Ini dirancang untuk memenuhi POSIX dan memiliki Lisensi MIT, sehingga dapat digunakan bahkan di lingkungan perusahaan perusahaan. Perusahaanku, Plyint LLC , mengelola skrip dan sesekali merilis pembaruan. Permintaan penarikan juga diterima, jika Anda menemukan masalah. :)
Untuk menggunakannya dalam skrip Anda cukup sumber encpass.sh dalam skrip Anda dan panggil fungsi get_secret. Saya menyertakan salinan skrip di bawah ini untuk visibilitas yang mudah.
sumber
Tautan ini membantu dalam mendefinisikan, * Bagaimana cara membaca kata sandi dari penggunaan tanpa menggemakannya kembali ke terminal * Bagaimana cara mengganti setiap karakter dengan * -karakter.
https://www.tutorialkart.com/bash-shell-scripting/bash-read-username-and-password/
sumber
Pertama-tama, jika ada orang yang akan menyimpan kata sandi dalam file, saya akan memastikan itu di-hash. Ini bukan keamanan terbaik, tetapi setidaknya tidak akan ada dalam teks biasa.
Pertama, buat kata sandi dan hash:
Sekarang, buat program Anda untuk menggunakan hash. Dalam hal ini, program kecil ini menerima input pengguna untuk kata sandi tanpa menggema, dan kemudian mengubahnya menjadi hash untuk dibandingkan dengan hash yang disimpan. Jika cocok dengan hash yang disimpan, maka akses diberikan:
sumber
\n
dihasilkan olehecho
perintah menjauh dari hashing dengan menggunakanecho -n
, karena\n
bukan benar-benar bagian dari kata sandi yang diberikan - tentu saja baik untuk pembuatan/tmp/secret
dan perbandingan yang mengikuti contoh Anda.