我需要在屏幕上打印一些变量,但我需要最好混淆前几个字符,我想知道 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
(带有尾随换行符)。该函数使用参数扩展来搜索传入值的前八个字符,并将其替换为八个星号。如果传入值短于八个字符,则全部替换为星号。谢谢伊尔卡丘感谢指出我最初假设的八个或更多字符输入!
灵感来自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
}
这依赖于 bash 的$RANDOM
特殊变量;它只是循环遍历输入的每个字符并决定是屏蔽该字符还是打印它。示例输出:
$ 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
短字符串,以确保大部分字符串被屏蔽。例如,这将确保至少三个字符被屏蔽,即使对于短字符串也是如此。 (所以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
掩盖了四分之三文本的变体:
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}