[實踐] xcp實用程式

樑濤發表於2012-08-03

在UNIX/Linux下工作,最可能拖慢工作速度的一個障礙是,將某個程式的輸出複製到剪貼簿以備使用。使用一般的終端工具需要在選中後額外按下快捷鍵來執行復制操作,這顯然是低效率的。而改用PuTTY這種預設“選中即複製”的工具,則會因不小心輕觸滑鼠按鍵而破壞剛剛選好的一大段(甚跨幾頁)的文字,頗令人沮喪,不得不花時間重做。

如果能利用管道,將程式輸出直接重定向至本地剪貼簿就好了。可是,在A機器上覆制,在B機器上貼上,有可能實現嗎?考慮一下……

[需求]
1. 這是一個跨機器的遠端通訊操作;
2. 資料來源是遠端機器上的形如"cat FILE | xcp"的命令列管道操作,相當於執行了一下複製操作然後推送資料;
3. 資料目的地是本地xcp程式,收到資料後自動將其儲存至剪貼簿。

[分析]
需求第1點要求在兩臺機器之間建立通訊連線(TCP),第2點要求遠端xcp程式知道將資料發到哪個本地程式,第3點要求本地xcp程式能收到資料到達通知或探知到資料已經推送至本地。

建立TCP連線的主要考慮是誰充當監聽機,誰充當連線機。

如果採用遠端監聽/本地連線的形式,則需要a)在遠端機器上安裝(原本不需要的)伺服器程式,b)在複製輸出/更新本地剪貼簿之前由本地xcp程式發起建立TCP連線。這會帶來一些額外開銷和開發成本。

如果採用遠端連線/本地監聽的形式,則需要a)在本地機器上安裝伺服器程式,b)由遠端xcp程式在需要時發起建立TCP連線。這會同樣會帶來一些額外開銷和開發成本,而且當遠端機器和本地機器處於不同網路時,跨越網路邊界和穿越防火牆都會變成障礙。

[設計]
綜合上述需求和分析,可以得到如下一個設計考量列表:
1. 避免建立額外的TCP連線,最好能複用已有SSH連線等,降低開發難度;
2. 避免編寫程式碼,這是具有普遍意義的需求,可能已經有程式設計師實現過類似程式;
3. 避免編譯和交叉編譯,最好使用指令碼語言編寫,便於部署程式。

[複用]
在著手編寫程式碼之前,不妨先查詢一下有沒有可以直接利用的現成工具。

考慮到通用的OpenSSH軟體包支援“X11轉發”功能,可以由此處下手從而實現複用已有TCP連線。

Google一下,可知X Window支援幾種形式的Clipboard。於是思路轉變為尋找可以替代遠端xcp程式和本地xcp程式的軟體,它們可以通過X Window的Clipboard交換資料。Wiki一下可知已經有相當多的軟體可供選擇。遠端xcp程式有xclip等,本地xcp程式有Xming(用於Windows)和XQuatz(用於Mac)。

這下問題解決了,不需要再寫程式,只需要:
1. 使用Bash的別名機制將遠端機器上的"xclip -selection clipboard"包裝成遠端xcp程式;
2. 開啟遠端機器SSHD伺服器的X11Forwarding選項(需要管理員許可權);
3. 使用開啟X11Forwarding功能的PuTTY或者ssh程式連線遠端伺服器;
4. 啟動本地X Window伺服器,開啟其中的剪貼簿同步選項。

這樣不管何時執行形如"cat FILE | xcp"的管道命令,本地剪貼簿都會收到最新的複製內容,以備貼上。

[其它] 上面的解決方案有幾個較為嚴格的限制:
1. 需要遠端伺服器上安裝有X Window軟體包和xclip,必要時還需要有編譯/安裝軟體的許可權;
2. 需要開啟X11Forwarding功能選項,這可能會帶來安全性問題。

如果能夠使用Perl來重寫xclip並實現一部分純Perl版本的X函式,則問題1可以避免。

[實踐]

  1. 使用XQuatz時,要把“剪貼簿改變時更新CLIPBOARD”選項關掉。

相關文章