原著是 WarGame 大長輩 Eintisy, 這一週來, 剛好跟他在討論這事, 於是就出了一點建議. 原文經作者同意轉載. (From 某暗黑 Channel) (當然做法上來說可能可以有更漂亮的解, 但是既然只有 login 跑 .cshrc 時會用到一次, 以勘用為原則就好啦)
(排版亂亂的, 懶得修 css 了…)

— Day changed 四 12 25 2008
10:54 knight> Eintisy: 請問我可以轉到我 blog?
10:54 Eintisy> sure.

原文先引

作者: Eintisy (小俠) 看板: chinsan
標題: [文件]判斷 Local IP 設定不同 locale 的方法
時間: Thu Dec 25 11:00:47 2008

[寫在前頭]
因為覺得你這個版蠻好的,沒有太多浪費時間的文章,所以寫在這邊。 XD
佔用到 chinsan 大的版面,請見諒。  :)

[緣起]一直以來都用一些 SOP scripts 來管理 FreeBSD
結果 wargame 那台的系統碟壞掉了… 資料還差一全毀
算一算,也很多年了,那顆硬碟也該是壞掉的時候…
但是,這也是把那台機器轉換成 UTF-8 的好時機…
所以就 "硬上" 了.  XD

但是,因為資料是混合的,所以有時候需要以 BIG-5 登入
有時候需要以 UTF-8 登入… 雖然有 .big5 與 .utf8 去 source (for csh)
仍嫌麻煩…. 懶隋真的是衝動的原力! …..
所以花了一點時間,做了一個小修正,跟大家分享。

[Background]
1. sshd listened at IP_BIG5, and IP_UTF8  (no issues with PORTs)
2  modify /etc/csh.login (for csh)
3. create a script of mode a+rx so that every1 could ready it.
(GetLocal.sh)

[Description]
1. 把 sshd 跑在兩個 IP, 定義好 IP_BIG5, 與 IP_UTF8 (自己選啦…)
2. 根據定義修改 /etc/csh.login 加入下面的橋段:

#######################################################################
# Locale configuration
#######################################################################
#set IP_BIG5="aaa.bbb.ccc.ddd"  # 請自己定義好
#set IP_UTF8="XXX.XXX.XXX.XXX"  # 請自己定義好
set Local_IP=`/root/bin/GetLocal.sh IP`
if ( $Local_IP == $IP_BIG5 ) then

echo "Present Locale: BIG-5..."

set    dspmbyte=big5
#setenv LC_ALL          en_US.ISO8859-1
setenv LC_COLLATE      zh_TW.Big5
setenv LC_CTYPE        zh_TW.Big5
setenv LC_MESSAGES     zh_TW.Big5
setenv LC_MONETARY     zh_TW.Big5
setenv LC_NUMERIC      zh_TW.Big5
setenv LC_TIME         en_US.ISO8859-1
setenv LANG            zh_TW.Big5

else if ( $Local_IP == $IP_UTF8 ) then

echo "Present Locale: UTF-8..."

#setenv LC_ALL           en_US.UTF-8
setenv LC_COLLATE       en_US.UTF-8
setenv LC_CTYPE         en_US.UTF-8
setenv LC_MESSAGES      en_US.UTF-8
setenv LC_MONETARY      en_US.UTF-8
setenv LC_NUMERIC       en_US.ISO8859-1
setenv LC_TIME          en_US.ISO8859-1
setenv LANG             en_US.UTF-8

endif

3. 當然最重要的就是 GetLocal.sh 怎麼寫囉…

—- Filename: GetLocal.sh —-
#!/bin/sh
Report="$1"
PS=/bin/ps
GREP=/usr/bin/grep
SOCKSTAT=/usr/bin/sockstat

# First time to count PPID
IFS=" "
set -- `/bin/ps -j -ax | grep $$ | grep -v grep | grep -v ps`
PPID=$3

# The Second time to count PPID
IFS=" "
set -- `/bin/ps -j -ax | grep $PPID | grep csh | grep -v grep`
PPID=$3

# The Third time to count PID for sshd
IFS=" "
set -- `/bin/ps -j -ax | grep $PPID | grep sshd`
PID=$2

# Got sshd's PID the sockstat for Local IP
IFS=" "
set -- `$SOCKSTAT | $GREP sshd | $GREP tcp4`
IP_PORT=$6

# Local IP and Ports
IFS=":"
set -- `echo "$IP_PORT"`
IP=$1
PORT=$2

# Report
IFS=""
case $Report in
"IP")
echo "$IP"
;;
"PORT")
echo "$PORT"
;;
*)
echo "MyIP = $IP, Port = $PORT"
;;
esac

exit 0

[附註]
這個環境是預設登入時候會影響的,而且是 for csh shell.
是在 FreeBSD 底下測試… (應該不會受版本影響, ps 不要太舊即可)
至於 Linux user 的 bash 環境 …. 等我有需求我才會再改吧! 哇哈哈. XD

[寫在後面]
雖然是分享給大家用,但也請大家高抬貴手…
如果有需要這篇文章的話,也請不要截頭去尾。
內文中有需要做修正的,也請自行修正…
不要寫信給我問怎麼改. -.-a

[感謝]
最後,當然是一些感謝文….
這一篇最主要感謝的是 knight 的鼎力相挺… 幫忙測試
(剛好也有一樣的需求? XD)
最後的最後,謝謝大家。

※ Origin:  SayYA 資訊站  <bbs.sayya.org >

其實我原本的想法比較簡單一點…

— Day changed 六 12 20 2008
18:37 knight> last $USER | head -1 | cut -c18-22 # 這樣應該可以找到自己這次 login 的 tty
18:39 knight> 把上面那行改成 -c21-22, 可以取到 tty 後兩碼, 假設叫 $MYTTY
18:52 knight> ps aux | grep $USER | grep tcsh | grep $MYTTY | grep -v grep | awk -F" " ‘{print $2}’ # 找到這個 tty 的 shell id (我現在用 tcsh)
18:54 knight> 接下來我還沒找到跟 solaris 的 pcp 一樣功能的 tool in freebsd

— Day changed 日 12 21 2008
16:50 knight> 根本就是在兩個 ip 用兩支不同名字的 daemon 去聽, 舉例, sshd1/sshd2, 看某個 tty bind 到哪個 daemon 就知道是哪個 local ip 了

反正就是吃飽撐著… *冷*

Trackback

2 comments untill now

  1. 感謝 WanCW 的提醒…
    那個 GetLocal.sh 裡的方法,如果是 sshd 的話….
    可以換成 $SSH_CONNECTION 比較簡單…

    ======= filename: GetLocal.sh ======
    #!/bin/sh
    Report=”$1″
    IFS=” ”
    set — `echo “$SSH_CONNECTION”`
    IP=$3
    PORT=$4

    # Report
    IFS=”"
    case $Report in
    “IP”)
    echo “$IP”
    ;;
    “PORT”)
    echo “$PORT”
    ;;
    *)
    echo “MyIP = $IP, Port = $PORT”
    ;;
    esac

    exit 0

  2. 附註一:

    原 GetLocal.sh 好像可以在 sudo su – (or su -) 裡用
    新的 GetLocal.sh 則只能在有 $SSH_CONNECTION 變數時候用。

    好像跟 screen 無關。

Add your comment now