スクリプト:システムユーザーに基づくメールボックスSQLレコードの書き込み

スクリプト:システムユーザーに基づくメールボックスSQLレコードの書き込み

コマンドに問題があるか、エラーが表示されません。また、無効なユーザーとUIDが500を超えるユーザーを除外する必要があります。これは私が使用する必要があるSQLコマンドです

INSERT INTO `mailbox` (`username`, `password`, `name`, `maildir`, `quota`, `local_part`, `domain`, `created`, `modified`, `active`) VALUES ('$username, '$pass', '', '$xxxx', 0, 'xxx', 'xxx', 'date --rfc-3339=date', 'date --rfc-3339=date', 1);"

これは私が書いたスクリプトです。 出力エラーです。

答え1

問題は、SQLのバックティックがシェルによってコマンドの代わりに処理されることです。シェルはバックティック文字列をコマンドとして実行し、そのビットを特定のコマンドの出力に置き換えようとします。

echo文字列に二重引用符があるため、シェルはこれを行います。

この特定の問題を解決するには、各バックティックをエスケープしてください\`

理想的には、SQLを一重引用符で囲まれた文字列として渡すことができますが、これは変数が拡張されないことを意味します。

次のようにするとより安全です。

printf 'INSERT INTO `mailbox` (`username`, `password`, `name`, `maildir`, `quota`, `local_part`, `domain`, `created`, `modified`, `active`) VALUES ("%s", "%s", "", "%s", 0, "xxx", "xxx", "date --rfc-3339=date", "date --rfc-3339=date", 1);\n' "$username" "$pass" "$xxxx"

...使用している特定のデータベースが二重引用符で囲まれたフィールドデータを処理できるとします。

関連情報