2010年4月27日 星期二

An OpenBox PipeMenu

#!/bin/sh
####################################################################
# Generate a set of expect files to these defined servers ,        #
# Generate a OPENBox menu concludes those expect files.            #
# Auther: IceKimo                                                  #
# Date  : Aprill 27 2010                                           #
####################################################################

主要就是先產生一堆通往各主機的expect檔(這樣連線時節省輸入帳號密碼的時間,但是當然會有洩密問題啦~)再藉由這些expect檔產生出選單,就這麼簡單~

#Envirement Settings
EFF=$HOME/bin/.conn2 # ExecFileFolder
[ -d $EFF ] || ( rm -rf $EFF ; mkdir $EFF )
[ -x /usr/bin/gnome-terminal ] && TERMINAL="/usr/bin/gnome-terminal -x" || TERMINAL="/usr/bin/xterm -e"

基礎重要設定只有存放expect檔案的位置與連線程式,連線種類其實還可以更多去包含kermit的語言,不過,等2012吧~

#       Functions to create every expect files connect to server.
#       SSH and Telnet are different expect template.
#       The expect files can be edited after Generated.
create_expect() {
file_exp="$EFF/$3@$2.exp"
        echo "#!/usr/bin/expect" > $file_exp
        echo "set tiomeout 30" >> $file_exp
  if [ X${1:0:3} = "Xssh" ] ; then
# Depend on the password field , empty this by SSH PubkeyAuthentication
        if [ -n "$4" ] ; then
cat << EndOfSSHExpect >> $file_exp
        spawn $1 -l $3 $2
        expect "*assword:" {send "$4\r"}
EndOfSSHExpect

因為SSH連線可以使用鑰匙認證而不需要密碼,因此可以密碼留空白,其實這整個程式裡面大量使用HERE Document的轉向技巧產生各個檔案

        else
cat << EndOfSSHExpect2 >> $file_exp
        spawn $1 -l $3 $2
EndOfSSHExpect2
        fi
  else
# The TELNET PROTOCOL
cat << EndOfExpect >> $file_exp
spawn $1 $2
expect "ogin:"
send "$3\r"
expect "assword:"
send "$4\r"
EndOfExpect
  fi

希望可以個別放一些特殊expect語法的話,比如說登入後修改啥環境變數之類,把檔名寫好在$5欄

  if [-n "$5" ] ; then
        cat $5 >> $file_exp

  fi
  echo "interact" >> $file_exp
  chmod 510 $file_exp
}
# Configure file was embeded in this Script, Now I change it
# To edit config on a .config file, keep your password secret
ConfigFile=$EFF/.config

原本我是把設定值直接就跟程式寫在一起,不過這樣似乎太快樂了,還是拆出來一個檔好了

if [ !–x $ConfigFile ] ; then
cat << EndOfConfig > $ConfigFile
# Field up like the follow sample ; seperate by :
# PROTCOL:REMOTE_HOST:REMOTE_USER_ID:PASSWORD:OPITIONAL_EXPECT_FILE
telnet:ptt.cc:guest::
EndOfConfig
fi

echo "Choose an editor program you like to use, default is vi : " && read editor
which $editor
[ $?=0 ] && editor=`which $editor` || editor=`which vi`
$editor $ConfigFile

grep -v ^# $ConfigFile > $ConfigFile.tmp

exec 6< $ConfigFile.tmp
  OIFS=$IFS ; IFS=":"
while read pro host id passwd extfile <&6
do
        create_expect $pro $host $id $passwd $extfile
done

上面的作為是製造出設定檔,然後更改系統分隔字元,把設定檔餵進while read組合的迴圈,就會自動一行一行塞去做出expect檔案。exec <6 與<&6是指使用FD 6來作為串接的檔案代碼(File Descriptor),效果就是,嗯簡單的講,在UNIX觀念裡,所有東西都是檔案,FD 0通常就是標準輸入(鍵盤),所以這樣看FD 6就有如找個鍵盤來敲這檔案裡的字進程式。


  IFS=$OIFS ; unset OIFS ; rm $ConfigFile.tmp
###########Create the pipe menu for openbox ###############
pipe_menu=$HOME/.config/openbox/conn2.sh
echo '#/bin/sh' > $pipe_menu
cat << EndOfPipeMenu >> $pipe_menu
gen_menu() {
        # Generate Menu Item for Openbox
  echo "<item label=\""\$1"\">"
  echo -n '<action name="Execute"><execute>'
  echo $TERMINAL $EFF/\$1.exp
  echo "</execute></action>"
  echo "</item>"
}

這邊整段就沒啥,就是把PIPEMENU(另一支其實可以獨立的ShellScript)整個包起來用HERE Document產生出來後,最後作個提示如何修改openbox設定檔

echo '<openbox_pipe_menu>'
echo '<separator label="CONN2" />'

  echo "</item>"
}

echo '<openbox_pipe_menu>'
echo '<separator label="CONN2" />'
hosts=\$( ls $EFF/*.exp )
    for host in \$hosts
        do
          host=\$( basename \$host )
          host=\${host%.exp}
          gen_menu \$host
#         echo "<separator />"
        done
echo '</openbox_pipe_menu>'
EndOfPipeMenu
chmod +x $pipe_menu
cat << POST
Insert a line in your OPENBOX Menu $HOME/.config/openbox/menu.xml as example

<menu id="sshmenu" label="TERMINAL CONN2" execute="$HOME/.config/openbox/con
n.sh" />

POST

2010年4月22日 星期四

ASUS Wl-520GU改DD-WRT

其實這教學文在dd-wrt的wiki就有了(謎之音:XD那你賣點是啥啊),所以我決定使用ubuntu環境配合上一點點shellscript來完成這件事情。

簡單敘述這個組合的威力。dd-wrt是一個開源碼中給Router的韌體,很遺憾的說,其實我買了很多次ASUS的WL-520G系列Router,但是其實從來沒有看過裡面ASUS設定的介面,因為一開箱就馬上刷DD-WRT(…..),原廠韌體不錯啊,但是dd-wrt的強大除了調整無線功率之外,還有添加很多package程式。比如說,利用WL-520GU背後的USB多加一隻隨身碟,然後變身FTP/SAMBA或P2P動物機(ok,講到這裡很多人都不相信了),或者是扮演VPN的角色(by OpenVPN)。是的~你沒看錯,你剛剛花一千多一點買的家庭用IP分享器,可以VPN,就是那個回家辦公事的VPN。

凡事起頭難,尤其是人人常說,刷機有一定風險,一個不小心就準備再買個新的(其實也沒有這麼慘,那都是唬人的)。尤其是進入工程模式常常需要一些神秘的儀式…

首先簡單講要準備的東西,到dd-wrt下載好新的韌體(如我使用的dd-wrt.v24_vpn_generic.bin),將電腦網路線插到WL-520GU的Lan1孔裡(因為在救援模式,只有這個孔開放連線),在ubuntu安裝tftp軟體(我使用的是atftp)

wget http://www.dd-wrt.com/routerdb/de/download/Asus/WL520GU/-/dd-wrt.v24_vpn_generic.bin/1966

sudo apt-get install atftp

然後調整網卡跟等一下router同個網段,因為這樣兩邊等一下才不需要路由轉換就可以連線(不要以為刷機中的路由器會幫你轉封包,要是這樣霍金還可以跑步游泳的說)。參考指令如下

sudo ifconfig eth0 192.168.1.2 netmask 255.255.255.0

要作傳說中神秘的Hard-Reset,又稱30-30-30 Reset 因為每個步驟都大約30秒,用個小小script輔助一下

#!/bin/bash
function Wait() { for (( x=30 ; x > 1 ; x-- )) ; do echo $x && sleep 1; done }
echo 將電源線拔掉後按下 Enter計時 && read a
Wait
echo 持續按住背面RESTORE時恢復供電,再次按下 Enter 計時 && read a
Wait
echo 如果電源指示燈持續閃動,恭喜你進入Restore模式

如果你可以ping到192.168.1.1,恭喜恭喜,接下來就很容易了。如果沒有,除了沒有接對線(Lan1 !! 誰教你接WAN!!) 你有沒有把網卡IP設定在192.168.1.x的同網段也是重點…真還不行,拔掉電源再來一次,這樣多插幾次還不會弄壞你的Router的(但是你也不會高潮就是了)。

接下來我們真正進入弄壞Router的領域了,歐,不是,是DD-WRT的歡樂新世界。參考指令如下

atftp -p -l dd-wrt.v24_vpn_generic.bin --verbose 192.168.1.1
sleep 300 && echo DONE

注意到傳完以後一定要等夠五分鐘,這樣韌體才會寫入FLASH,不然,就再來一次。wiki上說要等Five EARTH Minutes,請各位火星人務必忍耐一下。

然後呢?把電源拔掉再插回去(相信你已經不是今天第一次了…應該很熟悉這感覺了)就好啦,有沒有很簡單啊?~馬上打開瀏覽器連線192.168.1.1,如果看到dd-wrt威脅你一定要設定管理帳號與密碼,不然就不給你用的對話,趕快把名字簽一簽,以後就是你要對她負責啦~~

#!/bin/bash
ping –c1 192.168.1.1
[ X$? == X0 ] || $( echo 連線測試失敗,請設定完連線再開始 ; exit 1 )
which atftp
[ X$? == X0 ] || sudo apt-get install atftp
function Wait() { for (( x=$1 ; x > 1 ; x-- )) ; do echo .$x && sleep 1; done }
echo 將電源線拔掉後按下 Enter計時 && read a
Wait 30
echo 持續按住背面RESTORE時恢復供電,再次按下 Enter 計時 && read a
Wait 30
echo 如果電源指示燈持續閃動,恭喜你進入Restore模式
Wait 30
echo 開始刷機 確認輸入y && read a
[ X$a == Xy ] || exit 0
atftp -p -l dd-wrt.v24_vpn_generic.bin --verbose --trace 192.168.1.1
Wait 300 && echo DONE

2010年4月19日 星期一

製作離線安裝的MSN Live 服務

最近還真是有點懶的寫東西,勉強一下野人獻曝
製作方法是這樣的,首先按照規矩下載wlsetup線上安裝版程式,然後照自己習慣安裝起來以後,到C:\Program Files\Common Files\MSN Live\.cache底下把各msi安裝檔撿回來重複利用。
msi安裝的方式可以用cscript來靜默安裝,寫法如下

@ECHO Install MSN Live XXX
start /wait msiexec /i 檔案名稱.msi /passive /qb

依序把檔案名稱都寫完在這個.cmd的script檔裡,只要點它就會自動裝完MSN Live 服務。
以我自己來講,我只用Messanger與Writer兩個功能。

其實以上是本來製作Windows 7安裝光碟時自動安裝步驟之一,它的基礎機制就是SetupComplete.cmd。但是因為那是在個人帳號啟始前就安裝,加上本人懶惰又不想徹底研究這機制,於是寧可包成另一個手動安裝package。

這次寫出來有一個比較可以自慢的一招,下載最新的Avira Antivir小紅傘來安裝,借助GNU的wget.exe工具程式來下載。cmd內容如下:

cd %SystemRoot%\Setup\
start /wait wget.exe http://dlce.antivir.com/package/wks_avira/win32/en/pecl/avira_antivir_personal_en.exe
@ECHO Install AntiVir
start /wait %SystemRoot%\Setup\avira_antivir_personal_en.exe

真的很簡單喔~~!