Preciso imprimir algumas variáveis na tela, mas preciso ofuscar preferencialmente os primeiros caracteres e queria saber se havia um comando echo no bash que pode ofuscar os primeiros caracteres de um valor secreto ao imprimi-lo no terminal:
echo 'secretvalue'
********lue
Uma opção seria forçar-se a usar uma função em vez de
echo
, como:Então você pode ligar
obfuprint 'secretvalue'
e receber********lue
(com uma nova linha à direita). A função usa a expansão de parâmetros para procurar os primeiros oito caracteres do valor passado e os substitui por oito asteriscos. Se o valor de entrada for menor que oito caracteres, todos eles serão substituídos por asteriscos. Obrigado a ilkkachu por apontar minha suposição inicial de oito ou mais entradas de caracteres!Inspirado pela resposta de mascaramento flexível do ilkkachu , achei que seria interessante adicionar uma variação que mascarasse aleatoriamente uma porcentagem da string:
Isso depende da
$RANDOM
variável especial do bash; ele simplesmente percorre cada caractere da entrada e decide se deve mascarar esse caractere ou imprimi-lo. Saída de amostra:As outras respostas mascaram uma quantidade fixa de caracteres desde o início, com o sufixo de texto simples variando em tamanho. Uma alternativa seria deixar uma quantidade fixa de caracteres em texto simples e variar o comprimento da parte mascarada. Não sei qual é mais útil, mas aqui está a outra opção:
Isso imprime
**cde
e*********jkl
.Se desejar, você também pode modificar
n
para strings curtas para garantir que a maioria da string seja mascarada. Por exemplo, isso garantiria que pelo menos três caracteres fossem mascarados, mesmo para strings curtas. (entãoabcde
->***de
eabc
->***
):Uma
zsh
variante que mascara três quartos do texto:Exemplo:
Para mascarar os primeiros 8 caracteres:
Para mascarar todos, exceto os últimos 3 caracteres:
Para mascarar um número aleatório de caracteres:
Você pode tentar canalizar para
sed
. Por exemplo, para substituir os primeiros 8 caracteres de uma string por asteriscos, você pode canalizar para osed 's/^......../********/'
comando, por exemplo:Você também pode definir uma função que faça isso:
Outra opção no Bash, se você não se importa com um simples
eval
, pode fazê-lo com algunsprintf
:Mas tenha cuidado:
${#password}
for menor que${chars_to_show}
eval
pode ser muito perigoso com entrada não confiável: aqui pode ser considerado seguro porque sua entrada vem apenas de fontes seguras, ou seja, o comprimento${password}
e o valor de${chars_to_show}
(.{3})
- o mascaramento começa após a 3ª letra(.{5})
- a quantidade de letras que serão substituídas por*****
.(.{255})
será o máximo permitido no MacOS BSDsed
.sed -E
pode ser alterado comsed -r
, massed -E
é mais portátil entre shells.Aqui estão alguns scripts Bash de brinquedo para brincar que mostram como combinar pesquisa semelhante a regex com substituição de string.
strip_str.sh
privatize_str.sh
restricted_str.sh
Principais conclusões
[a-z 0-9]
é totalmente válido e útil, como um<search>
dentro${_var_name//<search>/<replace>}
do Bash^
, neste contexto, é o inverso ounot
para pesquisas do tipo regexobfuscate_str.sh