Вы можете попробовать printf "% s \ n" 'username: encryptedpassword' | sudo chpasswd -e
- который может обойти проверку пароля, выполняемую PAM.
Пароль должен быть предварительно зашифрован, например как в примере mkpasswd
от muru. Например:
p=$(mkpasswd -m sha-512 'mysupersekretpassword')
printf "%s:%s\n" 'username' "$p" | sudo chpasswd -e
Я использую здесь printf
вместо echo
, потому что echo
будет интерпретировать и изменять вывод для некоторых последовательностей символов, которые могут встречаются в зашифрованном пароле, например \ t
, \ n
, \ nnn
(трехзначное восьмеричное) и другие.
Не забудьте удалить команду mkpasswd
из вашего .bash_history
. Или используйте export HISTCONTROL = ignorespace
и префикс команды p = $ (...)
пробелом, чтобы она никогда не сохранялась в истории. Если вы не используете bash, используйте тот метод, который подходит для вашей оболочки.
Для этой цели можно использовать awk
awk '{ for(i = 2; i <= NF; i++) { print $i,$1; } }' file
Цикл for переходит от второго поля к последнему, и каждое поле печатается с присоединенным первым полем
sed
идеально подходит для этой задачи. Просто немного подправив ваш код sed, мы имеем:
sed -E '
s/^([a-z][^ ]*) ([0-9]+)/\2 \1\n\1/
/\n/P;D
' filename.txt
Выход:
17 key1
89 key1
52 key1
5 key2
189 key2
6 key2
3 key2
5 key2
21 key2
Пояснение:
global /g flag
. \n
после операции переворота, так что мы можно использовать команду P
, которая печатает только до первой новой строки в пространстве шаблонов. P
с помощью /\n/
, чтобы избежать бесконечного цикла. D
удаляет до первой новой строки в пространстве шаблонов и с тем, что осталось от пространства шаблонов, возвращает управление в начало сценария. IOW, то, что вы сделали, предоставило неявный механизм цикла. s/// --- P --- D --- s/// --- P --- D...........
. sed
начинается новый цикл чтения и дальше вы уже знаете что происходит....ХТХ.