2017-06-07 1 views
0

私はドロップダウンリストを持つWebフォームと、ドロップダウンリストから選択したオプションをimputとして選択する非常に単純なスクリプトの結果を入力する必要があるフィールドを持っています。 (Webサーバーはapache2とbashを使用し、ユーザー側では少しのjsしか使用しません)残念ながら私はマシンに他のものをインストールすることはできません)bashスクリプトからテキストフィールドに値を設定します

ドロップダウンメニューは自動的に正しく入力されます。 別のbashスクリプトとして実行すると、bash関数は必要なものを返します。

すべてのHTML部分がウェブページに挿入され、正しく表示されます。

問題は、ドロップダウンメニュー(javascript関数によって処理された)の値をbashスクリプト関数に渡すことができないためです。

アイデア?

STUFF.txt:

ミルク

小麦粉

源として使用する2つのテキストファイル、ドロップダウンメニューに1つあります入力するテキストフィールドの別名:

QUANTITY.txt:

卵12unit

ミルク6Liters

小麦粉2キロ

ドロップダウン:

if [[ "$User" == "$Authorized" ]];then 
    echo "<td height=\"30\">$C_STUFF:</td><td colspan=\"3\" align=\"left\" cellpadding=\"0\"><select id=\"STUFF\" name=\"STUFF\" onChange=\"JS_stuff(this.value);\">" 
    STUFF=/apache2/cgi-bin/STUFF.txt 
    while IFS='' read -r line || [[ -n "$line" ]]; do 
     echo "<option id=\"$line\" name=\"STUFF\" value=\"$line\">$line</option>" 
    done < "$STUFF" 
    echo "</select>" 
    echo "</td><td>&nbsp;&nbsp;</td>" 
    fi 

テキスト金融商品取引法D:

echo "<td></td> 
<td>Quantity:</td> 
<td colspan=\"3\"><text id=\"quantity\" size=\"15\" type=\"quantity\" name=\"quantity\" value=\"$STUFF\" ></text></td></tr> 

のJavascript機能:

/****STUFF for the text field**********/ 
function JS_stuff(sel) 
{ 
    var xhttp; 
    if (str.length == 0) { 
    document.getElementById("quantity").innerHTML = ""; 
    return; 
} 
    xhttp = new XMLHttpRequest(); 
    xhttp.onreadystatechange = function() { 
    if (this.readyState == 4 && this.status == 200) { 
    document.getElementById("quantity").innerHTML = this.responseText; 
} 
}; 
    xhttp.open("GET", "getquantity.sh?"+str, true); 
    xhttp.send(); 
} 

bashスクリプト&機能:

SCRIPT:functions.shで

#!/bin/bash 
source ./functions.sh 
getquantity $QUERY_STRING 

FUNCTION:

get_stuff_fromlist() { 
    STUFF="$QUERY_STRING" 
    QUANTITY=/apache2/cgi-bin/QUANTITY.txt 
    while IFS= read -r line; do 
     if [[ $line == $QUERY_STRING* ]] ; then 
      printline="yes" 
     fi 
     if [[ $printline == "yes" ]] ; then 
      QUANTITY= echo "$line" | awk '{print $2}' 
     fi 
     if [[ $line == $QUERY_STRING* ]] ; then 
      printline="no" 
      echo "$STUFF" 
     fi 
    done < "$QUANTITY" 
    } 
+0

'[[[' –

+0

]の後にスペースがありません。ありがとう、私はそれをformatingときに入力ミス。 – Broadcha

答えて

0

まず、いくつかの一般的なコメント。

  • 私はbashスクリプトがCGIスクリプトとして実行されていると仮定します。
  • 一般的に、bashバックエンドを備えたインタラクティブなWebページは、セキュリティ上の理由ではお勧めできません。いくつかのコマンド注入を行うほうがはるかに簡単で、その結果、サーバを危険にさらします。私は今、他のものをインストールできない理由はありませんが、セキュリティのためだと言われていたら、bashを使ってブラウザからサーバーに送られるデータを処理しないようにする必要があります。

あなたが言及した問題については、可能な解決策は2つある。

解決策1 - セキュリティ上の理由からbashには適していません。

2つのスクリプトが必要です。ドロップダウンでwebformを生成するための1つのメインスクリプト。他の人、ヘルパー、パラメータとして物を受け取り、数量を返す。したがって、あなたのjavascript onChangeハンドラは、XMLHttpRequest()を使用して数量を取得するヘルパースクリプトを実行します。ようこそAJAX世界へようこそ。このソリューションの明らかな欠点は、ヘルパースクリプトにブラウザからのデータが与えられ、悪意のあるユーザーが独自の価値を提供する要求を偽装する可能性があることです。ヘルパースクリプトでは、間違ってそのような悪魔によって提供されたコードを実行しないようにする必要があります。 bashでは難しく、他のスクリプト言語では簡単です。

ソリューション2

それはものと数量との連想配列というjavascriptの変数が含まれている方法であなたのWebフォームを準備します。 onChangeハンドラはこのテーブルを参照し、量を適切に埋めます。必要なコードを開発するには、すべてのデータがエンコードされた静的なHTMLファイルを作成することもできます。次に、JavaScriptソリューションに満足したら、CGIスクリプトを使用してWebページを生成します。この解決法は、材料の量が少ないほど長くなります(小さくなるのはあなた次第です)。ブラウザ側でクライアント側で実行され、サーバーへの追加要求は行われません。

PS。スクリプトのドロップダウン部分で</select>タグを2回閉じる。

+0

はい、bashスクリプトはcgiスクリプトです。 セキュリティは問題ありません。これは、embeded linuxを実行している、破棄されたNASを再利用するホビープロジェクトで、javascriptとbashの使い方を学びます。 ダブルを取った。それを指摘してくれてありがとう。 – Broadcha

+0

まずはソリューション2を試してから、ソリューション1に移行することをお勧めします。ちょうど覚えています。CGIスクリプトはサーバー側で実行されます。 Javascriptはクライアント側で実行されます(つまり、ブラウザで実行されます)。楽しむ。 – ArturFH

+0

解決策1:投稿の現在のスクリプトを見る – Broadcha

関連する問題