引子
SSH連接是我們與服務器交互的主要手段,每個程序員每天都會用到,就像喝白開水一樣普通。
就是這樣一個簡單而又高頻的動作,如果配置得當,或許能極大的提高我們工作的幸福感吧。
前不久一個同事剛從Windows切換到macOS平臺,問我SecureCRT有沒有mac下的版本,我說即然都用上了基于BSD的mac了,應該不再需要SecureCRT這樣的東西了才對,SSH如果配置好了,體驗應該完爆Windows。于是就有了寫下這篇文章的念頭,填一下之前的坑。
選擇終端GUI工具
首先第一步是選擇一個好用的GUI工具,畢竟大多數人都是在DE下工作,極少人會喜歡工作在tty1這樣的文字介面下。
Windows平臺
Windows平臺下的工具比較多,下面撿幾個主要的來說一說優缺點:
- SecureCRT - 老牌的商業軟件,同時也提供Mac和Linux版本,功能強大,費用昂貴,但貌似身邊所有人都在用盜版,PASS
- Xshell - 有免費的License,但只允許非商業場景下使用,這個也PASS
- Putty - 好吧,只能是它了,免費,功能簡單,但是也足夠用了
- Cygwin - 差點把這個忘了,嚴格來說它并不僅僅是一個SSH工具,也值得推薦
macOS平臺
macOS平臺的終端工具比較好選,公認的只有iTerm2一個:
- 原生Terminal - 開箱即用,功能上也不過不失,但拋棄它,只是因為有更好的iTerm2。。。
- iTerm2 - 免費,支持眾多的自定義選項,可以完全替代原生Terminal,沒得選,就是它了
Ubuntu平臺
Ubuntu默認自帶一個gnome-terminal,雖然不像iTerm2那樣討喜,但勝在簡潔,個人認為是最優的選擇吧:
- Terminator - 支持窗口拆分,但界面丑,不能忍,PASS
- Guake - 支持下拉式的呼出,但界面更丑,PASS
- 原生Terminal - 界面簡潔,功能夠用,最終還是用回了它
iTerm2使用簡介
Putty和gnome-terminal的配置都比較簡單,記住幾個快捷鍵就可以了,macOS下的iTerm2配置和使用都要麻煩些,這里單獨拿出來寫一下。
配置呼出快捷鍵
使用Cmd+,
打開設置界面,切換到Keys
一欄
在左下方可以設置 呼出/隱藏 iTerm2的快捷鍵,這里我設置成了
Cmd+ESC
,瞬間呼出,比Alfred/Spotlight還要方便。另外還可以在Profile一欄中修改窗口為全屏+半透明,完美。
選中即復制
使用鼠標選中一段文字后,默認就已經復制到剪貼板了,直接用Cmd+V
粘帖即可。
Profile設置
使用Cmd+,
打開設置界面,切換到Profile
一欄
在這里可以配置遠程服務器的連接參數
配合sshpass這個命令,可以實現類似SecureCRT的Session管理的功能。
注意,sshpass直接使用明文保存密碼(SecureCRT是加密后存在本地),已經不推薦使用,下面會介紹一個更好的方式。
分屏
分屏功能相當好用,例如我們可以在屏幕左側查看日志,右側進行常規操作
Cmd+D
垂直分割
Cmd+Shift+D
水平分割
自動完成
輸入前幾個關鍵字后,按Cmd+;
,會有一個自動補全功能
命令歷史記錄
使用Cmd+shift+H
可以打開命令歷史記錄
使用Tmux窗口管理工具
GUI工具有了,我們還缺一個通用的窗口管理工具--Tmux。
Tmux是一個終端復用器,它可以激活多個終端或窗口, 還可以將屏幕水平或縱向切分成多個窗口。
類似于screen,它可以關閉窗口將程序放在后臺運行,需要的時候再重新連接。
其實iTerm2等GUI工具也可以實現類似的功能,但Tmux的好處是:
- 它是一個字符終端軟件,不需要任何GUI的支持,通用性更好
- tmux可以 保持多個會話 ,只要不關機,就可以隨時恢復Session
macOS下的安裝
brew install tmux
Ubuntu下的安裝
sudo apt-get install tmux
tmux的主要元素分為三層:
- Session 一組窗口的集合,通常用來概括同一個任務
- Window 單個可見窗口,和ITerm2中的Tab類似
- Pane 窗格,被劃分成小塊的窗口
tmux默認的前置操作是CTRL+b
。例如,我們想要新建一個窗體,就需要先在鍵盤上摁下CTRL+b,松開后再摁下n鍵。
下面所有的prefix
均代表CTRL+b
- 查看/切換session
prefix s
- 離開Session
prefix d
- 重命名當前Session
prefix $
- 新建窗口
prefix c
- 切換到上一個活動的窗口
prefix space
- 關閉一個窗口
prefix &
- 使用窗口號切換
prefix 窗口號
- 切換到下一個窗格
prefix o
- 查看所有窗格的編號
prefix q
- 垂直拆分出一個新窗格
prefix “
- 水平拆分出一個新窗格
prefix %
- 暫時把一個窗體放到最大
prefix z
使用oh my zsh
工具已經齊全,但攘外必先安內,在連接遠程服務器之前,我們先優化一下本機的Shell。
Linux系統中已經內置了幾種shell,一般默認的是bash
zsh比bash更加好用,且完全兼容bash,但它配置繁瑣。幸虧有了oh-my-zsh,讓zsh的配置難度大大降低。
首先安裝一下zsh,mac系統無需安裝,Ubuntu可以通過apt安裝
sudo apt install zsh
根據官網的介紹,安裝相當的簡單,只需要一行命令即可
$ sh -c "$(curl -fsSL https://raw.github.com/robbyrussell/oh-my-zsh/master/tools/install.sh)"
zsh的配置文件是~/.zshrc
,各項配置都有對應的注釋,非常清晰,在這里可以修改主題,其實默認的已經很好看了
以下是zsh的一些使用技巧,請盡量記住,因為都很常用:
- 連按兩次Tab會列出所有的補全列表并直接開始選擇,補全項可以使用 ctrl+n/p/f/b上下左右切換
- 命令選項補全。在zsh中只需要鍵入 tar -<tab> 就會列出所有的選項和幫助說明
- 命令參數補全。鍵入 kill <tab> 就會列出所有的進程名和對應的進程號
- 更智能的歷史命令。在用或者方向上鍵查找歷史命令時,zsh支持限制查找。比如,輸入ls,然后再按方向上鍵,則只會查找用過的ls命令。而此時使用則會仍然按之前的方式查找,忽略 ls
- 智能跳轉,安裝了 autojump 之后,zsh 會自動記錄你訪問過的目錄,通過
j 目錄名
可以直接進行目錄跳轉,而且目錄名支持模糊匹配和自動補全,例如你訪問過 hadoop-1.0.0 目錄,輸入j hado
即可正確跳轉。j --stat
可以看你的歷史路徑庫。 - 目錄瀏覽和跳轉:輸入
d
,即可列出你在這個會話里訪問的目錄列表,輸入列表前的序號,即可直接跳轉。 - 在當前目錄下輸入
..
或...
,或直接輸入當前目錄名都可以跳轉,你甚至不再需要輸入cd
命令了。在你知道路徑的情況下,比如 /usr/local/bin 你可以輸入cd /u/l/b
然后按進行補全快速輸入 - 通配符搜索:
ls -l **/*.sh
,可以遞歸顯示當前目錄下的 shell 文件,文件少時可以代替 find。使用**/
來遞歸搜索 - 擴展環境變量,輸入環境變量然后按 就可以轉換成表達的值
使用config記錄遠程連接
現在開始,我們再看一下如何連接遠程服務器。
如果要管理幾十臺至上百臺的主機,那么有沒有什么方法能實現類似SecureCRT中Session管理那樣的功能呢?
最簡單的是使用iTerm2中的profile功能,它可以配置多臺主機的連接,并可以使用tag進行歸類。
但這種方式首先太依賴于GUI工具,離開了iTerm2就完全用不了。
其次是通用性不夠好,配置文件不能跨平臺,我們辛辛苦苦在Mac上配好了一份主機清單,但回家扔到Ubuntu下就沒法用了。
有沒有一種更為通用的方法呢?答案是直接使用openssh自帶的config功能
配置文件的路徑是:~/.ssh/config
,如果不存在,可以新建一個
內容非常簡單
Host demohost
HostName 192.168.1.1
User username
Port 10022
第一行Host
后面,可以為這個連接起一個簡單的名字
后面幾行記得縮進,HostName
后面是IP地址,User
后面是用戶名,這兩項是必填的。如果端口不是標準的22,還可以用Port
指定端口。
配置好后,我們只需要輸入ssh demohost
,即可快速打開SSH連接了。
如果記不清連接名也沒有關系,利用zsh的自動補全功能,輸入ssh 關鍵字
,再按一下TAB
鍵,會列出所有包含關鍵字的連接,使用方向鍵選擇后,回車確認即可。
使用ssh-copy-id免密碼登錄
接著再看一下,如何實現免密碼登錄遠程主機。
之前我們提到過使用sshpass這個工具,可以直接將密碼寫進命令行中,從而實現非交互式的免密碼登錄
sshpass -p password ssh demouser@92.168.1.1
但這種方式使用明文保存密碼,非常不安全,不建議使用。
其實還有一種更好更直接的方式,那就是使用ssh-copy-id
建立ssh信任關系,從而免密碼登錄。
- 首先,在本地機器上使用ssh-keygen產生公鑰私鑰對
ssh-keygen
一路回車即可,會在~/.ssh
目錄下生成公鑰私鑰對。此命令只需執行一次即可。
- 然后,用ssh-copy-id將公鑰復制到遠程機器中
ssh-copy-id -i demouser@192.168.1.1
按提示輸入一次密碼,ssh-copy-id就會自動將剛才生成的公鑰id_rsa.pub
追加到遠程主機的~/.ssh/authorized_keys
后面了,以后的 ssh 以及 sftp 連接,都不用輸入密碼了。
至此,我們只要輸入ssh demouser
或sftp demouser
,回車,就可以直接登錄遠程主機了。
安利一個小工具
最后的最后,再介紹一個很惡搞,但相當有用的小工具,thefuck GitHub頁面
當我們敲錯了命令,比如忘記加sudo
時,只需要輸入fuck
并大力敲下回車,它就會非常智能的幫助我們更正了,非常有趣。
? apt-get install vim
E: Could not open lock file /var/lib/dpkg/lock - open (13: Permission denied)
E: Unable to lock the administration directory (/var/lib/dpkg/), are you root?
? fuck
sudo apt-get install vim [enter/↑/↓/ctrl+c]
[sudo] password for nvbn:
Reading package lists... Done
...
參考文檔
http://cenalulu.github.io/linux/tmux/
http://harttle.com/2015/11/06/tmux-startup.html
http://wulfric.me/2015/08/iterm2/
http://yijiebuyi.com/blog/e310fc437f32006eb6aa42cad1783587.html
http://wdxtub.com/2016/02/18/oh-my-zsh/