作者 主題: 2014 10月份 SA@Tainan Shell Script 現場 live coding 10/18(六)  (閱讀 4661 次)

0 會員 與 1 訪客 正在閱讀本文。

A-Jhe

  • SA 苦力組
  • 懷疑的國中生
  • **
  • 文章數: 35
    • 檢視個人資料
活動議題:
      Shell Script 現場 live coding

議程簡介 :
      shell script 這題目之前就講過好幾次了,不過每次總覺得講未完的感覺。沒辦法,shell   script 可以拿來講的地方太多了!

      然而 shell script 卻是在 Linux 系統管理以及開發整合上卻是非常重要的技能,可謂不得不學。前面講的幾乎都是原理的介紹,沒有足夠的時間demo給大家看。這次我想邀請現場的聽眾出題目,然後我嘗試用shell script來解答。過程中我會把shell script用到的各項技巧加以說明。或許這樣可以讓大家更容易把之前所學融會貫通!

      當然啦,題目不要太難,最好是Linux日常管理中遇到的問題。而且解法或許有很多種方法,現場示範主要是針對shell script技巧來說明,不見得是最理想最有效率的寫法。

      要來聚會的朋友,建議首先溫習一下之前學過的shell script技巧,然後想一些題目,甚至打好稿子帶來,這樣的話,效果會更好哦!

講師: netman

講師簡介:
       Study-Area創始者 ( The Father of SA )
       其他事蹟可參考這裡
       iThome online :  : 從洗碗工蛻變Linux社群精神領袖
       http://www.ithome.com.tw/itadm/article.php?c=40539

時間:
      2014年10月18日 (星期六)
下午1:30~5:00
      時間規劃: 3.5 hr

地點:
      701台南市東區大學路1號國立成功大學成功校區資訊館65203教室

地理位置/交通路線:
      從台南火車站後站出來小走一段路就到囉!
      http://www.ncku.edu.tw/ver2006/ch/ncku/map/map.htm

費用: 免費

活動報名網址: http://samc.study-area.org/registry/add/158

主辦單位:
      Study area酷!學園

協辦單位:
      國立成功大學資訊工程學系
      台灣網路資訊中心(TWNIC) http://www.twnic.net.tw/
« 上次編輯: 2014-11-03 13:07 由 sakana »

netman

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 17393
    • 檢視個人資料
    • http://www.study-area.org
這次我會送出一台 bananaPi 哦~~

就看誰提的問題夠深度了。。。。。

iknowlab

  • SA 苦力組
  • 懷疑的國中生
  • **
  • 文章數: 68
    • 檢視個人資料
來去觀摩看看

我寫的 shell script 不多,多是利用 crond 自動定時執行
1、異地備援(使用 rsync 指令)
2、清除過時垃圾郵件備份(使用 find 指令)
3、不固定 IP 回報(搭配 vsftpd 環境)
4、擷取數位電表數據與發送至電子看板(搭配 php 程式)

搞 Linux 十年,就寫了這四支

kojj

  • 懷疑的國中生
  • **
  • 文章數: 45
    • 檢視個人資料
1.請問台北的伙伴們,台北那時要來一場?
我也想要bananaPi  :D

2.To iknowlab
我想知道您怎撈電表資料??我想做成MRTG或Cacti圖表

hoyo

  • 榮譽博士
  • 俺是博士!
  • *****
  • 文章數: 4044
  • 性別: 男
  • 有需要的時候,學習就不會分階段。
    • 檢視個人資料
    • 樂咖黑電腦學習網
既然是「數位」電錶,那就表示資料已經有數位輸出,

只是差在「介面」上,是串列 RS-232 這類,還是網路 TCP/IP 上

===========

你在這個節骨眼上問這個問題,我一度以為是你搶走我的飯碗 = ="
受人與魚,不如授人與漁
上海自來水來自海上;倫敦好奇人奇好敦倫

hikohan

  • 俺是博士!
  • *****
  • 文章數: 1288
    • 檢視個人資料
液晶電表的數位資料不是公開資料,廠商會編碼後解譯。

只有高階的液晶電表才會支援com連線。

如果只是偵測主機板電壓資料,用lm_sensors可以看到一些基本資料。
lifeIsFunWithPHP.

iknowlab

  • SA 苦力組
  • 懷疑的國中生
  • **
  • 文章數: 68
    • 檢視個人資料
撈數位電表資料的來龍去脈我有寫在 iT邦幫忙,請大家卓參:

http://ithelp.ithome.com.tw/question/10137388

A-Jhe

  • SA 苦力組
  • 懷疑的國中生
  • **
  • 文章數: 35
    • 檢視個人資料
各位,非常抱歉地點臨時有變動

地點改到:701台南市東區大學路1號 成功國立大學成功校區資訊館65203教室


netman

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 17393
    • 檢視個人資料
    • http://www.study-area.org
辛苦傑哥了~~

netman

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 17393
    • 檢視個人資料
    • http://www.study-area.org
今天的 script sample:
代碼: [選擇]
#!/bin/bash
#
# purpose: to process mail log for ....
# limitation: xxxx
# version:
# change log:
#

# set locale to standard
export LANG=POSIX
# mail log location
log_file=/var/log/maillog
# Month and Day for today
today=$(date "+%b %_d")
# Month, Day, Hour and Minute for 6 minutes ago
date_time_1=$(date -d "6 minutes ago" "+%b %_d %H:%M:")
# Month, Day, Hour and Minute for 1 minutes ago
date_time_2=$(date -d "1 minutes ago" "+%b %_d %H:%M:")
# convert to timestamp format in seconds since 1970-01-01
time_stamp_1=$(date -d "${date_time_1}00" +%s)
time_stamp_2=$(date -d "${date_time_2}00" +%s)
# get logs for today only
log_lines=$(grep "^${today}" $log_file)
# get all record time
all_log_time=$(echo "$log_lines" | cut -c 1-15 | uniq)
# convert to record time to tampstamp format
all_time_stamp=$(while read line; do
        date -d "$line" +%s
done< <(echo "$all_log_time"))
# get the earliest timestamp since last 6 minutes
first_time_stamp=$(echo "$all_time_stamp" | awk '($1 >= '$time_stamp_1') {print $1}' | head -1 )
# get the most recent timestamp before last 1 minute
last_time_stamp=$(echo "$all_time_stamp" | awk '($1 <= '$time_stamp_2') {print $1}' | tail -1)

# exit if either of the two timestamps is missing
[ "$first_time_stamp" ] || {
        echo "The first time stamp not found!"
        exit 1
}
[ "$last_time_stamp" ] || {
        echo "The last time stamp not found!"
        exit 2
}

# where to store report
report_file=/var/www/html/test/mail_log_report.${time_stamp_2}.csv
# get lines only for last 5 minutes (except current minute)
log_lines=$(echo "$log_lines" | sed -n '/^'"$(date -d @$first_time_stamp +%b\ %_d\ %H:%M:)"'/,/^'"$(date -d @$last_time_stamp +%b\ %_d\ %H:%M:)"'/'p)
# get lines only contain 'status=sent'
key_word_sent=$(echo "${log_lines}" | grep 'status=sent')
# get lines only contain 'status=bounced', and remove everything but the postfix ID
key_word_bounced=$( echo "${log_lines}" | grep 'status=bounced' | awk -F [\]\[] '{print $2}')
# get all message ID  with postfix ID
get_ID() {
    for ID in $key_word_bounced; do
        echo "$key_word_sent" | grep -E "\[${ID}\]" | awk '{print $6}'
    done
}
MID=$(get_ID)

# generate header for report file
echo "MessageID,MailFrom,MailTo,SentFrom" > $report_file
# write report content to report file
for i in $MID; do
        echo -n "$i "
        echo "${log_lines}" | grep -E "${i} (from=|to=)" | grep -Eo '(from=[^,]+|to=[^,]+)|relay=[^,]+' | xargs
done | sed 's/ /,/g' >> $report_file
大家也可以從如下連結下載:
http://www.study-area.org/~netman/mail_log.sh

不過,我回家後修改了一下內容:
1. 直接用 awk -F 參數抓欄位,而省略額外兩次的 cut
2. 多加了一個 get_ID 的 function,這樣才能抓到完整的  postfix ID

此外:
最後的report會寫進網站Document的目錄,參考時自行設定web service,這裡就不說明了。
然後交給 crontab 每 5 分鐘執行:
代碼: [選擇]
*/5 * * * * /root/scripts/mail_log.sh
大致如此,時間關係未能介紹更多的script技巧有點遺憾,若有機會再跟大家介紹吧。。。 ^_^
« 上次編輯: 2014-10-18 23:58 由 netman »