sed: замена текста между двумя строками без редактирования всей строки - PullRequest
0 голосов
/ 16 января 2020

Я пытаюсь создать скрипт конфигуратора Raspberry Pi (перед первой загрузкой pi) и хочу реализовать функцию для установки пароля. Я обнаружил, что пароль может быть установлен в / etc / shadow, но его нужно зашифровать.

Короче говоря:

Как заменить только ха sh между двумя строками pi: и второй : с помощью sed ?

pi:$6$FVPr/I.sQGI3ab3z$rmQMzZDghl/.sJyohBZ2B4Z4Bxkr.zOZJ5c4pVJlHTZEGbO28CoXhgPUZ/gds5km3puT9O2b.K0bIjbNeNTSW/:18277:0:99999:7:::

Вывод, который я хочу получить с помощью моего скрипта:

Например,

pi:$6$salty-boi$nt6OkKwSfV4kkk2mcEjEZW1z9rChDK9VeE.c7LE5oFv4Zd.KQbqlN2mSnc9EbcAB.iIlvhRCT10Y6ovLWvaLu.:18277:0:99999:7:::

Я пробовал это:

sed -i "s|pi:.*:|pi:$RPI_PASSWD_ENCRYPTED:|g" shadow

Но вывод Я получаю это:

pi:$6$saltypi$NpLE895oMWEr3R6p9f1dZnekSeJq8QdAk8tQu08rTF3gsnKVoKX7Z.JsNyBCg.o/QamYgzr.w7dVoRyi5nFBM.:

Без этого потом: 18277:0:99999:7:::

Вот пример моего сценария:

#!/bin/bash
exitstatus=$?
RPI_PASSWD=$(whiptail --inputbox "Type a password for user pi. Press cancel to skip." 8 40 --title "Changing default password" --ok-button "Ok" --cancel-button "Cancel" 3>&1 1>&2 2>&3)
if [ $exitstatus = 0 ]; then
   RPI_PASSWD_ENCRYPTED=$(openssl passwd -6 -salt saltypi $RPI_PASSWD)
   sed -i "s|pi:.*:|pi:$RPI_PASSWD_ENCRYPTED:|g" shadow
fi
exit 1

Вот полный код .

1 Ответ

0 голосов
/ 16 января 2020

Оператор Sed * является жадным и сгорает до последнего : в конце строки.

Вы можете использовать выражение в скобках без двоеточия, за которым следует *, которое будет совпадать только до следующего :,

"s|pi:[^:]*:|pi:$RPI_PASSWD_ENCRYPTED:|g"
...