Мне нужно вывести некоторые переменные на экран, но мне нужно предпочтительно запутать первые несколько символов, и мне было интересно, есть ли в bash команда echo, которая может скрыть первые символы секретного значения при печати его в терминал:
Другие ответы маскируют фиксированное количество символов с самого начала с суффиксом открытого текста различной длины. Альтернативой было бы оставить фиксированное количество символов в виде открытого текста и изменить длину маскированной части. Я не знаю, какой из них более полезен, но вот другой выбор:
#!/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
Это печатает **cdeи *********jkl.
Если хотите, вы также можете изменить nкороткие строки, чтобы убедиться, что большинство строк маскируется. Например, это обеспечит маскировку как минимум трех символов даже для коротких строк. (так abcde-> ***deи abc-> ***):
Тогда вы можете позвонить obfuprint 'secretvalue'и получить ********lue(с завершающим переводом строки). Функция использует раскрытие параметров для поиска первых восьми символов переданного значения и заменяет их восемью звездочками. Если входящее значение короче восьми символов, все они заменяются звездочками. Спасибо ilkkachu за указание на мое первоначальное предположение о вводе восьми или более символов!
Вдохновленный гибким маскирующим ответом ilkkachu , я подумал, что было бы интересно добавить вариант, который случайным образом маскирует некоторый процент строки:
Это зависит от BASH в $RANDOMспециальной переменной; он просто перебирает каждый символ ввода и решает, замаскировать ли этот символ или распечатать его. Пример вывода:
Честно говоря, я не люблю случайные маскировки. Решительный серфер в плечах, в конце концов, узнает мои секреты, притворяясь, что любит болтать со мной.
Эмори
Конечно, отображение конфиденциальной информации должно быть сделано осторожно! Я представил случайное маскирование как альтернативу маскированию с фиксированным префиксом и маскированию с переменным префиксом.
Джефф Шаллер
4
Я также не фанат маскировки с фиксированным префиксом или переменной-префиксом, но с этим существует «ядро» моего секрета, которое остается секретным. При случайной маскировке «ядра» нет. В конце концов все будет раскрыто для этих пациентов достаточно.
Эмори
7
Вы могли бы попробовать трубопровод sed. Например, чтобы заменить первые 8 символов строки звездочками, вы можете передать sed 's/^......../********/'команду, например:
$ echo 'secretvalue'| sed 's/^......../********/'********lue
Вы также можете определить функцию, которая делает это:
obsecho (){ echo "$1"| sed 's/^......../*********/';}
Еще один вариант в Bash, если вы не возражаете против одного простого, evalвы можете сделать это с помощью пары 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}"
Но будь осторожен:
исправить выше, как вам нужно, когда ${#password}меньше, чем${chars_to_show}
evalможет быть очень опасным с ненадежным вводом: здесь это может считаться безопасным, потому что его ввод поступает только из безопасных источников, то есть длины ${password}и значения${chars_to_show}
Вот несколько игрушечных скриптов Bash, с которыми можно поиграть, чтобы показать, как объединить поиск в стиле регулярных выражений с подстановкой строк.
Вы могли бы попробовать трубопровод
sed
. Например, чтобы заменить первые 8 символов строки звездочками, вы можете передатьsed 's/^......../********/'
команду, например:Вы также можете определить функцию, которая делает это:
источник
printf
болееecho
так , что вы не подлежат интерпретации данных , таких как\r
или\n
sed 's/^......../********/' <<< 'secretvalue'
bash -c 'lsof -d0 -a -p $$ 2>/dev/null' <<< foo
.zsh
Вариант , который маскирует три четверти текста:Пример:
Чтобы замаскировать первые 8 символов:
Чтобы замаскировать все, кроме последних 3 символов:
Чтобы замаскировать случайное количество символов:
источник
Еще один вариант в Bash, если вы не возражаете против одного простого,
eval
вы можете сделать это с помощью парыprintf
:Но будь осторожен:
${#password}
меньше, чем${chars_to_show}
eval
может быть очень опасным с ненадежным вводом: здесь это может считаться безопасным, потому что его ввод поступает только из безопасных источников, то есть длины${password}
и значения${chars_to_show}
источник
Вот несколько игрушечных скриптов Bash, с которыми можно поиграть, чтобы показать, как объединить поиск в стиле регулярных выражений с подстановкой строк.
strip_str.sh
privatize_str.sh
restricted_str.sh
Ключевые вынос
[a-z 0-9]
полностью действителен и удобен, как<search>
внутри${_var_name//<search>/<replace>}
Bash^
в этом контексте является обратным илиnot
для регулярных поисковobfuscate_str.sh
источник