일부 변수를 화면에 인쇄해야 하지만 처음 몇 문자를 난독화하는 것이 가장 좋습니다. 터미널에 인쇄할 때 비밀 값의 첫 번째 문자를 난독화할 수 있는 bash의 echo 명령이 있는지 궁금합니다.
echo 'secretvalue'
********lue
답변1
한 가지 옵션은 강제로 함수를 대신 사용하는 것입니다 echo
. 예를 들면 다음과 같습니다.
obfuprint() {
if [ "${#1}" -ge 8 ]
then
printf '%s\n' "${1/????????/********}"
else
printf '%s\n' "${1//?/*}"
fi
}
obfuprint 'secretvalue'
그런 다음 전화를 걸고 받을 수 있습니다 ********lue
(후행 개행 포함). 이 함수는 인수 확장을 사용하여 전달된 값의 처음 8자를 검색하고 이를 8개의 별표로 바꿉니다. 수신 값이 8자보다 짧으면 모두 별표로 대체됩니다. 감사해요이르카초8자 이상의 문자 입력에 대한 초기 가정을 지적해 주셔서 감사합니다!
에서 영감을 받다유연한 차단에 대한 ilkkachu의 답변, 문자열의 특정 비율을 무작위로 마스크하는 변형을 추가하는 것이 재미있을 것이라고 생각했습니다.
obfuprintperc () {
local perc=75 ## percent to obfuscate
local i=0
for((i=0; i < ${#1}; i++))
do
if [ $(( $RANDOM % 100 )) -lt "$perc" ]
then
printf '%s' '*'
else
printf '%s' "${1:i:1}"
fi
done
echo
}
이는 $RANDOM
특수 bash 변수에 의존합니다. 입력의 각 문자를 반복하고 문자를 마스킹할지 아니면 인쇄할지 결정합니다. 예제 출력:
$ obfuprintperc 0123456789
0*****6*8*
$ obfuprintperc 0123456789
012***678*
$ obfuprintperc 0123456789
**********
$ obfuprintperc 0123456789
*****56***
$ obfuprintperc 0123456789
0*******8*
답변2
다른 답변은 길이가 다양한 일반 텍스트 접미사를 사용하여 처음부터 고정된 수의 문자를 마스킹합니다. 또 다른 접근 방식은 일반 텍스트에 고정된 수의 문자를 유지하고 마스크된 부분의 길이를 변경하는 것입니다. 어느 것이 더 유용한지는 모르겠지만 여기에 또 다른 옵션이 있습니다.
#!/bin/bash
mask() {
local n=3 # number of chars to leave
local a="${1:0:${#1}-n}" # take all but the last n chars
local b="${1:${#1}-n}" # take the final n chars
printf "%s%s\n" "${a//?/*}" "$b" # substitute a with asterisks
}
mask abcde
mask abcdefghijkl
그러면 **cde
과 가 인쇄됩니다 *********jkl
.
원하는 경우 n
짧은 문자열을 수정하여 대부분의 문자열이 마스크되도록 할 수도 있습니다. 예를 들어 이렇게 하면 짧은 문자열인 경우에도 최소 3개의 문자가 마스크됩니다. (따라서 abcde
-> ***de
및 abc
-> ***
):
mask() {
local n=3
[[ ${#1} -le 5 ]] && n=$(( ${#1} - 3 ))
local a="${1:0:${#1}-n}"
local b="${1:${#1}-n}"
printf "%s%s\n" "${a//?/*}" "$b"
}
답변3
zsh
텍스트의 4분의 3을 가리는 변형:
mask() printf '%s\n' ${(l[$#1][*])1:$#1*3/4}
예:
$ mask secretvalue
********lue
$ mask 12345678
******78
$ mask 1234
***4
처음 8자를 마스크하려면 다음을 수행하십시오.
mask() printf '%s\n' ${(l[$#1][*])1:8}
마지막 3자를 제외한 모든 문자를 마스킹하려면 다음을 수행합니다.
mask() printf '%s\n' ${(l[$#1][*])1: -3}
임의의 수의 문자를 마스크합니다.
mask() printf '%s\n' ${(l[$#1][*])1: RANDOM%$#1}
답변4
Bash의 또 다른 옵션은 간단한 옵션이 마음에 들지 않으면 eval
몇 가지로 수행할 수 있습니다 printf
.
# example data
password=secretvalue
chars_to_show=3
# the real thing
eval "printf '*%.0s' {1..$((${#password} - chars_to_show))}"
printf '%s\n' "${password: -chars_to_show}"
하지만 조심하세요:
${#password}
다음보다 작을 때 필요에 따라 위의 내용을 수정하세요.${chars_to_show}
eval
신뢰할 수 없는 입력의 경우 매우 위험할 수 있습니다. 입력은 안전한 소스, 즉 길이${password}
와 값 에서만 제공되므로 안전한 것으로 간주될 수 있습니다.${chars_to_show}