J'ai besoin d'imprimer certaines variables à l'écran mais je dois de préférence brouiller les premiers caractères et je me demandais s'il y avait une commande echo dans bash qui peut brouiller les premiers caractères d'une valeur secrète lors de l'impression sur le terminal:
Les autres réponses masquent un nombre fixe de caractères dès le début, le suffixe en clair variant en longueur. Une alternative serait de laisser un nombre fixe de caractères en texte clair et de faire varier la longueur de la partie masquée. Je ne sais pas lequel est le plus utile, mais voici l'autre choix:
#!/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
Cela imprime **cdeet *********jkl.
Si vous le souhaitez, vous pouvez également modifier nles chaînes courtes pour vous assurer que la majorité de la chaîne est masquée. Par exemple, cela garantirait qu'au moins trois caractères sont masqués, même pour les chaînes courtes. (donc abcde-> ***de, et abc-> ***):
Ensuite, vous pouvez appeler obfuprint 'secretvalue'et recevoir ********lue(avec une nouvelle ligne de fin). La fonction utilise l'expansion des paramètres pour rechercher les huit premiers caractères de la valeur transmise et les remplace par huit astérisques. Si la valeur entrante est inférieure à huit caractères, ils sont tous remplacés par des astérisques. Merci à ilkkachu d' avoir souligné mon hypothèse initiale de huit caractères ou plus!
Inspiré par la réponse de masquage flexible d' ilkkachu , j'ai pensé qu'il serait intéressant d'ajouter une variation qui masque aléatoirement un certain pourcentage de la chaîne:
Cela dépend de la $RANDOMvariable spéciale de bash ; il parcourt simplement chaque caractère de l'entrée et décide de masquer ce caractère ou de l'imprimer. Exemple de sortie:
Pour être franc, je n'aime pas le masquage aléatoire. Un surfeur d'épaule déterminé finira par obtenir mes secrets en faisant semblant d'aimer faire de petites conversations avec moi.
emory
Certes, l'affichage des informations sensibles doit être fait avec soin! J'ai présenté le masquage aléatoire comme une alternative au masquage à préfixe fixe et au masquage à préfixe variable.
Jeff Schaller
4
Je ne suis pas non plus un fan du masquage à préfixe fixe ou à préfixe variable, mais avec ceux-ci, il existe un "noyau" de mon secret qui reste secret. Avec le masquage aléatoire, il n'y a pas de "noyau". Finalement, tout sera suffisamment révélé à ces patients.
emory
7
Vous pouvez essayer de la tuyauterie sed. Par exemple, pour remplacer les 8 premiers caractères d'une chaîne par des astérisques, vous pouvez diriger vers la sed 's/^......../********/'commande, par exemple:
$ echo 'secretvalue'| sed 's/^......../********/'********lue
Vous pouvez également définir une fonction qui fait ceci:
obsecho (){ echo "$1"| sed 's/^......../*********/';}
Une autre option dans Bash, si cela ne vous dérange pas, evalvous pouvez le faire avec quelques 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}"
Mais fais attention:
fixer ci - dessus que vous avez besoin quand ${#password}est inférieur à${chars_to_show}
evalpeut être très dangereux avec une entrée non fiable: ici, il peut être considéré comme sûr car son entrée ne provient que de sources sûres, c'est-à-dire la longueur ${password}et la valeur de${chars_to_show}
Vous pouvez essayer de la tuyauterie
sed
. Par exemple, pour remplacer les 8 premiers caractères d'une chaîne par des astérisques, vous pouvez diriger vers lased 's/^......../********/'
commande, par exemple:Vous pouvez également définir une fonction qui fait ceci:
la source
printf
plusecho
pour que vous n'êtes pas soumis à l' interprétation des données telles que\r
ou\n
sed 's/^......../********/' <<< 'secretvalue'
bash -c 'lsof -d0 -a -p $$ 2>/dev/null' <<< foo
.Une
zsh
variante qui masque les trois quarts du texte:Exemple:
Pour masquer les 8 premiers caractères:
Pour masquer tous les caractères sauf les 3 derniers:
Pour masquer un nombre aléatoire de caractères:
la source
Une autre option dans Bash, si cela ne vous dérange pas,
eval
vous pouvez le faire avec quelquesprintf
:Mais fais attention:
${#password}
est inférieur à${chars_to_show}
eval
peut être très dangereux avec une entrée non fiable: ici, il peut être considéré comme sûr car son entrée ne provient que de sources sûres, c'est-à-dire la longueur${password}
et la valeur de${chars_to_show}
la source
Voici quelques scripts Bash jouets pour jouer avec qui montrent comment combiner une recherche de type regex avec une substitution de chaîne.
strip_str.sh
privatize_str.sh
restricted_str.sh
Points clés à retenir
[a-z 0-9]
est tout à fait valable, et à portée de main, comme au<search>
sein${_var_name//<search>/<replace>}
de Bash^
, dans ce contexte, est l'inverse ounot
pour les recherches de type regexobfuscate_str.sh
la source