面向開發(fā)工程師的 ssh 技巧

你不需要一個圖形化的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与帆。

很煩對不對了赌,我們看看這些流程中有什么痛點:

  1. 每次連接都要輸入密碼,重開一個 session 也需要輸入密碼玄糟。煩勿她。
  2. 每次連接 db server 都要先連接 app server,然后再ssh 到 db server阵翎。煩逢并。
  3. 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
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市煮岁,隨后出現(xiàn)的幾起案子讥蔽,更是在濱河造成了極大的恐慌,老刑警劉巖画机,帶你破解...
    沈念sama閱讀 217,826評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件冶伞,死亡現(xiàn)場離奇詭異,居然都是意外死亡步氏,警方通過查閱死者的電腦和手機响禽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來荚醒,“玉大人芋类,你說我怎么就攤上這事〗绺螅” “怎么了侯繁?”我有些...
    開封第一講書人閱讀 164,234評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長泡躯。 經(jīng)常有香客問我贮竟,道長,這世上最難降的妖魔是什么较剃? 我笑而不...
    開封第一講書人閱讀 58,562評論 1 293
  • 正文 為了忘掉前任咕别,我火速辦了婚禮增拥,結(jié)果婚禮上移盆,老公的妹妹穿的比我還像新娘。我一直安慰自己凛虽,他們只是感情好啊送,可當我...
    茶點故事閱讀 67,611評論 6 392
  • 文/花漫 我一把揭開白布偿短。 她就那樣靜靜地躺著欣孤,像睡著了一般。 火紅的嫁衣襯著肌膚如雪翔冀。 梳的紋絲不亂的頭發(fā)上导街,一...
    開封第一講書人閱讀 51,482評論 1 302
  • 那天,我揣著相機與錄音纤子,去河邊找鬼搬瑰。 笑死,一個胖子當著我的面吹牛控硼,可吹牛的內(nèi)容都是我干的泽论。 我是一名探鬼主播,決...
    沈念sama閱讀 40,271評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼卡乾,長吁一口氣:“原來是場噩夢啊……” “哼翼悴!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起幔妨,我...
    開封第一講書人閱讀 39,166評論 0 276
  • 序言:老撾萬榮一對情侶失蹤鹦赎,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后误堡,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體古话,經(jīng)...
    沈念sama閱讀 45,608評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,814評論 3 336
  • 正文 我和宋清朗相戀三年锁施,在試婚紗的時候發(fā)現(xiàn)自己被綠了陪踩。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,926評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡悉抵,死狀恐怖肩狂,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情姥饰,我是刑警寧澤傻谁,帶...
    沈念sama閱讀 35,644評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站列粪,受9級特大地震影響栅螟,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜篱竭,卻給世界環(huán)境...
    茶點故事閱讀 41,249評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望步绸。 院中可真熱鬧掺逼,春花似錦、人聲如沸瓤介。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至氯质,卻和暖如春募舟,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背闻察。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評論 1 269
  • 我被黑心中介騙來泰國打工拱礁, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人辕漂。 一個月前我還...
    沈念sama閱讀 48,063評論 3 370
  • 正文 我出身青樓呢灶,卻偏偏與公主長得像,于是被迫代替她去往敵國和親钉嘹。 傳聞我的和親對象是個殘疾皇子鸯乃,可洞房花燭夜當晚...
    茶點故事閱讀 44,871評論 2 354

推薦閱讀更多精彩內(nèi)容