遠(yuǎn)程工作的需求無非兩個(gè):
- 遠(yuǎn)程執(zhí)行命令殴玛。
- 在遠(yuǎn)程與本地之間進(jìn)行文件的雙向傳輸亡嫌。
所有的遠(yuǎn)程工作流都需要考慮如何提高這兩個(gè)操作的效率砂缩。
1. 一般遠(yuǎn)程工作流
對(duì)于一般的遠(yuǎn)程機(jī)器胁出,我們可以通過 ssh 進(jìn)行連接和操作沟启,并使用 scp
命令或 SFTP 客戶端實(shí)現(xiàn)雙向文件交換:
# 登錄開發(fā)機(jī)
ssh dest_host
# 上傳文件
scp path/to/local_file dest_host:path/to/remote_file
# 下載文件
scp dest_host:path/to/remote_file path/to/local_file
有很多可視化的 SFTP 工具能夠代替 scp
命令完成文件雙向傳輸忆家,非常方便,例如 WinSCP德迹、Xmanager 等弦赖。
主流的文本編輯器也都提供了對(duì) SFTP 的插件支持,例如:
可以很方便地上傳、下載流酬、刪除币厕、編輯遠(yuǎn)程文件。
2. 中繼機(jī)下的遠(yuǎn)程工作流
考慮到安全原因芽腾,公司常常會(huì)對(duì)遠(yuǎn)程開發(fā)機(jī)的入口做限制旦装,想要連接開發(fā)機(jī)必須以一個(gè)中繼機(jī)器作為中介。這時(shí)候我們需要兩次 ssh 連接:首先連接到中繼機(jī)摊滔,然后從中繼機(jī)連接到開發(fā)機(jī)阴绢。
# 登錄到中繼機(jī)
ssh relay_host
# 現(xiàn)在我們已經(jīng)在中繼機(jī)上…
# 登錄開發(fā)機(jī)
ssh dest_host
中繼機(jī)的存在除了造成登錄更復(fù)雜之外,也使得文件傳輸更難實(shí)現(xiàn)艰躺,因?yàn)榻^大多數(shù) SFTP 工具都沒有中繼功能呻袭,在這種情況下無法使用。
按照傳統(tǒng)的方案腺兴,我們需要兩次 scp
命令來完成一次文件上傳操作:首先從本地上傳到中繼機(jī)左电,然后從中繼機(jī)上傳到開發(fā)機(jī)。但是這種方式顯然太復(fù)雜了,而且大部分中繼機(jī)對(duì)安全的要求非陈ㄗ悖苛刻段誊,只允許使用 ssh
命令,導(dǎo)致 scp
方式失效栈拖。
此時(shí)我們有以下三種方案來實(shí)現(xiàn)文件傳輸功能:
2.1 SSH 隧道
為了避免重復(fù)性的中繼命令连舍,我們可以借助 ssh
提供的“隧道”功能。該功能可以透過任意數(shù)量的中繼機(jī)涩哟,在本地機(jī)器與目標(biāo)機(jī)器之間建立一條“隧道”索赏。因此,文件的上傳染簇、下載依然可以通過本地機(jī)器上的一條命令完成参滴。
同時(shí),SSH 隧道有一個(gè)巨大的好處:所有的 SFTP 工具依然可用锻弓,因?yàn)樗淼缹?duì)外部是透明的砾赔。
關(guān)于隧道功能,可以查看
ssh
幫助手冊(cè)中的-ProxyJump
青灼、-ProxyCommand
暴心、-R
、-L
等參數(shù)的用法杂拨。
不過使用該方案有兩個(gè)前提:
- ssh 版本必須足夠新专普,以支持隧道功能(OpenSSH 7.3 +)。
- 中繼機(jī)必須允許 TCP 轉(zhuǎn)發(fā)弹沽。
但不幸的是檀夹,很多中繼機(jī)對(duì)安全的要求非常苛刻策橘,不允許 TCP 轉(zhuǎn)發(fā)炸渡。在這種情況下,該方案無法工作丽已。
2.2 szrz 工具
szrz 是一個(gè)輕量蚌堵、便捷的解決方案,其內(nèi)部采用的 ZModem 協(xié)議非常底層沛婴,對(duì)中繼機(jī)是透明的吼畏。因此 szrz 是中繼機(jī)環(huán)境下文件傳輸問題的天然解決方案。
szrz 容易使用嘁灯,配置完成后泻蚊,在開發(fā)機(jī)的控制臺(tái)中使用 sz
命令下載文件,rz
命令上傳文件旁仿,同樣可以透過任意數(shù)量的中繼機(jī)藕夫。
但 szrz 有兩個(gè)嚴(yán)重弊端:
- 不支持大文件傳輸(超過 30MB 的文件就會(huì)把控制臺(tái)卡死)孽糖。
- 喪失了 SSH 協(xié)議的一切好處枯冈,比如安全性毅贮、豐富的 SFTP 工具等。
2.3 不使用 SSH尘奏,而是借助 FTP滩褥、HTTP 等其他協(xié)議
既然 SSH 協(xié)議被中繼機(jī)限制了,那我們不如另立門戶炫加,借助 FTP瑰煎、HTTP 等其他協(xié)議來實(shí)現(xiàn)文件傳輸∷仔ⅲ考慮到 FTP 天然適合靜態(tài)文件服務(wù)酒甸,比 HTTP 高效很多,所以我們一般選擇搭建 FTP 服務(wù)赋铝。
FTP插勤、HTTP 服務(wù)器是非常成熟、穩(wěn)定的技術(shù)革骨,基本上隨意挑選一款工具都可以滿足我們的需求农尖。我們以 pyftpdlib 為例:
- 在開發(fā)機(jī)上安裝 FTP 工具:
pip install pyftpdlib
- 啟動(dòng) FTP 服務(wù)
python -m pyftpdlib # and many other options ...
我們實(shí)際在用的啟動(dòng)命令:
# 考慮安全因素,可設(shè)置用戶名和密碼
python -m pyftpdlib --directory /home/work/ --port 8888 -r 8000-9000 --user username --password ****** --write
FTP 服務(wù)非常穩(wěn)定良哲,極少出錯(cuò)盛卡,因此你可以把上述命令放到后臺(tái)執(zhí)行,并且丟棄其日志:
nohup python -m pyftpdlib ...blahblah... >/dev/null 2>&1 &
開發(fā)機(jī)配置完成之后筑凫,我們就可以在本地進(jìn)行文件上傳滑沧、下載操作了:
# 下載文件
curl ftp://dest_host:8888/tmp/test.tar.gz -o test.tar.gz -u username:******
# 上傳文件
curl -T test.tar.gz ftp://dest_host:8888/tmp/test.tar.gz -u username:******
FTP 解決方案的優(yōu)勢(shì)如下:
- 支持大文件,并且傳輸速度是三種方案中最快的巍实。
- 天然支持可視化滓技,可直接把 ftp 地址輸入瀏覽器查看、下載文件蔫浆。
- 安全性:比 SSH 稍弱殖属,但考慮到開發(fā)機(jī)僅公司內(nèi)網(wǎng)可見,因此并不需要過度擔(dān)憂瓦盛。
- FTP 與 SFTP 一樣洗显,有著豐富的第三方工具可用。
3. 終極遠(yuǎn)程工作流:實(shí)現(xiàn)遠(yuǎn)程實(shí)時(shí)編輯
文件的上傳下載其實(shí)是個(gè)低頻需求原环,遠(yuǎn)程實(shí)時(shí)編輯開發(fā)機(jī)上的文件才是真正的痛點(diǎn)挠唆,這樣就實(shí)現(xiàn)了遠(yuǎn)程工作空間(remote workspace)。在這個(gè)需求上嘱吗,SSH 隧道和 FTP 解決方案更能充分提現(xiàn)其優(yōu)越性玄组。
目前主流的文本編輯器都支持 SFTP滔驾、FTP 等插件,比如:
這些插件可以在本地目錄和遠(yuǎn)程 SFTP/FTP 目錄之間建立映射患膛,從而實(shí)現(xiàn)遠(yuǎn)程實(shí)時(shí)編輯開發(fā)機(jī)上的代碼(以下圖片引自 Sublime Text SFTP):
當(dāng)然摊阀,你也可以不做實(shí)時(shí)映射,而是使用手動(dòng)方式同步本地和遠(yuǎn)程的代碼:
在這種工作流下踪蹬,編輯遠(yuǎn)程機(jī)器上的代碼與編輯本地代碼沒有任何差別胞此。
相比如下兩種工作流:
- 本地編輯代碼->上傳到開發(fā)機(jī)->發(fā)現(xiàn)問題->重復(fù)以上三步(或使用 vim 做簡(jiǎn)單修改)
- 登錄開發(fā)機(jī)->使用 vim 編輯代碼(這種方式的弊端是不夠工程化,大代碼量難以管控)
remote workspace 工作流有著可視化編輯器的加成跃捣,在實(shí)踐中可以大大提高開發(fā)效率漱牵。