В ssh
нет специального механизма для уведомления о том, что вы используете какой-то ключ. Это работает или не работает.
Единственная идея, которая приходит мне в голову - различать ключи с помощью парольной фразы.
Например, иметь ключи RSA в ssh-agent или без парольной фразы, а DSA - с парольной фразой (и не в ssh-agent). Это может предупредить вас с запросом парольной фразы.
Самое простое - не добавить приведенную выше строку в ssh_config
, и тогда вы увидите, когда не можете подключиться. Затем вы можете использовать опции в командной строке для отдельных соединений:
ssh -oPubkeyAcceptedKeyTypes=+ssh-dss host
Другие ответы маскируют фиксированное количество символов с самого начала, а суффикс открытого текста различается по длине. Альтернативой было бы оставить фиксированное количество символов в открытом тексте и изменить длину замаскированной части. Я не знаю, какой из них более полезен, но вот другой выбор:
#!/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"
}
Один из вариантов — заставить себя использовать функцию вместо echo
, например:
obfuprint() {
if [ "${#1}" -ge 8 ]
then
printf '%s\n' "${1/????????/********}"
else
printf '%s\n' "${1//?/*}"
fi
}
Затем вы можете вызвать obfuprint 'secretvalue'
и получить********lue
(с завершающим символом новой строки ). Функция использует расширение параметра для поиска первых восьми символов переданного значения -и заменяет их восемью звездочками. Если входящее значение короче восьми символов, все они заменяются звездочками. Спасибо ilkkachu за указание на мое первоначальное предположение о вводе восьми -или -дополнительных символов!
Вдохновленный ответом 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*
Вы можете попробовать подключиться к sed
. Например, чтобы заменить первые 8 символов строки звездочками, вы можете передать команду sed 's/^......../********/'
, например.:
$ echo 'secretvalue' | sed 's/^......../********/'
********lue
Вы также можете определить функцию, которая делает это:
obsecho () { echo "$1" | sed 's/^......../*********/'; }
Вариант 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}
Другой вариант в 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}