你不需要一個圖形化的ssh客戶端
這篇不是 ssh 入門教程王暗,我不會告訴你 ssh 怎么裝悔据,配置文件在哪,而且講解也不會特別細致俗壹。
如果你對教程內(nèi)容感興趣科汗,可以自己去 baidu 相關(guān)內(nèi)容,哦不绷雏,不要用baidu头滔,還是用 bing 吧。
作為一個開發(fā)工程師涎显,在你的職業(yè)生涯里無論如何避免不了和服務(wù)器打交道坤检,尤其是 Linux。你無論如何都需要一個好用的 ssh 客戶端期吓。
你是否曾經(jīng)苦苦尋覓一個好用的圖形 ssh 客戶端早歇,但是你找到了嗎?我估計沒有,因為市面上根本就沒有一個好用的圖形化的 ssh 客戶端箭跳。不管是商業(yè)產(chǎn)品晨另,還是開源產(chǎn)品,一個能打的都沒有谱姓。需求不復(fù)雜的情況借尿,還勉強可以用用,一旦有個稍微高級的需求就抓瞎了屉来。
但是路翻,我們真的需要一個圖形化的 ssh 客戶端嗎?不奶躯,不需要帚桩。那,不用 xshell 嘹黔,不用 putty,那用啥莫瞬?我建議你試試命令行版本的 ssh儡蔓。也許你只是不大喜歡那些黑漆漆,丑哈哈的窗口疼邀,沒關(guān)系喂江,當你真正體會到命令行的強大,你也許就不會在意他的外表了旁振。
我們來設(shè)計一個簡單的場景获询,看看 ssh 能幫我們做什么。
假設(shè)拐袜,你在 aliyun 上有兩臺服務(wù)器吉嚣,一臺 app,一臺 db蹬铺,但是只有一個公網(wǎng)ip尝哆,現(xiàn)在你要連db 服務(wù)器,通常會怎么做甜攀?先 ssh 到 app server秋泄,然后再 ssh 到 db server。中間你可能會輸入兩次密碼规阀。如果密碼比較復(fù)雜恒序,你可能要切換到一個編輯器,從你的密碼文件中復(fù)制一下密碼谁撼。
如果你要拷貝一個文件到 db server歧胁,也需要先拷到 app server 上,然后 登上 app server,再把文件拷貝到 db server与帆。
很煩對不對了赌,我們看看這些流程中有什么痛點:
- 每次連接都要輸入密碼,重開一個 session 也需要輸入密碼玄糟。煩勿她。
- 每次連接 db server 都要先連接 app server,然后再ssh 到 db server阵翎。煩逢并。
- mysql 命令行太難用。煩郭卫。要是能用本機的mysql 開發(fā)工具直接連數(shù)據(jù)庫就好了砍聊。
下面我們看看如何解決這些問題。
免密登錄
輸密碼贰军?不存在的玻蝌,ssh 支持免密登錄。你不需要每次都到密碼文件里復(fù)制粘貼词疼。
你需要使用 ssh-genkey 生成一組 key俯树,然后使用 ssh-copy-id 將公鑰傳到目標服務(wù)器上。配置好之后再連接服務(wù)器就不需要輸入密碼了贰盗。 ssh 的時候许饿,你可以使用 -i 參數(shù)指定私鑰的位置,也可以通過配置文件進行設(shè)置:
host app-server
hostname 47.28.xx.xx
IdentityFile ~/.ssh/key
說明
-
host: ip舵盈,hostname陋率,或者自定義的名稱
if(配置中沒有 hostname 設(shè)置){ 使用 host 的值作為 ip 或 主機名進行連接 } else { 使用 hostname 的值作為 ip 或 主機名進行連接 此時,host 只是一個邏輯名稱秽晚,用來區(qū)分不同主機的配置 }
hostname: 設(shè)定真實的 ip 或 主機名
ProxyJump:設(shè)置 ssh 中轉(zhuǎn)服務(wù)器
IdentityFile:設(shè)置 key 路徑
Port:設(shè)置連接端口
連接復(fù)用
有些時候瓦糟,即便配置了免密登錄,連服務(wù)器還是很慢爆惧,怎么辦狸页?除了優(yōu)化 ssh server 的配置,你還可以使用ssh 的連接復(fù)用功能扯再。
ssh 支持連接復(fù)用芍耘,也就是說,只要你連上服務(wù)器熄阻,想再開一個 session 的時候斋竞,可以復(fù)用之前的連接,而不用創(chuàng)建一個新的連接秃殉,這樣新開 session 基本可以秒開坝初。但是這時候用命令行參數(shù)就比較麻煩了浸剩,最好是在 ssh 的配置文件里進行設(shè)置。例如:
ControlMaster auto
ControlPersist yes
ControlPath /tmp/ssh.%h:%p.%r
ControlPath 用來設(shè)置復(fù)用連接的 socket 文件的路徑鳄袍。都是臨時文件绢要,連接斷掉這些文件會自動刪除。放到一個你覺得合適的路徑即可拗小。
JUMP重罪!JUMP!JUMP哀九!
目標服務(wù)器無法直接連接剿配,這種情況非常常見。這時候我們需要通過其他服務(wù)器進行中轉(zhuǎn)阅束,這些用來中轉(zhuǎn)的服務(wù)器通常被稱作“跳板機”呼胚。 ssh 本身就支持通過跳板機連接服務(wù)器。
ssh -J Jump-Server1 Target-Server
你不需要手動一個一個的登錄服務(wù)器息裸。我們的場景中你可以這樣登錄db server:
ssh -J app-server db-server
如果需要通過多個跳板機連接服務(wù)器也不是問題蝇更,使用多個 -J 即可,但是要注意先后順序
ssh -J Jump-Server1 -J Jump-Server2 -J Jump-Server... Target-Server
而且界牡,只要沿途的服務(wù)器上都有你的key簿寂,一條命令就可以讓你直達目標服務(wù)器。哪個圖形化的客戶端能實現(xiàn)這樣的功能宿亡?即便能,會比一條命令更加優(yōu)雅嗎纳令?
同樣挽荠,JUMP 也可以在配置文件中進行設(shè)置:
host jump-server1
hostname 47.28.xx.xx
...
host jump-server2
hostname 192.168.xx.xx
ProxyJump jump-server1
...
host db-server
hostname 172.30.xx.xx
ProxyJump jump-server2
...
然后就可以通過 ssh db-server 直接連接了
隧道-端口映射
隧道很難理解對吧,那“端口映射”聽上去是不是熟悉一些平绩?我們可以通過 ssh 把服務(wù)器上的任意端口映射到自己的機器上圈匆,比如:mysql。端口映射好之后捏雌,隨便你用什么工具連數(shù)據(jù)庫都可以跃赚。命令的格式是這樣的:
ssh -NfL [本地IP:]本地端口:服務(wù)ip:服務(wù)端口 server
舉個例子:我要把遠程的 mysql 映射到本機:
ssh -NfL 6666:127.0.0.1:3306 db-server
這里的 127.0.0.1 是指服務(wù)器上的 127 而不是你機器上那個 127
這里有一個技巧,要映射的端口不必在目標服務(wù)器上性湿,只要目標服務(wù)器能訪問到就可以映射纬傲。上面這條命令可以等價的改寫成:
ssh -NfL 6666:172.30.xx.xx:3306 jump-server2
看到兩條命令的不同了嗎?
除了可以把服務(wù)器上的端口映射到本機肤频,也可以把本機的端口映射到服務(wù)器上L纠ā!不常用宵荒,這里就不介紹了
隧道-socks
除了做端口映射汁雷,ssh 還可以用來創(chuàng)建 socks 代理净嘀。socks 代理能干啥?通常是配置在瀏覽器里侠讯,讓你的瀏覽器可以訪問服務(wù)器上的 web 服務(wù)挖藏。
ssh -NfD 本地端口 目標服務(wù)器
例如:
ssh -NfD 10000 app-server
然后,你可以在瀏覽器上使用 127.0.0.1:10000 作為 socks 代理厢漩,就可以訪問 app server 上的web 服務(wù)了膜眠。
文件傳輸
scp 和 sftp 這兩個工具,都是用來傳輸文件的袁翁。而且會隨著 ssh 一起被安裝柴底。雖然兩者的操作方式不太相同,但我認為最大的不同可能是 sftp 支持斷點續(xù)傳粱胜。
scp 和 sftp 都受益于上面介紹的免密柄驻、連接復(fù)用、jump焙压、隧道等技術(shù)鸿脓,可以實現(xiàn)免密,免中轉(zhuǎn)涯曲,直接與目標服務(wù)器進行文件交換野哭。
腳本化
命令好長,記不住盎眉拨黔!是的,的確是記不住绰沥,但是也不需要記啊篱蝇。絕大多數(shù)的命令行參數(shù)都可以寫在配置文件里,如果懶到連ip也不想輸(跟我一樣)徽曲。零截。。
你寫代碼的時候遇到一大段需要復(fù)用的代碼通常會怎么辦秃臣?當然涧衙,復(fù)制粘貼是可以的,但是正常人通常會寫個類寫個函數(shù)啥的,把它封裝一下對吧奥此?
那弧哎。。得院。當然是把復(fù)雜的命令寫成腳本啦傻铣。
不會寫腳本咋辦?不難的祥绞,你可以把每一個命令及其參數(shù)的組合看成是一個 API非洲,腳本也無非是調(diào)用幾個API 而已鸭限。不是不會,只是不熟而已两踏。
你可以把前面的 ssh 命令放在一個叫做 dbserver.sh 的腳本中(隨便什么名字)败京,然后加個可執(zhí)行權(quán)限,再把腳本放在 $PATH 路徑上梦染。你就可以在任何目錄里很方便的登錄服務(wù)器赡麦,或者創(chuàng)建隧道了。不需要記 ip帕识,不需要查密碼泛粹。
可編程
ssh 除了可以讓你交互式的操作服務(wù)器以外,還可以進行非交互式操作肮疗。例如晶姊,你想看下服務(wù)器上的時間,你不需要登錄到服務(wù)器:
# ssh 目標服務(wù)器 命令
ssh db-server date
命令行真正強大的地方是可編程伪货。如果你想讓 xshell 執(zhí)行一些批量操作们衙,怎么弄?沒法弄碱呼!但是命令行可以蒙挑。
jenkins 都用過吧,如果你只是要完成一些簡單的部署任務(wù)愚臀,你不需要搭一個jenkins 忆蚀。幾行腳本就能搞定
#!/bin/bash
cd 工程目錄
# 打包
mvn package 或者 yarn ...
# 部署
scp package remote-server:/path/to/projects
# 重啟服務(wù)
ssh remote-server restart service
看見了?我們的 jenkins 不也就干了這點兒事嗎姑裂?無非有個 web 界面蜓谋,大家可以一起用而已。
如何獲得 ssh
- win10 已經(jīng)自帶了 openssh炭分,但是默認可能沒有安裝
- 如果希望獲得更加完整的 Unix like 使用體驗,win10 用戶可以考慮 WSL2
- 如果你不喜歡 WSL2剑肯,又或者是一個頑固的 Win7 支持者捧毛,可以考慮 cmder、ConEmu 等第三方的終端模擬器
- 甚至是 git-bash 也是可以的让网。
不同方式安裝的 ssh呀忧,其配置文件的路徑可能不大一樣。
總結(jié)
圖形化的軟件可以讓你相對容易上手溃睹,如果只是簡單用用而账,是非常好的選擇。
但是這些軟件同時也限制了你的想象力因篇。高級的事情做不了泞辐,自動化的事情做不了笔横。你現(xiàn)在用 xshell,明天不能用了怎么辦咐吼,或者又出了個更牛的 xxxxshell吹缔,你是不是要重新學(xué)習(xí)一下呢?但是命令行不一樣锯茄,除非你有一天不需要和服務(wù)器打交道了厢塘,我保證在你有限的生命里,ssh 命令會一直在那里肌幽,他的行為不會改變晚碾,配置方式不會改變,你也不需要重新學(xué)習(xí)喂急。
附錄
最后格嘁,給一個相對完整的配置文件示例:
# 全局配置
Host *
ControlPath /tmp/ssh.%h:%p.%r
ControlMaster auto
ControlPersist yes
UserKnownHostsFile /dev/null
GlobalKnownHostsFile /dev/null
StrictHostKeyChecking no
AddKeysToAgent yes
PubkeyAcceptedKeyTypes +ssh-dss
ForwardAgent yes
# 保持連接
TCPKeepAlive yes
#ServerAliveCountMax 300
ServerAliveInterval 30
ForwardX11 yes
ForwardX11Trusted yes
CheckHostIP no
Compression yes
IPQos lowdelay
LogLevel QUIET
# server group 1
Host sg1.*
IdentityFile ~/.ssh/zkzy
user root
Host sg1.172.16.103.11
port 5811
hostname 192.168.80.100
Host sg1.172.16.103.* !sg1.172.16.103.11
ProxyJump sg1.172.16.103.11
Host sg1.172.16.103.12
Hostname 172.16.103.12
Host sg1.172.16.103.13
Hostname 172.16.103.13