CGI Web 应用程序,与变量作斗争

CGI web application, struggle with variables

这是我第一次 post 来这里。 阅读 Whosebug 很长时间了,我想花点时间感谢您为帮助社区所做的一切。谢谢。

缺乏脚本领域的知识导致我创建了这个 post。 由于我的问题的复杂性(在我看来),我无法 google 解决方案。 首先 - 我非常感谢任何相关的 material 链接能够让我自己学习。 如果对我尝试做的事情有任何现代解决方案 - 我宁愿从 bash\cgi\php 切换到它,因为我知道的不多。

我有一个 apache 2.4,我正在尝试创建 Web 应用程序。 它现在有 bash syntacsis 但我稍后会在弄清楚如何构建工作 bash 脚本时将其转换为 CGI。 它确实:

#!/bin/bash

echo "Content-type: text/html"
echo ""

sv00dbtest01=$(5d0b3f1b-16f4-4d6a-8fac-0e746887f71d)
sv00dbtest02=$(010eeaea-f56b-42b3-b4e4-26ef235860a9)
sv00dbtest03=$(0688e718-c807-4629-ab90-1cc729fd1513)
sv00dbtest04=$(4e9bf96b-3311-4936-a877-4e66ca3a860a)
sv00dbtest05=$(fce66f7a-2a50-4856-978c-cbe44dd2acb6)
sv00dbtest06=$(271476de-97d0-4915-895c-98da9be2d6d2)
sv00dbtest07=$(9c5a7112-1685-4a0e-9d07-30669383ec12)
sv00dbtest08=$(f7a7f06a-adcb-4eda-8f68-3a2d7874ff86)
sv00dbtest09=$(5d1f2088-5148-4ec7-b169-8e674dd6ba40)
sv00dbtest10=$(fc4ad441-a997-4a28-888e-97e53e965447)
file=$(ssh -p 48563 root@$srv1 'ls -1t /app/docker/pg/backup/daily | head -n 1')

echo '<html>'
echo '<head>'
echo '<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">'
echo '<title>Form Example</title>'
echo '</head>'
echo '<body>'

  echo "<form method=GET action=\"${SCRIPT}\">"\
       '<table nowrap>'\
          '<tr><td>Input</TD><TD><input type="text" name="srv1" size=12></td></tr>'\
          '<tr><td>Section</td><td><input type="text" name="srv_list" size=12 value=""></td>'\
          '</tr></table>'

  echo '<input type="radio" name="srv2" value="sv00dbtest01" checked> Test server №1<br>'\
       '<input type="radio" name="srv2" value="sv00dbtest02"> Test server №2<br>'\
       '<input type="radio" name="srv2" value="sv00dbtest03"> Test server №3'
       '<input type="radio" name="srv2" value="sv00dbtest04"> Test server №4'
       '<input type="radio" name="srv2" value="sv00dbtest05"> Test server №5'
       '<input type="radio" name="srv2" value="sv00dbtest06"> Test server №6'
       '<input type="radio" name="srv2" value="sv00dbtest07"> Test server №7'
       '<input type="radio" name="srv2" value="sv00dbtest08"> Test server №8'
       '<input type="radio" name="srv2" value="sv00dbtest09"> Test server №9'
       '<input type="radio" name="srv2" value="sv00dbtest10"> Test server №10'

  echo '<br><input type="submit" value="Process Form">'\
       '<input type="reset" value="Reset"></form>'

    scp -3 -P 48563 root@$srv1:/app/docker/pg/backup/daily/$file root@$srv2:/app/docker/pg/backup/$file
    ssh -p 48563 root@$srv2 "systemctl stop docker-compose"
    ssh -p 48563 root@$srv2 "rm -Rfv /app/docker/pg/data"
    ssh -p 48563 root@$srv2 "tar -zsxvf /app/docker/pg/backup/$file --strip=3 -C /app/docker/pg/"
    ssh -p 48563 root@$srv2 "chown -R 1000:1000 /app/docker/pg/data"
    ssh -p 48563 root@$srv2 "systemctl start docker-compose"
    ssh -p 48563 root@$srv2 "rm -Rfv /app/docker/pg/backup/$file"
    ssh -p 48563 root@sv00apptest01 "docker exec server1c /opt/1C/v8.3/x86_64/rac infobase update --cluster=7f122b3b-799c-4c98-a98f-4953a78eff48 --infobase=$srv_list --infobase-user=123 --infobase-pwd=123 --db-server=$srv1"

  if [ "$REQUEST_METHOD" != "GET" ]; then
        echo "<hr>Script Error:"\
             "<br>Usage error, cannot complete request, REQUEST_METHOD!=GET."\
             "<br>Check your FORM declaration and be sure to use METHOD=\"GET\".<hr>"
        exit 1
  fi

  # If no search arguments, exit gracefully now.

  if [ -z "$QUERY_STRING" ]; then
        exit 0
  else
     # No looping this time, just extract the data you are looking for with sed:
     srv1=`echo "$QUERY_STRING" | sed -n 's/^.*srv1=\([^&]*\).*$//p' | sed "s/%20/ /g"`
     srv2=`echo "$QUERY_STRING" | sed -n 's/^.*srv2=\([^&]*\).*$//p' | sed "s/%20/ /g"`
     srv_list=`echo "$QUERY_STRING" | sed -n 's/^.*srv_list=\([^&]*\).*$//p' | sed "s/%20/ /g"`
     echo "Restored base: " $XX
     echo '<br>'
     echo "On the server: " $YY

  fi
echo '</body>'
echo '</html>'

exit 0

所以问题是我不知道如何使用创建的变量池并将它们分配给另一个变量 $srv_list。因此,当用户在 Web 表单中输入文本时,脚本仅对来自变量的值做出反应。 另一个问题是创建 Web 表单,在其中为变量 $srv1 和 $srv2 输入的文本转到脚本并执行它。当人们从 Web 表单应用程序输入文本时,变量将评估为脚本并执行它。 我在读这个 post atm http://www.yolinux.com/TUTORIALS/BashShellCgi.html 并试图创造类似的东西。 提前致谢。

创建数组而不是创建每个变量:

srv_list=(
    "5d0b3f1b-16f4-4d6a-8fac-0e746887f71d"
    "010eeaea-f56b-42b3-b4e4-26ef235860a9"
    "0688e718-c807-4629-ab90-1cc729fd1513"
    "4e9bf96b-3311-4936-a877-4e66ca3a860a"
    "fce66f7a-2a50-4856-978c-cbe44dd2acb6"
    "271476de-97d0-4915-895c-98da9be2d6d2"
    "9c5a7112-1685-4a0e-9d07-30669383ec12"
    "f7a7f06a-adcb-4eda-8f68-3a2d7874ff86"
    "5d1f2088-5148-4ec7-b169-8e674dd6ba40"
    "fc4ad441-a997-4a28-888e-97e53e965447"
)

要处理此列表,您可以使用 for:

遍历数组
for i in ${srv_list[@]}; do
        ssh -p 48563 root@sv00apptest01 "docker exec server1c /opt/1C/v8.3/x86_64/rac infobase update --cluster=7f122b3b-799c-4c98-a98f-4953a78eff48 --infobase=${i} --infobase-user=123 --infobase-pwd=123 --db-server=$srv1"
done