這份 slide 是之前在 Y 社內部 Intern Sharing 所準備的,算是小技巧大集合,分享出來給大家,希望會有幫助。
裡面提到的大多都是建立在「我所認為舒服的環境」的前提上所給的技巧和設定;每個人有每個人認為舒服的設定,這是很主觀的,所以純粹只是當參考。
人生就該悠閒地過,忠實地記錄下人生的軌跡
這份 slide 是之前在 Y 社內部 Intern Sharing 所準備的,算是小技巧大集合,分享出來給大家,希望會有幫助。
裡面提到的大多都是建立在「我所認為舒服的環境」的前提上所給的技巧和設定;每個人有每個人認為舒服的設定,這是很主觀的,所以純粹只是當參考。
pure-ftpd 要能支援 smbfs 這些比較特殊的 File System,必須在 configure 的時候加入 “–without-sendfile” 這個參數,讓它不使用 sendfile 這個 System Call,在 FreeBSD ports 裡,只需要將預設的 Option “SENDFILE Support for the sendfile syscall” 取消即可。下面是官方的說明:
--without-sendfile: on Linux, Solaris, HPUX and FreeBSD kernels, Pure-FTPd tries to reduce the CPU/memory usage by using a special system call (sendfile) . It works very well with most filesystems. However, this optimization is not implemented for all filesystems in current kernels. Users reported that downloading files with Pure-FTPd failed with SMBFS (Samba) on FreeBSD and TmpFS and NTFS on Linux (the error reported by the server is "broken pipe" or "Error during write to data connection") . If you are planning to serve files from these filesystems, you have to use the --without-sendfile switch to enable a workaround. It was also reported that PA-Risc Linux systems need this flag.
之前 po 的那篇幫 portconf 加新功能的,後來聽了 gslin 的建議送了 PR 給作者,剛剛收到 reply mail 通知已經 commit 了。
題外話,最近陸續送了好幾個 PR,也慢慢學習到 ports 的正確包法,對 FreeBSD 的 ports 機制也更了解了,能對 FreeBSD 做出貢獻真的很棒!
Update: 看了一下作者最後的作法,改成了只動到 portconf.sh,主要在下面這行:
echo ${_line#*:} | sed -E 's/([A-Z0-9_]+)(=([^|]+))?/\1=\3/g;s/!([A-Z0-9_]+)=([^|]+)?/.undef \1/g;s/ *\| */|/g;s/ /%/g'
果然高明多了。
ports-mgmt/portconf 是個很棒的工具,它的用法就不多說了,google 一下都可以找到很多篇教學,這篇主要是幫 portconf 加入 .undef 的功能。
在 ports 中常常用到一個作法,就是利用 .ifdef 來判斷 WITHOUT_XXX 是否已定義,如果定義了,便加入 XXX 的設定,一個最常見的便是 WITHOUT_X11,對於那些不想裝 XWindow 的機器來說很有用,只需要在 ports.conf 加入:
*: WITHOUT_X11=yes # WITHOUT_X11 也可
如此一來,所有的 ports 預設便會設定 WITHOUT_X11;但是對於某些套件來說,則必須去掉這個變數才能用到一些 library,最近遇到的例子是,我需要用到 textproc/wv,它 depend on x11-toolkits/gtk20,而 x11-toolkits/gtk20 depend on graphics/cairo,如果 cairo 設定 WITHOUT_X11 來編的話,gtk20 便會編不過出現:
gdkdrawable-x11.c:32:24: cairo-xlib.h: No such file or directory
所以 cairo 必須去掉 WITHOUT_X11 來重編。為了這些特定的套件的需要,我把 /usr/local/libexec/portconf 改成:
_conf=/usr/local/etc/ports.conf
if [ ! -r "${_conf}" ]; then
exit
fi
_pwd=`pwd`
sed '/^#/d;/^[[:space:]]*$/d' "${_conf}" | while read _line; do
for _port in ${_line%%:*}; do
if [ "${_pwd%%${_port}}" != "${_pwd}" ]; then
echo ${_line#*:} | sed -E 's/(!?)([A-Z0-9_]+)((\?)?=([^|]+))?/\1\2\4=\5/g;s/ *\| */|/g;s/ /%/g'
fi
done
done
至於 /etc/make.conf 裡 portconf 的設定改成(我的 /etc/make.conf 已經是改過的了):
# Begin portconf settings
# Do not touch these lines
_PORTSDIR!=/bin/realpath /usr/ports
_MATCHDIR!=echo `echo ${.CURDIR} | /usr/bin/grep ^${_PORTSDIR}`
.if !empty(_MATCHDIR) && exists(/usr/local/libexec/portconf)
_PORTCONF!=/usr/local/libexec/portconf
.for i in ${_PORTCONF:S/|/ /g}
${i:C/!([A-Z0-9_]+)(=([^ ]+)?)?/.undef \1/g} # 主要是這行
${i:S/%/ /g}
.endfor
.endif
# End portconf settings
如此一來,我可以在 ports.conf 設定:
*: WITHOUT_X11=yes graphics/cairo: !WITHOUT_X11
任何變數前面加上 ‘!’ 都會自動 .undef,以上面為例:
$ make -V _PORTCONF WITHOUT_X11=yes !WITHOUT_X11=
最後會變成:
WITHOUT_X11=yes .undef WITHOUT_X11
如此一來,便可針對某些套件設定相對於 Global 的設定了。
但要注意,不能寫成下面這樣:
graphics/cairo: !WITHOUT_X11 *: WITHOUT_X11=yes
否則會變成:
.undef WITHOUT_X11 WITHOUT_X11=yes
ports-mgmt/portconf 是一個很好用的工具,可以設定一個 port.conf,內容大致上的形式是這樣:
editor/vim*: WITH_CSCOPE=yes | WITH_EXUBERANT_CTAGS=yes
如此一來,portconf 便會在 /etc/make.conf 自動去 parse port.conf,然後將對應的參數加入,以上面的例子,如果我安裝 editor/vim or editor/vim-lite 都會自動加入 “WITH_CSCOPE=yes WITH_EXUBERANT_CTAGS=yes”,這樣我們便可以更方便地管理各種不同 ports 的安裝參數。
但是,原本的 portconf 只是單純地判斷是否在 /usr/ports 下執行 make 的,如果 /usr/ports 是使用 soft link 的方式,其 real path 卻是在其它地方,那麼 portconf 便不會運作,它判斷的程式碼是加在 /etc/make.conf:
.if !empty(.CURDIR:M/usr/ports*) && exists(/usr/local/libexec/portconf)
_PORTCONF!=/usr/local/libexec/portconf
.for i in ${_PORTCONF:S/|/ /g}
${i:S/%/ /g}
.endfor
.endif
從上面可以看到,它是利用 make 的 modifier 去比對,但是 modifier 其後接的 pattern 是不接受變數展開的,也就是說我們不能這樣寫:
_PORTDIR!=/bin/realpath /usr/ports
.if !empty(.CURDIR:M${_PORTDIR}*) && exists(/usr/local/libexec/portconf)
_PORTCONF!=/usr/local/libexec/portconf
.for i in ${_PORTCONF:S/|/ /g}
${i:S/%/ /g}
.endfor
.endif
這是 make 本身的限制,rafan 後來送了個 patch,讓 portconf 可以在安裝的時候自動將 make.conf 裡 /usr/ports 換成它的 real path,但是只保證安裝時候判斷,如果 real path 換地方了,便得手動修改或是乾脆重裝 portconf,其實 /usr/ports 的 real path 多半很少換,只要記得換了要修改或重裝就好,所以也還可以,但是我在想有什麼方式可以達到真正的動態判斷 real path,後來我改出了兩個版本:
第一個版本想法是既然直接在 make.conf 做判斷有困難,那不如都改到 portconf 那隻 shell script 去判斷吧!
.if exists(/usr/local/libexec/portconf)
_PORTCONF!=/usr/local/libexec/portconf
.for i in ${_PORTCONF:S/|/ /g}
${i:S/%/ /g}
.endfor
.endif
_portdir=`/bin/realpath /usr/ports`
_curdir=`pwd`
if [ "${_curdir##${_portdir}*}" != "" ]; then
exit
fi
第二個版本是直接在 make.conf 利用外部工具做判斷,只需要修改 make.conf,不用動到 portconf 那隻 shell script。
_PORTSDIR!=/bin/realpath /usr/ports
_MATCHDIR!=echo `echo ${.CURDIR} | /usr/bin/grep ^${_PORTSDIR}`
.if !empty(_MATCHDIR) && exists(/usr/local/libexec/portconf)
_PORTCONF!=/usr/local/libexec/portconf
.for i in ${_PORTCONF:S/|/ /g}
${i:S/%/ /g}
.endfor
.endif
上面兩個版本都可以達到動態判斷 real path,但是有一利必有一弊…原本 portconf 利用 make 本身的 modifier 便是為了減少每次呼叫 make 多花費在判斷的時間,這對於一般的 ports 安裝來說,不會有多大的影響,但是對於 make buildworld 來說,便有可能造成很大的影響,所以我做個了測試,看看上面兩種修改在 make buildworld 增加多少時間,我的測試環境是:
測試出來的結果:
這樣的結果我還算可以接受,所以我選擇了 Version 2 的版本 (雖然它做法挺髒的 XD)。
這篇是我對於 UTF-8 環境的設定心得,其實自己從 FreeBSD 4 就開始嘗試用 UTF-8 的環境了,但是我記得 FreeBSD 4對於 UTF-8 的支援度很差,那時候遇到蠻多問題的,後來還是臣服於 Big5。 到了 FreeBSD 6 支援度已經很好了,便著手建造一個好用的 UTF-8 環境,進展最大的應該算是進 CSCC 之後,和 chenpc & LY 討論了蠻多東西的,最後有這個我自己打 80 分的環境,所以有了這篇 Note。 這篇 Note 重點在於 UTF-8、256 Color & 一些我常用的工具設定,我使用的環境是 FreeBSD 6.3 & 7.0 with tcsh。
主要是在 Window -> Translation 的設定: 
Encoding 選擇 “UTF-8″,不要勾選 “Treat CJK ambiguous characters as wide” (原因容後說明)。
主要針對 LC_ALL & LANG 做設定,$HOME/.cshrc 加入:
setenv LC_ALL en_US.UTF-8 setenv LANG en_US.UTF-8
LANG 我沒有設定 “zh_TW.UTF-8″ 的原因主要是避免某些 tool 會看 LANG 開啟一些設定,例如 screen 會看 LANG 開啟 cjkwidth;mutt 也會看 LANG 選擇 charset。但我覺得這些設定可以很明確地在設定檔內指定,讓程式自動偵測反而容易讓人混淆,所以一律用 “en_US.UTF-8″,其它原因容後說明。 LC_ALL 基本上指定了很多東西,像是 LC_MESSAGES 等,這些細部設定可以參考 Handbook 修改。
Screen 經過許多人的努力,對於 UTF-8 和 Big5 之間的轉換已經很好了,唯一要注意的是,因為 Putty 有支援 256 色,Screen 也加入了 256 色的支援,所以在安裝的時候記得勾選 “XTERM_256″,為什麼要用 256 色?因為我覺得 coding 的時候一定要有一個好用的 Text Editor,尤其是我這種大部份工作都依賴 Console 的 programmer。我用的 Text Editor 是 vim,很剛好地,它支援 256 色,這代表我可以將 Syntax Highlighting 弄得更花俏,Coding 起來也舒適多了不是?

至於另一個選項 “CJK - Treat CJK ambiguous characters as full width”,可以在 Screen 使用 “cjkwidth on” 來修正某些字的字寬,上 BBS 很有用,但是這必須和 Putty ”Treat CJK ambiguous characters as wide” 這個選項互相搭配才可以作用;但在經過各項測試後,發現在 mutt 中常收到一些廣告信,或是 Title 編碼不一樣的情形,雖然 mutt 也有自動轉換的功能,但是並非所有信件都能處理,尤其是廣告信,如果開啟了 Putty “Treat CJK ambiguous characters as wide” 反而亂得更嚴重,這個問題目前也沒什麼好解法,所以選擇不開啟這個選項;還有另一個原因是 dialog 也會因為邊線字寬的問題亂掉,雖然有 rafan 的 poorman box drawing patch 可以解決,但並沒有進 Screen ports,要自己手動 patch,麻煩了點,不過這並不是主要原因啦!主要還是因為 mutt 的問題沒辦法有個好的解法,所以權宜之下,選擇犧牲掉某些特殊字的字寬 (只是字看起來窄了點)。
Screen 的設定主要如下:
# $HOME/.screenrc defutf8 on defc1 off defencoding utf8 bind b encoding big5 utf8 # Ctrl-a b 轉 Big5 bind u encoding utf8 utf8 # Ctrl-a u 轉 UTF-8 # 256 Color Support term xterm termcapinfo xterm "Co#256:AB=\E[48;5;%dm:AF=\E[38;5;%dm" # allow bold colors - necessary for some reason attrcolor b ".I" attrcolor i "+b" # erase background with current bg color defbce on
其實設定和網路上可以找到的差不多,不過要特別說明的是設定中的 term & termcapinfo 名稱要跟環境變數中的 TERM 一樣,這樣才會對應到。在這裡我選擇使用 “xterm” 而不像網路上說的 “xterm-color” 或是 “xterm-256color”,主要是因為在 finch 一個奇怪的問題,如果設了 “xterm-color” 或是 “xterm-256color”,finch 當中的 Alt-C 和 Alt-M 搭配 Up、Down、Right、Left 不能正常運作,所以我後來決定使用 “xterm”,可是實際去看 /usr/local/misc/termcap 後發現其實都對應到同一組設定,這讓我覺得很奇怪,還要再找看看問題出在哪。
我常用的 IRC Client 就是 irssi,在新的版本中已經預設加入了 Recode 的支援,也就是說可以針對各個不同的 Channel 或是 Message Window 設定編碼,它有點類似翻譯器,舉個例來說,當我設定了某 Channel 的 Recode 為 Big5,但我預設系統使用的是 UTF-8,那麼 irssi 接收時會將 Channel 中的對話當作 Big5 來轉換成 UTF-8,再輸出到畫面上;反之,你送出到這個 Channel 的訊息也會自動轉換成 Big5 後輸出,這個功能相當重要,尤其是每個 Channel 的編碼是使用者認定的,事實上 IRC Protocol 內部是沒有 Encoding 的設計的,所以決定要使用哪種編碼是由該 Channel 的使用者認定的,因此 IRC Server 上萬”碼”奔騰,所以 Recode 的功能有其必要性。
基本上要實現 irssi 的 UTF-8,網路上已經有相當多的教學文了,需要較詳細的設定可以參考 JeffHung 這篇。我這裡僅針對 UTF-8 的設定說明。進入 irssi 後,可以利用它內建的指令來直接修改設定,好處是不用看較複雜的 config 檔($HOME/.irssi/config),如下設定:
/SET term_charset UTF-8 /SET recode_transliterate ON /SET recode_fallback UTF-8 /SET recode_out_default_charset UTF-8
當設定完成後,必須將它儲存到 config 內:
/SAVE
然後針對各別的 Channel 或 Message Window 設定編碼,舉例來說:
/RECODE ADD #nctucs Big5 /RECODE ADD #bsdchat UTF-8 /RECODE ADD liuyh Big5
有加上 ‘#’ 代表針對 Channel,沒有的則是 Message Window。同樣地,設定完也要下指令儲存到 config 內。
Vim 對於 UTF-8 的支援度已經相當地完整了,安裝前記得先把 libiconv 先裝起來,然後再裝 vim-lite 即可有自動轉碼的功能,簡單來說就是以 Big5 格式儲存的文件,打開會自動幫你轉換到 UTF-8 顯示,當然這還要加上一點設定 ($HOME/.vimrc):
" 啟動後是使用 utf-8 編碼 set encoding=utf-8 " 新開的檔案預設是 utf-8 編碼 set fileencoding=utf-8 " 所有可能的檔案編碼 set fileencodings=utf-8,big5,euc-jp,gbk,euc-kr,utf-bom,iso8859-1 " 設定輸出到 terminal 的編碼 set termencoding=utf-8 " 將 unicode 中不確定的字符表示成雙字符,在 unicode 下才有用 set ambiwidth=double
有關 encoding, fileencoding, termencoding,我之前有寫過一篇文章來解釋,大家可以參考一下。
上面有提到 Vim 支援 256 色,要顯示出 256 色需要兩個東西配合,一個是設定 Color Level,在 $HOME/.vimrc 加上:
set t_Co=256
如此可以啟動 256 色,接著要使用 256 色的 Color Scheme,上網 google 一下應該可以找到蠻多的,我自己改了一份自己的,將它放在 $HOME/.vim/colors/ 下,接著在 $HOME/.vimrc 加上:
colorscheme yzlin256
這樣便可以了。
Mutt 只需要在 $HOME/.muttrc 下設定:
charset-hook ^us-ascii$ utf-8 charset-hook x-unknown utf-8 set allow_ansi set ascii_chars=yes set charset="UTF-8" set locale="UTF-8" set assumed_charset="utf-8:big5:gb2312" set send_charset="utf-8:big5:gb2312:us-ascii:iso-8859-1:x-unknown"
這樣應該會正常許多。比較特別要注意的是,如果 Locale 設定 “zh_TW.UTF-8″,然後 Screen 打開 “cjkwidth on”,Putty 也勾選 “Treat CJK ambiguous characters as wide”,Mutt 會在字寬上判斷錯誤,造成畫面亂掉,尤其是許多 Spam Mail 的 Title 會很明顯讓整個字寬判斷錯誤;其實這不該完全歸疚於 Mutt,原罪還是 Mail 的編碼字寬很難去判斷和做適當的轉換。這也是為什麼我偏愛 Locale 設定 “en_US.UTF-8″,不要 CJKWidth 和 Putty 的字寬修正的原因,和 chenpc 經過幾番測試的結果,認為這是目前最好的解法。
Finch 本身已經是 Unicode 了,所以不用做額外設定。
rtorrent 在 $HOME/.rtorrent.rc 加上:
encoding_list = UTF-8
這樣檔案目錄和 File List 的顯示會正常很多,我有測試過 rtorrent (0.7.9) 和 rtorrent-devel (0.8.2),rtorrent File List 較正常,只是選取到的名稱每個字會出現兩次;rtorrent-devel File List 則整個亂碼,這個部份可能要等以後的更新了。
lftp 是我在 Unix-like 系統下常用的 FTP Client Tool,它對檔名的轉碼很好用,只需在 $HOME/.lftp/rc 設定,下面是我常用的設定:
set ftp:charset UTF-8 set file:charset UTF-8 alias big5 set ftp:charset Big5; set file:charset UTF-8 alias utf8 set ftp:charset UTF-8; set file:charset UTF-8
在 $HOME/.cshrc 設定環境變數,用 less 看某些 Big5 編碼的東西會正常很多。CS 工作站上的 help 很需要:
setenv LESSCHARDEF "8bcccbcc18b95.."
這樣的 UTF-8 環境已經能應付我 90% 的需求了,如果有錯誤或其他更好的設定方式,也歡迎大家給我意見。
Screen 本身提供了 Encoding 的功能,可以針對單一 window 設定其 encoding,它會自動轉換,這個功能很有用,只是我個人龜毛了點,覺得每次都還要用 “Ctrl-A i” show 出 info 來查看目前的 encoding 為何有點多此一舉。我覺得 caption 和 hardstatus 都應該多加一個參數來表示目前的 encoding,可是很遺憾地它沒有提供,所以我乾脆自己 hack,這樣便可以在 caption 和 hardstatus 裡加一個新的參數 “%e” 用來顯示目前的 encoding,下面是我的設定:
caption always "%{.KW} %-w%{.mW}[%n] %t%{.KW}%+w"
hardstatus alwayslastline "%=%{..M}%e %{..G}%H %{..Y} %c %{..R} %d/%m/%Y %{.K} Load: %l %{wb}"
顯示出來的結果會像這樣:
![]()
每次改變 encoding,它會自動更新,切換 window 也會更新成目前 window 所用的 encoding。
P.S. 我的 patch 檔是針對 FreeBSD ports 裡 sysutils/screen 將所有 option 都編進去後再改的。
原本 Buddy List 裡顯示出來的名稱便只有 Alias,原先的名稱不會再顯示出來了。所以 chenpc 之前做了一個 patch 來解決這件事,只是他老人家懶得做成 optional 的版本,所以我從它的 patch 再改成另一個 optional 的版本,這樣可以在 “Preference” 裡設定開啟與否,patch 在這。

上完 patch 後,記得在 $HOME/.purple/prefs.xml 加上一行:
<pref name='showoffline' type='bool' value='1'/> <pref name='showalias' type='bool' value='1'/> # 加上這行
這樣 “Preference” 裡才會有作用,然後每次更動選項後重開 Buddy List 就可以看到結果了。
大家在登入工作站或是伺服器的時候,最常使用到的應該是 Putty (Pietty, PuttyTray, …etc) 這類提供 SSH 協定的終端機,最傳統也最麻煩的方式就是每次登入的時候都輸入密碼,比較好的方式就是使用 Key Authentication,創造一組 Public Key 和 Private Key,當登入的時候比對,如果 Match 便直接允許登入,不再需要輸入密碼。
但是,在其他的狀況下,這樣的方式也許不是相當適合。以我來說,我常常登入到一台主要的機器,然後再透過這台機器連到其他機器,而在工作當中,也可能在這些機器之間互連,這代表我必須將同一組 Public/Private Key 都放一份到這些機器中,或是建很多組 Public/Private Key 來做這件事,但對於安全性而言,這已經等同於把 Private Key 放到上面給人用了。幸好,SSH 提供了 Agent Forwarding 的功能,能夠讓我只需將 Private Key 放在自己的 Notebook 上,然後便可在這些機器之間暢行無阻了。有關 SSH Key Authentication 及 Agent Forwarding 相關的運作流程及知識,可以參考這裡,這篇只是教大家如何設定。
要做到基本的 SSH Key Authentication,首先便是要產生一組獨一無二的 Key Pair (Public/Private Key),在 Windows 上我使用 puttygen。執行 puttygen 可以看到下面的畫面:

按下 “Generate” 產生一組 Key Pair,在產生的過程當中,它會要求你隨意移動滑鼠遊標,然後透過移動來亂數產生這組 Key Pair:

我們將產生的 Public Key 複製貼到:
$HOME/.ssh/authorized_keys
然後,再按下 “Save private key” 將其對應的 Private Key 存起來供 SSH Agent 使用。在中間可以看到 “Key passphrase”,它可以用來保護你的 Private Key,在進行 Key Authentication 的時候,會要求你輸入設定的 Key Passphrase,如果不符合,即使拿到了 Private Key 也是無法成功通過認證。
接著我們要利用 SSH Agent 來幫我們管理這些 Key Pair,在 Windows 中,我使用 pageant;執行 pageant,會在右下角看到它的 icon 出現,點選右鍵可以看到它的功能:

“View Keys” 可以檢視現在加入的 Private Key 有哪些,”Add Key” 顧名思義就是加入一個 Private Key,我們現在就是要將剛剛產生的 Private Key 加入到 pageant,在加入的時候,如果你剛剛有設定 Key passphrase,便要要求你輸入,這樣 pageant 在幫你進行認證的時候便不需要再手動輸入 Key passphrase 了:

加入 Private Key 後,便可以看到我們加入的 Key 已經記錄下來了:

然後透過 pageant 來執行我們在 Putty 當中設定的 Session,便會自動幫你進行認證,認證成功便會看到這樣的訊息:

要特別注意的是,很多人常常會問,雖然不必再輸入密碼了,但是為什麼還是要輸入帳號,其實只需要在 Putty 當中設定好預設登入的帳號名稱即可:

要達到 SSH Agent Forwarding,我們必須在 Putty 的設定中動點手腳:

將 “Allow agent forwarding” 選取就可以了。然後只需要將同一份 Public Key 放到其他會透過第一部機器連出的機器上,在第一部機器使用 SSH 的時候下:
ssh -A <SERVER_HOST>
便可以將第一台機器的 agent forward 出去。如此一來,只需要同一份 Public/Private Key 便可以在各台機器中暢行無阻,而且不用擔心 Private Key 需要放出去的風險了。
在試的過程中,如果有使用 Screen 這個好用工具的人,一定會發現,一旦進入到 Screen 當中,SSH Agent Forwading 似手就失效了,但是離開 Screen 一切又正常,為何會這樣?
主要是因為使用 SSH Agent Forwarding 會參考一個環境變數 “SSH_AUTH_SOCK”,這個在 Screen 當中並不會被帶入,因此會失效。所以如果要讓 SSH Agent Forwarding 能夠在 Screen 下正常運作,便必須要做一些手腳,在網路上其實有蠻多方法可以用,大部份是將 ssh 和 screen 都做一個 wrapper,主要的想法都是在進入 screen 後自動建立環境變數 (對 .screenrc 下手),但這樣的想法只能確保 screen 自動建立以及已存在的視窗,對於新建立的視窗可能就沒辦法做到,所以我自己寫了個 shell script “setScreenSshAgent”:
#! /bin/sh
MKDIR=`which mkdir`
LN=`which ln`
if [ -n "$SSH_AUTH_SOCK" ]; then
if [ ! -d "$HOME/.screen" ]; then
${MKDIR} -p "$HOME/.screen"
fi
if [ -z "$WINDOW" ]; then
${LN} -fs "$SSH_AUTH_SOCK" "$HOME/.screen/ssh-agent-screen-$HOST"
fi
fi
這支程式主要是將當時的 SSH_AUTH_SOCK link 到 “$HOME/.screen/ssh-agent-screen-$HOST” 下,然後在 .cshrc 下加入:
$HOME/bin/setScreenSshAgent
if ($?WINDOW) then
setenv SSH_AUTH_SOCK "$HOME/.screen/ssh-agent-screen-$HOST"
endif
這樣子就能在登入時更新最新的 SSH_AUTH_SOCK 到 “$HOME/.screen/ssh-agent-screen-$HOST” 中,然後在 Screen 建立新的視窗也會自動將 SSH_AUTH_SOCK 設定到此 link,如此一來,SSH Agent Forwarding 便能正常運作。
Update: 把一些設定改一下,原本的 .cshrc 裡的設定會讓在非家目錄下執行 Shell 出現找不到的問題,所以改成絕對路徑。
Recent Comments