SQLite3クエリストアのIPアドレス構文エラー

SQLite3クエリストアのIPアドレス構文エラー

テーブルを更新するために、小さなデータベースに対してsqlite3クエリを実行しようとしています。スクリプトはより複雑ですが、テスト用に次の変数を設定しました。

DN=123
UP=123
downlocalip=10.1.2.3
downremoteip=123
uplocalip=123
upremoteip=123

次に、次のコマンドを実行してテーブルを更新します。

sqlite3 /var/www/server/newserverstats.db "UPDATE stats SET downspeed='''$DN''', upspeed='''$UP''', downlocalip='''$downlocalip''', downremoteip='''$downremoteip''', uplocalip='''$uplocalip''', upremoteip='''$upremoteip''' WHERE primkey=1"

構文エラーが発生します。

Error: near ".2": syntax error

設定したらローカルIPダウンロード10.1でのみうまく機能するので、追加の小数点が好きではありません。

テーブル自体で型をテキストに設定したので、それは重要ではないと思いますか?

テーブルのプラグマ出力:

0|primkey|integer|0||1
1|downspeed|integer|1||0
2|upspeed|integer|1||0
3|downlocalip|text|1||0
4|downremoteip|text|1||0
5|uplocalip|text|1||0
6|upremoteip|text|1||0

さまざまな見積もりを設定してみましたが、何が間違っているのかわかりません。

どんなアイデアがありますか?

編集する:

以下のコメントに基づいて試した完全なコマンドは次のとおりです。

/usr/bin/ssh [email protected] 'sqlite3 /var/www/server/newserverstats.db "UPDATE stats SET downspeed=$DN, upspeed=$UP, downlocalip="$downlocalip", downremoteip="$downremoteip", uplocalip="$uplocalip", upremoteip="$upremoteip" WHERE primkey=1"'

または

/usr/bin/ssh [email protected] 'sqlite3 /var/www/server/newserverstats.db "UPDATE stats SET downspeed=$DN, upspeed=$UP, downlocalip='$downlocalip', downremoteip='$downremoteip', uplocalip='$uplocalip', upremoteip='$upremoteip' WHERE primkey=1;"'

どちらも私に次のエラーを与えます。

Error: near ",": syntax error

新しいコマンド、詳細:

ssh [email protected] sqlite3 /var/www/server/newserverstats.db <<END_SQL
    UPDATE stats
    SET downspeed=$DN,
        upspeed=$UP,
        downlocalip="$downlocalip",
        downremoteip="$downremoteip",
        uplocalip="$uplocalip",
        upremoteip="$upremoteip"
    WHERE primkey=1
END_SQL

テストスクリプトの1行に戻ります。

#!/bin/bash -x
DN=123
UP=123
downlocalip=10.1.2.3
downremoteip=123
uplocalip=123
upremoteip=123
sql="UPDATE stats SET downspeed=$DN, upspeed=$UP, downlocalip="$downlocalip", downremoteip="$downremoteip", uplocalip="$uplocalip", upremoteip="$upremoteip" WHERE primkey=1"
echo $sql
ssh [email protected] sqlite3 /var/www/server/newserverstats.db "$sql"

これにより、次の応答が提供されます。

UPDATE stats SET downspeed=123, upspeed=123, downlocalip=10.1.2.3, downremoteip=123, uplocalip=123, upremoteip=123 WHERE primkey=1
sqlite3: Error: too many options: "stats"
Use -help for a list of options.

ベストアンサー1

問題はテキストフィールドの文字列参照にあります。

ここにある文書を使用してください(もっと素敵な文章を書くことができます):

sqlite3 database <<END_SQL
    UPDATE stats
    SET downspeed=$DN,
        upspeed=$UP,
        downlocalip="$downlocalip",
        downremoteip="$downremoteip",
        uplocalip="$uplocalip",
        upremoteip="$upremoteip"
    WHERE primkey=1
END_SQL

これは、変数値が正しく削除され、SQLインジェクションの脆弱性が発生していないことを確認するために変数値を完全に制御できると想定しています。


コメントから:

SSHを介してこれを行います。

ssh user@server sqlite3 database <<END_SQL
    UPDATE stats
    SET downspeed=$DN,
        upspeed=$UP,
        downlocalip="$downlocalip",
        downremoteip="$downremoteip",
        uplocalip="$uplocalip",
        upremoteip="$upremoteip"
    WHERE primkey=1
END_SQL

おすすめ記事