Удалить имена пользователей в файле и заменить на инкрементное число

Вероятно, это вызвано тем фактом, что ваш домашний каталог (и, следовательно, ключ) недоступен во время входа в систему. Это может быть вызвано тем, что ваш дом монтируется с сетевого диска (в общей системе) после входа в систему или ваш домашний каталог зашифрован (обычно это установка рабочих станций).

Решить это сложно, но я постараюсь обсудить это. Решение состоит в том, чтобы переместить AuthorizedKeysFile в другое место, которое будет доступно или использовать глобальное хранилище ключей ( / etc / security / authorized_keys ) или какую-либо систему управления SSO ( IPA, LDAP), который получит ваш ключ от сервера каталогов (да, может быть локальным). Зависит от того, насколько вы контролируете целевую систему.

Вероятно, лучшее решение - хранить ключи в другом месте, изменив значение в sshd_config :

AuthorizedKeysFile /etc/ssh/%u/authorized_keys

Дальнейшее обсуждение доступно на SuperUser или здесь, в Unix & Linux или описание на help.Ubuntu .

6
01.05.2018, 09:45
3 ответа

Поскольку вы поняли, что вам «не нужны 2 файла» , используйте следующееawkрешение для обработки начального файла журнала за один проход:

awk '{
         u_name = substr($5, 1, index($5, "@"));
         if (!(u_name in users)) users[u_name] = ++c;
         sub(/^[^@]+/, "USER" users[u_name], $5)
     }1' file.log

Выход:

12:00:00 (AAA) OUT: "string" USER1@hostname
12:00:00 (AAA) OUT: "string" USER1@hostname
12:00:00 (AAA) OUT: "string" USER2@hostname
12:00:00 (AAA) OUT: "string" USER1@hostname
12:00:00 (AAA) OUT: "string" USER3@hostname
9
27.01.2020, 20:20

С помощью bash можно сделать:

n=0
declare -A users=()
while IFS= read -r line; do
    if [[ $line =~ ([^[:blank:]]+)@ ]]; then
        user=${BASH_REMATCH[1]}
        if [[ -z ${users[$user]} ]]; then
            users[$user]=USER$((++n))
        fi
        line=${line/$user/${users[$user]}}
    fi 
    echo "$line"
done < File2

или перламутровый -вкладыш

perl -pe 's/(\S+)(?=@)/ $users{$1} ||= "USER".++$n /e' File2
5
27.01.2020, 20:20

Другой awk

awk '!($5 in a){a[$5]=++i}{sub("[^@]*","USER"a[$5],$5)}1' infile
6
27.01.2020, 20:20

Теги

Похожие вопросы