[實踐] xcp實用程式
在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可以避免。
[實踐]
- 使用XQuatz時,要把“剪貼簿改變時更新CLIPBOARD”選項關掉。
相關文章
- framebuffer應用程式設計實踐程式設計
- 應用實踐——新東方實時數倉實踐
- 用程式碼來實踐Web快取Web快取
- Flutter 應用程式佈局的最佳實踐Flutter
- GroovyShell 應用實踐
- Vue最佳實踐和實用技巧Vue
- GitOps 應用實踐系列 - Argo CD 上手實踐GitGo
- 小程式TodoList實踐
- JNI程式碼實踐
- 用 OSGi 應用程式開發和工作的最佳實踐
- [譯] 思考實踐:用 Go 實現 FlutterGoFlutter
- 【唯實踐】容器環境應用一鍵拉起實踐
- TiDB應用實踐TiDB
- Oracle Audit 應用實踐Oracle
- 小程式優化實踐優化
- Go程式設計實踐Go程式設計
- Python 多程式實踐Python
- [實踐] 單例程式模式單例模式
- iOS程式碼瘦身實踐:刪除無用的類iOS
- Java Web應用的程式碼分層最佳實踐。JavaWeb
- 超實用的“情境調研”實踐方法
- 真實世界中 Rust 程式的安全實踐Rust
- Spring AOT應用實踐Spring
- Android快應用實踐Android
- 談談 django 應用實踐Django
- 測試用例最佳實踐
- 行業實踐:RocketMQ 業務整合典型行業應用和實踐行業MQ
- 京東實時資料產品應用實踐
- 超實用的JavaScript技巧及最佳實踐(上)JavaScript
- 37 Signals的實用最小主義實踐
- 小程式初實踐總結
- 高效前端程式設計實踐前端程式設計
- 小程式分屏載入實踐
- 微信小程式實踐_1前言微信小程式
- iOS程式碼實踐總結iOS
- 程式碼審查最佳實踐
- 減少.NET應用程式記憶體佔用的一則實踐記憶體
- 【小程式】微信小程式開發實踐微信小程式