SSH有很多非常酷的特性,如何它是你每天的工作伴侶,那麼我想你有必要瞭解以下16條高效使用SSH的秘籍,它們幫你節省的時間肯定會遠遠大於你用來配置它們的時間。
1. 多條串連共用
如果你需要在多個視窗中開啟到同一個伺服器的串連,而不想每次都輸入使用者名稱,密碼,或是等待串連建立,那麼你可以配置SSH的串連共用選項,在本地開啟你的SSH設定檔,通常它們位於~/.ssh/config,然後添加下面2行:
ControlMaster autoControlPath /tmp/ssh_mux_%h_%p_%r
現在試試斷開你與伺服器的串連,並建立一條新串連,然後開啟一個新視窗,再建立一條串連,你會發現,第二條串連幾乎是在瞬間就建立好了。
Windows使用者
如果你是Windows使用者,很不幸,最流行的開源SSH用戶端Putty並不支援這個特性,但是Windows上也有OpenSSH的實現,比如這個Copssh,如果你覺得下面的一些技巧對你很有協助,或許你應該試試Copssh。
檔案傳輸
串連共用不止可以協助你共用多個SSH串連,如果你需要通過SFTP與伺服器傳輸檔案,你會發現,它們使用的依然是同一條串連,如果你使用的Bash,你會發現,你甚至SSH甚至支援Tab對伺服器端檔案進行自動補全,共用串連選項對於那些需要藉助SSH的工具,比如rsync,git等等也同樣有效。
2. 長串連
如果你發現自己每條需要串連同一個伺服器無數次,那麼長串連選項就是為你準備的:
ControlPersist 4h
現在你每次通過SSH與伺服器建立串連之後,這條串連將被保持4個小時,即使在你退出伺服器之後,這條串連依然可以重用,因此,在你下一次(4小時之內)登入伺服器時,你會發現串連以閃電般的速度建立完成,這個選項對於通過scp拷貝多個檔案提速尤其明顯,因為你不在需要為每個檔案做單獨的認證了。
3. 別再輸入密碼
如果你還在通過密碼方式登入SSH,那麼你或許應該試試SSH Keys,首先使用OpenSSH為自己聲稱一對密鑰:
$ ssh-keygen
跟隨指示,完成之後,你應該可以在你的.ssh目錄下看到兩個檔案,id_rsa就是你的私密金鑰,而id_ras.pub則是你的公開金鑰,現在你需要將你的公開金鑰拷貝到伺服器上,如果你的系統有ssh-copy-id命令,拷貝會很簡單:
$ ssh-copy-id smylers@compo.example.org
否則,你需要手動將你的私密金鑰拷貝的伺服器上的~/.ssh/authorized_keys檔案中:
$ < ~/.ssh/id_rsa.pub ssh clegg.example.org ‘mkdir -p .ssh; cat >> .ssh/authorized_keys; chmod go-w .ssh .ssh/authorized_keys’
現在試試重新串連到SSH伺服器,或是拷貝檔案,是不是已經不需要再輸入密碼了?
為Putty配置SSH Key
Putty也可以使用SSH Key,從Putty網站下載PuttyGen和Pageant,然後使用PuttyGen產生你的密鑰,將公開金鑰拷貝到伺服器的’.ssh/authorized_keys’目錄,然後運行Pageant,匯入你的私密金鑰,讓它在後台運行,險隘你就可以使用Putty通過公開金鑰直接登入伺服器了,你可以在Putty手冊的第8,9章瞭解關於這一特性的詳細介紹。
4. 串連中轉
有時候你可能需要從一個伺服器串連另外一個伺服器,比如在兩個伺服器之間直接傳輸資料,而不用通過本地電腦中轉:
www1 $ scp -pr templates www2:$PWD
(順便說一下,當你需要在兩台伺服器間拷貝檔案時,$PWD變數時非常有用的),因為即使你已經在兩台伺服器上添加了你本地電腦的公開金鑰,scp預設仍然會提示你輸入密碼:這是因為你用來作為跳板的那台伺服器上並沒有你的私密金鑰,所以,第二胎伺服器會拒絕你的公開金鑰,但是一定不要通過將你的私密金鑰拷貝到代理服務器上來解決這個問題,你可以使用agent forwarding來解決這個問題,只要在你的.ssh/config檔案中加入下面這行代碼就可以了:
ForwardAgent yes
或者是在Putty中勾上“Allow agent forwarding”選項,現在你的本地SSH就變成了第一台伺服器的SSH代理,從第一台伺服器在串連其它伺服器就變和和在你本地一樣簡單,注意,如果要開啟這個選項,前提是這個中間伺服器值得你信任。
5. 省略主機名稱
輸入伺服器的完整主機名稱來建立一個新的SSH串連實在是太乏味無聊了,尤其是當你有一組擁有相同網域名稱但是子網域名稱不同的伺服器需要管理時,比如下面這樣:
* www1.example.com* www2.example.com* mail.example.com* intranet.internal.example.com* backup.internal.example.com* dev.internal.example.com
或許你的網路已經配置了可以直接使用短網域名稱,比如intranet,但是如果你的網路不支援,實際上你可以自己搞定這個問題,而不用求助網路系統管理員。
解決辦法根據你用的作業系統而略有差異,下面是我的Ubuntu系統的配置:
prepend domain-search “internal.example.com”, “example.com”;
然後你需要重啟網路:$ sudo restart network-manager
不同的系統,這兩條命令可能會略有差異。
5. 主機別名
你也可以在你的SSH配置中直接定義主機別名,就像下面這樣:
Host devHostName dev.internal.example.com
你還可以使用萬用字元來進行分組:
Host dev intranet backupHostName %h.internal.example.comHost www* mailHostName %h.example.com
在Putty中你可以為每個主機名稱儲存單獨的session,然後雙擊建立串連(但是它可能沒辦法支援萬用字元)。
7. 省去使用者名稱
如果你在遠程伺服器上的使用者名稱和你本地的使用者名稱不同,你同樣可以在SSH配置中進行設定:
Host www* mailHostName %h.example.comUser simon
現在就算我的本機使用者名是 smylers,我仍然可以這樣串連我的伺服器:
$ ssh www2
SSH會使用simon賬戶串連你的伺服器,同樣,Putty可以儲存這個資訊在你的session中。
8. 在伺服器間跳轉
有些時候,你可能沒法直接連接到某台伺服器,而需要使用一台中間伺服器進行中轉,這個過程也可以自動化。首先確保你已經為伺服器配置了公開金鑰訪問,並開啟了agent forwarding,現在你就可以通過2條命令來串連目標伺服器,不會有任何提示輸入:
$ ssh gatewaygateway $ ssh db
然後在你的本地SSH配置中,添加下面這條配置:
Host dbHostName db.internal.example.comProxyCommand ssh gateway netcat -q 600 %h %p
現在你就可以通過一條命令來直接連接目標伺服器了:
$ ssh db
這裡你可能會需要等待長一點的時間,因為SSH需要進行兩次認證,,注意netcat也有可能被寫成nc或者ncat或者前面還需要加上g,你需要檢查你的中間伺服器來確定實際的參數。