Security

與apg結合使用時如何阻止sed中斷?

  • December 31, 2018

我正在編寫一個腳本,它將自動為我安裝 WordPress,讓我的生活更輕鬆,因為我必須不斷地部署 WordPress 安裝。

然而,我正在努力做到這一點,所以我永遠不必與它互動,這讓我睡不著覺。

要為數據庫等生成密碼,我使用 apg,然後使用 sed 將字元串替換為正確的密碼。它看起來像這樣:

DOMAIN="$2"
DB_NAME_USER="$(echo $DOMAIN | sed -e 's/\.//g')"
DB_PASSWORD="$(apg -a 1 -n 1 -m 64 -d -c cl_seed -E \_\"\'\`\/\\\=)"

sed -i "s/database_name_here/$DB_NAME_USER/g" /srv/"$DOMAIN"/wp-config.php
sed -i "s/username_here/$DB_NAME_USER/g" /srv/"$DOMAIN"/wp-config.php
sed -i "s/password_here/$DB_PASSWORD/g" /srv/"$DOMAIN"/wp-config.php

替換數據庫和使用者名工作得很好,但是當替換密碼時,十次中有六次替換失敗,我最終得到這樣的結果:

定義(‘DB_PASSWORD’, ‘Ymb{X-dT~l5Agg9q561A^?n密碼_這裡D;$U,s>mu*:f7|BK4?oM#OH>cHgsI9GndW@~SkBQ’);

強調問題。它沒有刪除“password_here”部分並將其替換為實際密碼,而是將字元串融合在密碼中間。

我認為它可能是從 apg 生成的字元與 sed 混淆,但我從使用 -E 生成的密碼中刪除了很多,但仍然得到了很多。

其他替換也會發生同樣的情況,總是涉及 apg 和 sed。替換諸如**PASSWORD_HERE**之類的東西會不時導致相同的問題。

有什麼辦法可以解決這個問題,還是我必須繼續嘗試找到導致問題的字元,然後將它們添加到 apg 的排除列表中?或者也許告訴 sed 替換整行而不是我想要的字元串?

提前致謝!

您需要轉義輸入中的\,/&字元,否則 sed 會對它們起作用。就像是

DB_PASSWORD=$(echo "$DB_PASSWORD" | sed -e 's/[\/&]/\\&/g')
sed -i "s/password_here/$DB_PASSWORD/g" /srv/"$DOMAIN"/wp-config.php

應該做的伎倆。

引用自:https://serverfault.com/questions/947166