以下を含む構成ファイルがあります.env
。
DB_PASSWORD={password}
その中には/root/.mysql/db00.yml.db
MySQL 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()
問題が発生する可能性があります。これは、&
文字列のすべての内容が特殊文字列として扱われるためです。