之前會使用 Royle TSX 或者 ServerCat 來 SSH 連到伺服器上面管理

不過後來感覺這些軟體都有點重,但其實是我用不到這麼多功能就是了 😭

所以就改回 iTerm 這種獨立輕巧的 app 上面來用了,最近還看到有人推薦使用 GPU 加速的 WezTerm 又更讚啦!

不過用回這些終端 app 就少了一些我經常會用到的功能,其中一個就是快速打開某群組的多台伺服器

像是我會依照不同的客戶機器來做群組分類,A 客戶的群組裡面有三台伺服器,B 客戶的群組裡面有五台伺服器之類的

以前點兩下就能快速打開多個 tab 分別用不同 session 連上,就可以馬上在不同 tab 切換下開始工作

現在用 WezTerm 就算配好 SSH Config,也要一台一台自己手動連,原本想這樣將就將就就算了,但我就懶…

所以還是爬爬網路其他人作法,發現可以寫個簡單的 AppleScript 的指令來快速完成此功能 😬

首先伺服器多的話都會寫個 SSH Config 來管理,先不分類把每一台伺服器都寫進去再說

關於 SSH Config 的更多說明可以參考: https://chusiang.gitbooks.io/working-on-gnu-linux/content/20.ssh_config.html

我們下面弄個簡單範本,先新建一個檔案 ~/.ssh/config

# A1
Host            A1                   # 代號
Hostname        23.18.111.19         # IP or Domain name
Port            22                   # 指定埠口
User            loltt                # 使用者名稱
identityfile    ~/.ssh/id_rsa_a      # 指定金鑰

# A2
Host            A2                   # 代號
Hostname        19.18.11.35          # IP or Domain name
Port            9553                 # 指定埠口
User            loltt                # 使用者名稱
identityfile    ~/.ssh/id_rsa_a      # 指定金鑰

# A3
Host            A3                   # 代號
Hostname        39.38.51.51          # IP or Domain name
Port            8569                 # 指定埠口
User            loltt                # 使用者名稱
identityfile    ~/.ssh/id_rsa_a      # 指定金鑰

# B1
Host            B1                   # 代號
Hostname        1.8.11.25            # IP or Domain name
Port            22                   # 指定埠口
User            cat33                # 使用者名稱
identityfile    ~/.ssh/id_rsa_b      # 指定金鑰

# B2
Host            B2                   # 代號
Hostname        10.83.21.95          # IP or Domain name
Port            22                   # 指定埠口
User            cat33                # 使用者名稱
identityfile    ~/.ssh/id_rsa_b      # 指定金鑰

接著我們根據自己需求,這邊分類成兩組 A1、A2 跟 A3 一組,B1 跟 B2 一組

把 A 組的代號寫到 ~/.ssh/groupa,把 B 組代號寫到 ~/.ssh/groupb,如下所示,一行一個代號

以下為 groupa 的內容

A1
A2
A3

以下為 groupb 的內容

B1
B2

上述東西都準備好以後,我們就可以打開 macOS 裡面內建的工序指令編寫程式 app

然後把下面程式貼進去

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
launch application "iTerm"
tell application "iTerm"
	activate
	
	set Servers to paragraphs of (do shell script "/bin/cat $HOME/.ssh/groupa")
	set num_hosts to count of Servers
	set current_host to 1
	repeat with nextLine in Servers
		
		if length of nextLine is greater than 0 then	
			set server to "nextLine"
			tell application "iTerm"
				tell application "System Events"
					keystroke "ssh " & nextLine
					key code 36
					delay 0.1
				end tell
				
				delay 0.5
				
				if current_host < num_hosts then
					tell application "System Events"
						keystroke "t" using command down
					end tell
				end if
			end tell
		end if
		set current_host to current_host + 1
	end repeat
end tell

上面第 1、2、12 行中的 iTerm 可以改成你使用的 Terminal Emulator 名稱,例如你如果用 WezTerm 就改成 WezTerm

第 5 行的 groupa,就是剛剛新建的兩個群組檔案名稱,先存一個 groupa

然後保存再去新增一個新的工序指令,把第五行的檔案名稱改成 groupb 就可以

這樣操作以後你就會有兩個 .scpt 的檔案(如果你有更多伺服器群組,請自行如法炮製)

這兩個檔案你自己放在你覺得舒服的路徑即可(如 ~/.ssh/)

如上準備工作做完以後,以後在 iTerm 裡面時,只要使用下面指令就可以馬上打開你設定 A 群組裡面的三台伺服器

$ osascript ~/.ssh/groupa.scpt

腳本會先去讀取 groupa 裡面的伺服器別名,然後依序幫你使用 ssh 連線上去

開完一個之後就會按 command + t 幫你新開一個 tab,再繼續幫你 ssh 第二個伺服器上去

直到 groupa 裡面的東西通通打完為止 😬

另外如果你使用比較新版的 macOS 的話,因為腳本有使用模擬鍵盤輸入功能,所以第一次使用此腳本會跳出隱私授權

需要到系統偏好設定裡面的「隱私權與安全性」,找到「輔助使用」將你的 Terminal Emulator 加入允許清單才行

總體來說這方法看上去雖然很笨的土法煉鋼,但起碼也解決一個我就懶的問題 🫣