星期五, 11月 07, 2014

inotify (檔案變更監視) 以及 autossh reverse tunnel (ssh 逆向通道)

最近需要管理一台會到處"漂"的電腦,它有網路(衛星的哩)、有電源還有冷氣可吹,高級的很。
缺點就是衛星網路很慢,所以如果想要遠端去管理,最佳方案是文字介面,因為它在防火牆內(雖說如果需要,也能拿到實體ip),不過它也沒什麼服務,還是放防火牆內安心些。
所以,ssh 逆向通道就很方便啦,反正電腦隨時保持一條管道讓我可以ssh進去就好。方法也實在簡單。不過有幾個重點應該要注意。
第一,網路會斷,斷了是沒關係,但是連線後要能再連回來,所以autossh可以代勞這個事。
第二,那台電腦會每天重開機,重開機之後要能自動連線回來。這個我不知道是什麼原因,猜想是因為重開機或重啟SSH reverse tunnel時,因為被連端的電腦的port還來不及關閉,新的連線需求就又來了,導致電腦回應說我的port已經在使用中了,所以無法建立連線。由於知識不足,所以想了另一個方法,就是我每次要建tunnel時,就把port加1。當這個port加到一個值時,就再來新的一輪。例如讓port從2220開始,每執行一次就讓port+1,直到port 到2230之後,就再讓port從2220開始。
#!/bin/bash
killall -9 autossh
sleep 10
rportf="/home/user/bin/rport"
RPORT=$(/bin/cat $rportf)
RPORT=$(/usr/bin/expr $RPORT + 1)
echo $RPORT
if [ $RPORT -gt 2230 ]; then
  RPORT=2220
fi
/bin/echo $RPORT > $rportf
SSH_OPTIONS="-i /home/user/.ssh/id_rsa"
# Always assume initial connection will be successful
export AUTOSSH_GATETIME=0
# Disable echo service, relying on SSH exiting itself
export AUTOSSH_PORT=0
autossh -f -- $SSH_OPTIONS -o 'ControlPath none' -o 'ServerAliveInterval 60' -o 'ServerAliveCountMax 3' -R $RPORT:localhost:22 serverUserName@serverIP -N
監視一個檔案,如果它有變動,就...
因為那台再外面"漂"的電腦,順利的話會定時傳東西回來。
所以,如果有東西回來時,我要把它放在一個地方昭告大家…
lsyncd是不錯的選擇,不過我想試點不同的,如inotify或是fanotify之類的。
不過好像centos6.5的kernel 還不支援fanotify ,而且查到的討論很少。
所以還是用inotify,不過殘念的是inotify的計畫已經停止了…所以將來還是得回歸到fanotify吧(?)
inotify 預設沒有安裝,套件庫也沒有,要先裝epel,假設你有epel套件庫,那就
yum install incron
即安裝完成。
設定開機啟動 chkconfig incrond on
用法很像crontab,就輸入下面的指令
incrontab -e
如果不給用,出現 user 'xxx' is not allowed to use incron 那就編輯 /etc/incron.allow (如果不存在,就新增一個)
把要用incrontab 的使用者加進去即可,例如:
vi /etc/incron.allow
xxx
yyy
好了之後,再重新
incrontab -e
#分三個部份:
#要監視的檔案/資料夾 事件 要執行的指令
/home/cmd/or1/ IN_MODIFY /bin/cp $@/latestmidas.json /var/www/html/nrtfcst/
#上面會去監視/home/cmd/or1資料夾, 如果有變更(IN_MODIFY),就把裏面的latestmidas.json這個檔案cp到 /var/www/html/nrtfcst中。
#其實我只想監視一個檔案,但是如果我只設定一個檔案,它只有第一次的更動會複製,接下來就沒反應了。
#原因是它是針對檔案的代碼,但是這個檔案一有變動,代碼如果也根著變,它的監視行動就取消了(因為對像(代碼)不見了),但是如果是監視資料夾就沒這個問題,只是這個資料夾有任何變動,我都會把我原來只想監視的檔案複製一份到別的地方。(還好,反正這個資料夾也就一個檔案)。

沒有留言: