0%

Some SSH tips i learns

文章大綱

本章節主要介紹 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
2
3
4
5
6
7
8
9
Host target-a
Hostname 192.168.1.1
User userA
IdentityFile ~/.ssh/a.pem

Host target-b
Hostname 192.168.1.2
User userB
IdentityFile ~/.ssh/b.pem

用了以上設定,你就能夠在 直接指定 Host 來進行連線。並會幫你使用不同的 Username 跟 Key file

1
2
3
4
ssh target-a "whoami"
# userA
ssh target-b "whoami"
# userB

設定無縫接合,與跳板設定

假設,每個 ssh server 的登入帳號跟Port等狀況都不同時。此時 configure file 就是你最大的助手。只要你是透過 ssh 協定在走,記住 Host 是可以直接當作位置來使用的

1
ssh -J target-a target-b

這種就是基本運用,你可以以此類推嘗試看看

但假使,我們連上面這種狀況都想省略的話。可以參考以下設定

1
2
3
4
5
Host target-c
Hostname 192.168.1.2
User userB
IdentityFile ~/.ssh/b.pem
Proxyjump target-a

之後你就可以直接使用以下命令,來達到一樣的效果

1
2
# same as `ssh -J target-a target-b`
ssh target-c

自動打開逆向代理的設定

此外,也能夠在連線特定主機的時候,就進行代理
使用 LocaForward 可以連線時自動進行代理

1
LocalForward 5900 localhost:5900

其他的 Config 設定

使用 ServerAliveInterval 可以確定連線時不被中斷
並起使用 StrictHostKeyChecking 可以使金鑰不用重複確認

1
2
3
Host *
StrictHostKeyChecking no
ServerAliveInterval 60

善用 * 可以減少無謂的設定

1
2
3
4
5
6
7
8
9
10
11
12
13
14
Host bastion-fasterdev
Hostname bastion.fasterdev.xrex.works
User wacker
IdentityFile ~/.ssh/self.pem

Host fasterdev-*
User ec2-user
IdentityFile ~/.ssh/fasterdev.pem
ProxyCommand ssh -q -W %h:%p bastion-fasterdev

Host 11.0.*
User ec2-user
IdentityFile ~/.ssh/fasterdev.pem
ProxyCommand ssh -q -W %h:%p