Saya perlu mencetak beberapa variabel ke layar tetapi saya harus mengaburkan beberapa karakter pertama dan saya bertanya-tanya apakah ada perintah gema dalam bash yang dapat mengaburkan karakter pertama dari nilai rahasia saat mencetaknya ke terminal:
Jawaban lainnya menutupi sejumlah karakter sejak awal, dengan akhiran plaintext bervariasi panjangnya. Alternatifnya adalah meninggalkan jumlah karakter tetap dalam plaintext, dan memvariasikan panjang bagian yang bertopeng. Saya tidak tahu yang mana yang lebih berguna, tapi ini pilihan lain:
#!/bin/bash
mask(){local n=3# number of chars to leavelocal a="${1:0:${#1}-n}"# take all but the last n charslocal b="${1:${#1}-n}"# take the final n chars
printf "%s%s\n""${a//?/*}""$b"# substitute a with asterisks}
mask abcde
mask abcdefghijkl
Ini mencetak **cdedan *********jkl.
Jika suka, Anda juga bisa memodifikasi nstring pendek untuk memastikan sebagian besar string tersamarkan. Misalnya ini akan memastikan setidaknya tiga karakter disembunyikan bahkan untuk string pendek. (jadi abcde-> ***de, dan abc-> ***):
Kemudian Anda dapat menelepon obfuprint 'secretvalue'dan menerima ********lue(dengan baris baru). Fungsi ini menggunakan ekspansi parameter untuk mencari delapan karakter pertama dari nilai yang diteruskan dan menggantinya dengan delapan tanda bintang. Jika nilai yang masuk lebih pendek dari delapan karakter, mereka semua diganti dengan tanda bintang. Terima kasih kepada ilkkachu karena menunjukkan asumsi awal saya tentang delapan atau lebih input karakter!
Terinspirasi oleh jawaban masking fleksibel ilkkachu , saya pikir akan menarik untuk menambahkan variasi yang secara acak menutupi beberapa persentase dari string:
Ini bergantung pada $RANDOMvariabel khusus bash ; itu hanya loop melalui setiap karakter input dan memutuskan apakah akan menutupi karakter itu atau mencetaknya. Output sampel:
Terus terang, saya tidak suka topeng acak. Peselancar yang tekun pada akhirnya akan mendapatkan rahasia saya dengan berpura-pura suka berbasa-basi dengan saya.
emory
Tentu saja, menampilkan informasi sensitif harus dilakukan dengan hati-hati! Saya menyajikan masking acak sebagai alternatif untuk masking fixed-prefix dan masking variabel-awalan.
Jeff Schaller
4
Saya juga bukan penggemar tetap-awalan atau variabel-awalan, tetapi dengan mereka ada "kernel" dari rahasia saya yang tetap rahasia. Dengan masking acak, tidak ada "kernel". Akhirnya semuanya akan diungkapkan kepada pasien itu cukup.
emory
7
Anda dapat mencoba perpipaan ke sed. Misalnya, untuk mengganti 8 karakter pertama dari string dengan tanda bintang, Anda dapat menyalurkan kesed 's/^......../********/' perintah, misalnya:
$ echo 'secretvalue'| sed 's/^......../********/'********lue
Anda juga dapat mendefinisikan fungsi yang melakukan ini:
obsecho (){ echo "$1"| sed 's/^......../*********/';}
Opsi lain di Bash, jika Anda tidak keberatan satu hal sederhana, evalAnda bisa melakukannya dengan beberapa printf:
# example data
password=secretvalue
chars_to_show=3# the real thingeval"printf '*%.0s' {1..$((${#password} - chars_to_show))}"
printf '%s\n'"${password: -chars_to_show}"
Tetapi berhati-hatilah:
perbaiki yang di atas seperti yang Anda butuhkan saat ${#password}kurang dari${chars_to_show}
evalbisa sangat berbahaya dengan input yang tidak dipercaya: di sini dapat dianggap aman karena inputnya hanya berasal dari sumber yang aman, yaitu panjang ${password}dan nilai dari${chars_to_show}
[a-z 0-9]benar-benar valid, dan praktis, sebagai bagian <search>dalam ${_var_name//<search>/<replace>}untuk Bash
^, dalam konteks ini, adalah kebalikan atau notuntuk pencarian seperti-regex
Built-in umumnya lebih cepat dan sering lebih ringkas, terutama ketika memotong pipa yang tidak dibutuhkan
Sementara saya mendapatkan bahwa printfadalah lebih baik dalam hampir semua kasus penggunaan di atas menggunakan kode echosehingga tidak terlalu bingung apa yang terjadi.
obfuscate_str.sh
#!/usr/bin/env bash
_str="${1}"
_start="${2:-6}"
_header="$(for i in {1..${_start}}; do echo -n '*'; done)"
echo "${_header}${_str:${_start}}"
obfuscate_str.sh 'apple-foo bar'3# -> ***le-foo bar
Anda dapat mencoba perpipaan ke
sed
. Misalnya, untuk mengganti 8 karakter pertama dari string dengan tanda bintang, Anda dapat menyalurkan kesed 's/^......../********/'
perintah, misalnya:Anda juga dapat mendefinisikan fungsi yang melakukan ini:
sumber
printf
lebihecho
sehingga Anda tidak dikenakan menafsirkan data seperti\r
atau\n
sed 's/^......../********/' <<< 'secretvalue'
bash -c 'lsof -d0 -a -p $$ 2>/dev/null' <<< foo
.Sebuah
zsh
varian yang masker tiga perempat dari teks:Contoh:
Untuk menutupi 8 karakter pertama:
Untuk menutupi semua kecuali 3 karakter terakhir:
Untuk menutupi sejumlah karakter acak:
sumber
Opsi lain di Bash, jika Anda tidak keberatan satu hal sederhana,
eval
Anda bisa melakukannya dengan beberapaprintf
:Tetapi berhati-hatilah:
${#password}
kurang dari${chars_to_show}
eval
bisa sangat berbahaya dengan input yang tidak dipercaya: di sini dapat dianggap aman karena inputnya hanya berasal dari sumber yang aman, yaitu panjang${password}
dan nilai dari${chars_to_show}
sumber
Berikut ini beberapa skrip Bash mainan untuk dimainkan yang menunjukkan cara menggabungkan pencarian mirip-regex dengan penggantian string.
strip_str.sh
privatize_str.sh
restricted_str.sh
Takeaways kunci
[a-z 0-9]
benar-benar valid, dan praktis, sebagai bagian<search>
dalam${_var_name//<search>/<replace>}
untuk Bash^
, dalam konteks ini, adalah kebalikan ataunot
untuk pencarian seperti-regexobfuscate_str.sh
sumber