Muszę wydrukować niektóre zmienne na ekranie, ale muszę preferencyjnie zaciemnić kilka pierwszych znaków i zastanawiałem się, czy w poleceniu nie było polecenia echa, które może zaciemnić pierwsze znaki tajnej wartości podczas drukowania na terminalu:
Inne odpowiedzi maskują stałą liczbę znaków od samego początku, przy czym przyrostek tekstu jawnego ma różną długość. Alternatywą byłoby pozostawienie stałej liczby znaków w postaci zwykłego tekstu i zmiana długości zamaskowanej części. Nie wiem, który z nich jest bardziej przydatny, ale oto inny wybór:
#!/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
To drukuje **cdei *********jkl.
Jeśli chcesz, możesz również zmodyfikować nkrótkie łańcuchy, aby mieć pewność, że większość łańcucha zostanie zamaskowana. Np. Zapewniłoby to maskowanie co najmniej trzech znaków nawet dla krótkich ciągów znaków. (więc abcde-> ***dei abc-> ***):
Następnie możesz dzwonić obfuprint 'secretvalue'i odbierać ********lue(z końcowym znakiem nowej linii). Funkcja korzysta z rozszerzania parametrów w celu wyszukiwania pierwszych ośmiu znaków przekazywanej wartości i zastępuje je osiem gwiazdkami. Jeśli przychodząca wartość jest krótsza niż osiem znaków, wszystkie są zastępowane gwiazdkami. Dzięki ilkkachu za zwrócenie uwagi na moje początkowe założenie ośmiu lub więcej znaków!
Zależy to od $RANDOMspecjalnej zmiennej bash ; po prostu zapętla każdy znak wejścia i decyduje, czy maskować ten znak, czy go wydrukować. Przykładowe dane wyjściowe:
Szczerze mówiąc, nie lubię przypadkowego maskowania. Zdecydowany surfer w końcu pozna moje sekrety, udając, że lubi ze mną rozmawiać.
emory
Z pewnością wyświetlanie poufnych informacji powinno odbywać się ostrożnie! Przedstawiłem maskowanie losowe jako alternatywę dla maskowania o stałym prefiksie i maskowania o zmiennym prefiksie.
Jeff Schaller
4
Nie jestem też fanem maskowania o stałym lub przedrostku, ale z tymi istnieje „jądro” mojego sekretu, które pozostaje tajne. Przy losowym maskowaniu nie ma „jądra”. W końcu wszystko zostanie wystarczająco ujawnione tym pacjentom.
emory
7
Możesz spróbować wykonać potok do sed. Na przykład, aby zastąpić pierwsze 8 znaków ciągu gwiazdkami, możesz potokować do sed 's/^......../********/'polecenia, np .:
$ echo 'secretvalue'| sed 's/^......../********/'********lue
Możesz także zdefiniować funkcję, która to robi:
obsecho (){ echo "$1"| sed 's/^......../*********/';}
Kolejna opcja w Bash, jeśli nie przeszkadza ci jedna prosta eval, możesz to zrobić za pomocą kilku 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}"
Ale bądź ostrożny:
napraw powyższe, jak potrzebujesz, gdy ${#password}jest mniej niż${chars_to_show}
evalmoże być bardzo niebezpieczny przy niezaufanym wejściu: tutaj można go uznać za bezpieczny, ponieważ jego wkład pochodzi tylko z bezpiecznych źródeł, tj. długości ${password}i wartości${chars_to_show}
[a-z 0-9]jest całkowicie ważny i przydatny, jako część <search>wewnętrzna ${_var_name//<search>/<replace>}dla Bash
^, w tym kontekście jest odwrotnością lub notdla wyszukiwań wyrażeń regularnych
Wbudowane są generalnie szybsze i często bardziej zwięzłe, szczególnie gdy odcina niepotrzebne przewody
Chociaż rozumiem, że printfjest to lepsze w prawie wszystkich przypadkach użycia, powyższy kod używa echo, aby nie nadmiernie mylić tego, co się dzieje.
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
Możesz spróbować wykonać potok do
sed
. Na przykład, aby zastąpić pierwsze 8 znaków ciągu gwiazdkami, możesz potokować dosed 's/^......../********/'
polecenia, np .:Możesz także zdefiniować funkcję, która to robi:
źródło
printf
sięecho
tak, że nie jesteś przedmiotem interpretacji danych, takich jak\r
lub\n
sed 's/^......../********/' <<< 'secretvalue'
bash -c 'lsof -d0 -a -p $$ 2>/dev/null' <<< foo
.zsh
Wariant, że maski trzy czwarte tekstu:Przykład:
Aby zamaskować pierwsze 8 znaków:
Aby zamaskować wszystkie oprócz ostatnich 3 znaków:
Aby zamaskować losową liczbę znaków:
źródło
Kolejna opcja w Bash, jeśli nie przeszkadza ci jedna prosta
eval
, możesz to zrobić za pomocą kilkuprintf
:Ale bądź ostrożny:
${#password}
jest mniej niż${chars_to_show}
eval
może być bardzo niebezpieczny przy niezaufanym wejściu: tutaj można go uznać za bezpieczny, ponieważ jego wkład pochodzi tylko z bezpiecznych źródeł, tj. długości${password}
i wartości${chars_to_show}
źródło
Oto niektóre zabawkowe skrypty Bash do zabawy z tym pokazem, jak połączyć wyszukiwanie podobne do wyrażenia regularnego z podstawieniem łańcucha.
strip_str.sh
privatize_str.sh
restricted_str.sh
Kluczowe dania na wynos
[a-z 0-9]
jest całkowicie ważny i przydatny, jako część<search>
wewnętrzna${_var_name//<search>/<replace>}
dla Bash^
, w tym kontekście jest odwrotnością lubnot
dla wyszukiwań wyrażeń regularnychobfuscate_str.sh
źródło