0

基本的にデバイス、グラフ、ツリーを作成し、Cacti グラフ作成ソフトウェアのユーザーを作成しようとするスクリプトがあります。

シェル スクリプトを実行しようとすると、次の SQL エラーが表示されます。ただし、まったく同じ入力ステートメントをコピーして MySQL に直接貼り付けると、構文が受け入れられます。

ERROR 1064 (42000) at line 3: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''TestName','cf199661b212c55286cf81d9602ce63','0', 'TestFullName','on','on','' at line 1

以下のスクリプトは、これがどのように実装されているかです

php add_device.php --description=$1 --ip=$2 --community=community --template=5 --ping_method=icmp
mysql -u root cacti -ppassword -e "select id from host where description='$1'" | grep -v id > tempID
php add_tree.php --type=node --node-type=host --tree-id=3 --parent-node=34 --host-group-style=2 --host-id=`cat tempID`
php add_graphs.php --host-id=`cat tempID` --graph-type=ds --graph-template-id=2 --snmp-query-id=1 --snmp-query-type-id=14 --snmp-field=ifOperStatus --snmp-value=Up
mysql -u root cacti -ppassword -e "select MAX(id) FROM user_auth" | grep -v id > tempUserID
Number=`cat tempUserID`
User_IDD= $(($Number + 1))
Host_ID=`cat tempID`


mysql -uroot -ppassword cacti << EOF



INSERT INTO user_auth (id,username,password,realm,full_name,must_change_password,show_tree,show_list,show_preview,graph_settings,login_opts,policy_graphs,policy_trees,policy_hosts,policy_graph_templates,enabled) V
ALUES($User_IDD,'$3','cf199661b212c55286cf81d9602ce630',0,'$4','on','on','on','on','on',1,2,2,2,2,'on');
INSERT INTO user_auth_perms (user_id,item_id,type) VALUES ($User_IDD,$Host_ID,3);
INSERT INTO user_auth_realm (realm_id,user_id) VALUES (7,$User_IDD);

EOF

rm TempUserID
rm TempID
~

コマンドラインに直接貼り付けられた正確な SQL 挿入ステートメントは、機能する例として次のとおりです。

INSERT INTO user_auth 
        (id, username, password, realm, full_name, must_change_password, show_tree, show_list, show_preview, graph_settings, login_opts, policy_graphs, policy_trees, policy_hosts, policy_graph_templates, enabled) 
VALUES  
(       38, 
        'Test', 
        'cf199661b212c55286cf81d9602ce63',
        '0',
        'TestUser',
        'on',
        'on',
        'on',
        'on',
        'on',
        1,
        2,
        2,
        2,
        2,
        'on'
);

INSERT INTO user_auth_perms 
        (user_id, item_id, type) 
VALUES  (38, 285, 3);

INSERT INTO user_auth_realm 
        (realm_id, user_id) 
VALUES  (7, 38);

私はこれに対して数日間頭を悩ませてきましたが、構文の何が問題なのかがわかりません.誰かが何か完全に間違っていると思いますか?

4

1 に答える 1

1

頭の中でスクリプトを「実行」し、スクリプトが正常に動作することを確認した後、コンピューターが同意しないと動かなくなるということが起こっているようです。

デバッグするときは、コンピューターに対してスクリプトを実行しないでください。SQL をコピーして貼り付けてから、変数を本来あるべきと思われるものに置き換えないでください。

代わりに、コンピューターにスクリプトを実行させます。SQL を出力させ、それが期待どおりかどうかを観察します。

に置き換えることでこれを行うことができます。これによりmysql -uroot -ppassword cacticatスクリプトは結果を実行する代わりに結果を吐き出します。次のようなものであることがわかります。

INSERT INTO user_auth (id,username,password,realm,full_name, [snip]) 
VALUES(,'baz','cf199661b212c55286cf81d9602ce630',0,'cow','on','on',[snip]);

そして今、問題はより明白です:VALUES(,'baz'最初の値がありません。

この問題を解決するには、予期しないエラー メッセージに注意を払うことができます。取得しているものは次のようなものであることがわかります。

42: command not found

この種のメッセージは無視しないでください。出力をコピーして stackoverflow に貼り付ける場合は、すべての出力を含める必要があります (長すぎる場合は、関連性がないと思われる情報を編集するのではなく、スクリプトと入力データのサイズを小さくする必要があります)。

次の行でエラーが発生していることがわかります。

User_IDD= $(($Number + 1))

そして、変数に代入する代わりに「コマンドが見つかりません」と言っているのはなぜですか? の後のスペースのため=。bash の代入では、代入演算子の前後にスペースを含めることはできません。

スペースを削除して、やり直してください。

スクリプトに関するすべての問題を解決するのにこれで十分だと言っているわけではありませんが、良いスタートです。

PS: ShellCheckは自動的に不良スペースを指摘していたでしょう。

于 2014-07-11T20:02:23.987 に答える