6493216 ランダム
 ホーム | 日記 | プロフィール 【フォローする】 【ログイン】

ふるた技工所(てっこうしょ)

ふるた技工所(てっこうしょ)

【毎日開催】
15記事にいいね!で1ポイント
10秒滞在
いいね! --/--
おめでとうございます!
ミッションを達成しました。
※「ポイントを獲得する」ボタンを押すと広告が表示されます。
x

PR

キーワードサーチ

▼キーワード検索

プロフィール

Aちゃん22

Aちゃん22

フリーページ

2018.03.07
XML
カテゴリ:ソフト開発日誌
bash script で CGI を書いて指定時刻に Wake On LAN をする自宅内サービスを作っている。そういえば昔shellshockなんていう話も有った。一応サーバーの bash を確認して問題を起こさないことを確かめる。

働いていた時に bash で CGI を書いていると言ったら、「どうやって?」て言われたっけ?環境変数 QUERY_STRING から CGI 変数(正確な言い方はなんだっけ?)を取り出せる仕掛けを作れば、コマンドラインから起動するスクリプトと同じような感覚で書ける。次のコード片は CGI 変数を取り出す部分だ。書いた CGI より抜粋する。
(2018/4/5 追記 余計な key="$1" を削除)
#!/bin/bash -f
# wakeup host at specified time.
# CGI vars:
# hostname=HostName
# wake_second=UnixTimeSecond
# wake_time=HumanReadableDateTime

function uri_unescape() {
  local b c i l
  b=""
  while read
  do
    i=0
    l=${#REPLY}
    while (( ${i} < ${l} ))
    do
      c=${REPLY:${i}:1}
      case ${#b} in
        (0)
        case "${c}" in
          (+)
          echo -n " "
          ;;
          (%)
          b='\x'
          ;;
          (*)
          echo -n "${c}"
          ;;
        esac
        ;;
        (2)
        b="${b}${c}"
        ;;
        (3)
        b="${b}${c}"
        printf "%b" "${b}"
        b=""
        ;;
        (*)
        echo -n "${c}"
        b=""
        ;;
      esac
      i=$(( ${i} + 1 ))
    done
  done
}

function query_var() {
  echo ${QUERY_STRING} | \
  tr '&' '\n' | \
  grep "^$1=" | \
  sed -n -e "s/^$1=//p" | \
  uri_unescape
}

shell_operators='$|&;<>(){}[]`'

wake_host=`query_var   hostname    | tr -dc '[:alnum:]._-' `
wake_second=`query_var wake_second | tr -dc '+-[:digit:]'`
wake_time=`query_var   wake_time   | tr -d "${shell_operators}"`
あまり込み入ったトリックは使わず、平凡に書いた。uri_unescape が % や + で escape された文字を decode する処理、query_var が CGI 変数名を指定して、値を取り出す処理になる。perl を使えば簡単では?... まあそうなんだ。

大よそ動いている指定時刻に Wake On LAN する CGI scriptはまだ改良の余地がある。
  • マシンが稼働していなくても動くように hostname → MAC address の辞書を持たせる。
  • form を付ける
  • cancel 機能を付ける。
  • DoS に耐性を持たせる。
仮稼働中をさせて実用に支障が無いか見つつ改良方針を考えないと。

本当は RTC の wake 機能を使えば十分なはず。Windows ならタスクスケジューラーだし、Linux なら /sys/class/rtc/rtc0/wakealarm だ。たまに不発になるときの bad knowhow 的な CGI なんだよな...





お気に入りの記事を「いいね!」で応援しよう

最終更新日  2018.04.05 09:11:12
コメント(0) | コメントを書く
[ソフト開発日誌] カテゴリの最新記事


■コメント

お名前
タイトル
メッセージ
画像認証
別の画像を表示
上の画像で表示されている数字を入力して下さい。


利用規約に同意してコメントを
※コメントに関するよくある質問は、こちらをご確認ください。


カレンダー

カテゴリ

サイド自由欄

コメント新着

ご無沙汰してます@ Re[6]:ようやく転職エージェントに会うも - 3 分で終了(04/01) Aちゃん22さんへ 調べて頂いて恐縮です。…
Aちゃん22@ Re[5]:ようやく転職エージェントに会うも - 3 分で終了(04/01) ご無沙汰してますさん、こんにちは。 思い…
ご無沙汰してます@ Re[4]:ようやく転職エージェントに会うも - 3 分で終了(04/01) Aちゃん22さんへ かなり昔のことですが、…
Aちゃん22@ Re[3]:ようやく転職エージェントに会うも - 3 分で終了(04/01) ご無沙汰してますさんへ、こんにちは、 N …
ご無沙汰してます@ Re[2]:ようやく転職エージェントに会うも - 3 分で終了(04/01) Aちゃん22さんへ ご返信ありがとうござい…

ニューストピックス


© Rakuten Group, Inc.