文章大綱
本章節主要介紹 ssh 是什麼樣的工具,並且可以操作到哪些
並且還有哪些特殊的應用法
最先從,基礎使用開始著手。之後配合 shell 進行匹量操作
最後一些相關設定與逆向代理技術。
從基礎的 ssh key 開始建立
首要,你要先理解所有 ssh 都是以 key 去進行驗證的
故此你必須先學會建立自己的 key
1 | ssh-keygen -t rsa -b 4096 -f key_name |
完成建立自己的 key 之後,
並且你也可以藉由 command 來將 ssh key 傳遞的對面
1 | ssh-copy-id -i key_name target_node |
實務操作
實務操作上可以分成幾個部分來進行
純粹的 SSH 連線
最基本的連結方式,是直接連結指定的伺服器
並且 -p 可以選用,是否要指定 port 號
1 | ssh a-host [-p port] |
透過 ssh 執行 commnad 或是作為 pipe 使用
基本的連線過去操作,也可以使用遠端操作的應用
只要你有基本的 bash pipe 觀念,那麼他們就可以串接在一起
1 | ssh a-host "cat a.file" | grep "error" |
以上範例,就是你在 a-host
中使用 cat a.file
的指令,並在本地進行 grep error
的動作。
當你開始理解這個操作的價值後,其實就可以透過簡易的 bash script 來達成控制多台主機的功能了。如以下例子
1 | (for name in build site; do echo $name; ssh $name "echo $name hi"; done) | grep "hi" |
這是個簡單透過 for
迴圈組成對應不同 host 的 echo $name hi
指令。
設想一下不同應用的可能性。可以讓你在多個主機中進行非常多樣化的操作
把 ssh 當作一種代理 Port 使用
還有一種用法可以透過 -L
跟 -R
實現正/逆向代理
假設你需要連結到特定伺服器的 mysql ,你就可以使用以下來進行操作
1 | ssh -L 13306:localhost:3306 target |
這部份會將本地的 3306
接到對方 3306
上。如此以來,你只需要本地執行 mysql cli 也等同於連上去執行 mysql cli
1 | mysql -h 127.0.0.1 -P 13306 |
而假設有個相反的情境,如果你需要讓對方的 port 8080
直接連結到你的本地18080
?
其實就可以直接使用以下的方式
1 | ssh -R 8080:localhost:18080 target |
其實 -L
跟 -R
的邏輯非常相似,其實就是 你需要的Port:目標位置:目標Port
而,其實這個 目標位置
都是以即將被代理的那方來做目標,變向來講其實也能以此方式來進行代理。不過下面講個更常見的代理應用
跳板機的應用
可以使用 -J
進行跳板的應用
1 | ssh -J jump target |
這情境最適用於想透過 jump
來當跳板,然後再進行一次 ssh 連線到 target
使用 Config 進行設定
使用者除了可以設定自己的 ssh key 之外,
可以透過 .ssh/config
設定更多的縮寫來便利你的操作
1 | Host target-a |
用了以上設定,你就能夠在 直接指定 Host 來進行連線。並會幫你使用不同的 Username 跟 Key file
1 | ssh target-a "whoami" |
設定無縫接合,與跳板設定
假設,每個 ssh server 的登入帳號跟Port等狀況都不同時。此時 configure file 就是你最大的助手。只要你是透過 ssh 協定在走,記住 Host 是可以直接當作位置來使用的
1 | ssh -J target-a target-b |
這種就是基本運用,你可以以此類推嘗試看看
但假使,我們連上面這種狀況都想省略的話。可以參考以下設定
1 | Host target-c |
之後你就可以直接使用以下命令,來達到一樣的效果
1 | # same as `ssh -J target-a target-b` |
自動打開逆向代理的設定
此外,也能夠在連線特定主機的時候,就進行代理
使用 LocaForward
可以連線時自動進行代理
1 | LocalForward 5900 localhost:5900 |
其他的 Config 設定
使用 ServerAliveInterval
可以確定連線時不被中斷
並起使用 StrictHostKeyChecking
可以使金鑰不用重複確認
1 | Host * |
善用 *
可以減少無謂的設定
1 | Host bastion-fasterdev |