設定値を上書きするには、パスワード(cat)をsedに渡します。

設定値を上書きするには、パスワード(cat)をsedに渡します。

以下を含む構成ファイルがあります.env

DB_PASSWORD={password}

その中には/root/.mysql/db00.yml.dbMySQL rootアカウントのパスワードがあります。sed次を介して渡そうとします。

cat /root/.mysql/db00.yml.db | sed -i -e "s/DB_PASSWORD=/DB_PASSWORD=(.*)/g" .env

運が悪く、次のようないくつかのバリエーションを試しました。

sed -i "s/DB_PASSWORD=/DB_PASSWORD=$(cat /root/.mysql/db00.yml.db)" .env
mysqlpwd=$(cat /root/.mysql/db00.yml.db)
# Use the variable in sed -i
sed -i "s/DB_PASSWORD=/DB_PASSWORD=$mysqlpwd/g" .env

これによりエラーが発生します。

root@linuxbox:/var/www/www.example.com# mysqlpwd=$(cat /root/.mysql/db00.yml.db)
root@linuxbox:/var/www/www.example.com# sed -i "s/DB_PASSWORD=/DB_PASSWORD=$mysqlpwd/g" .env
sed: -e expression #1, char 33: unknown option to `s'

修正する:

以下を実行しなくても失敗します/g

root@linuxbox:/var/www/www.example.com# echo $mysqlpwd
Rjcr/Sn+s/a2QbGx
root@linuxbox:/var/www/www.example.com# cat .env | grep DB_PASSWORD
DB_PASSWORD=(.*)()
root@linuxbox:/var/www/www.example.com# sed -i "s/DB_PASSWORD=/DB_PASSWORD=$mysqlpwd/" .env
sed: -e expression #1, char 33: unknown option to `s'

これらの方法のどれも動作しないようです。

私はsed 4.7それを実行しています:

root@linuxbox:/var/www/www.example.com# sed --version
sed (GNU sed) 4.7

ベストアンサー1

本質的に、パスワードは以下を許可する必要があります。キーボードが安定して生成できるすべての文字。これは、編集スクリプトsedに挿入されたときにスクリプトをsed破損したり、システム上の任意のファイルに書き込んだり、GNUを使用して任意のコマンドを実行したりするための有効なコードまたは文字列をパスワードに簡単に含めることができることを意味しますsed(ルートとして実行すると)。

ユーザー提供のデータを使用する必要がある場合は、sedデータを整理する方法を正確に知らない限り使用しないでください。私は、シェルが私がほとんど制御できない変数を拡張できるように、二重引用符式(一重引用符の代わりに)を必要とするsedすべてを避けたいと思います。sed

代わりに、以下を使用してくださいawk

awk -F '=' '
    BEGIN { OFS = FS }
    NR == FNR { password = $0; next }
    $1 == "DB_PASSWORD" { sub("=.*",""); $2 = password }; 1' /root/.mysql/db00.yml.db .env >.env.new &&
mv .env.new .env

最初のファイルの最初の行からパスワードを読むことから始めます(ファイルにパスワードがそのまま含まれる1行だけが含まれているとします)。

次に、ファイルを.env区切りフィールドで構成されたファイルとして扱います。=

行の最初のフィールドがある場合は、DB_PASSWORD行の最初のフィールド=の後のすべての項目を消去し(以前のパスワードが含まれている場合=)、パスワードを2番目のフィールドに挿入します。

変更するかどうかにかかわらず、すべての行がとして出力され、ファイルは.env.new前の行.envに置き換えられますmv

決定的に、私は2つのファイルから読み取ったデータを次のように使用しません。パスワード私のプログラムでは、パスワードのどの部分も特別に扱うことを決してawk許可しません。awk呼び出し時に代替文字列としてパスワードを使用すると、sub()問題が発生する可能性があります。これは、&文字列のすべての内容が特殊文字列として扱われるためです。

おすすめ記事