如何優雅的使用SSH

引子

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的好處是:

  1. 它是一個字符終端軟件,不需要任何GUI的支持,通用性更好
  2. 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

這里是oh my 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信任關系,從而免密碼登錄。

  1. 首先,在本地機器上使用ssh-keygen產生公鑰私鑰對
ssh-keygen

一路回車即可,會在~/.ssh目錄下生成公鑰私鑰對。此命令只需執行一次即可。

  1. 然后,用ssh-copy-id將公鑰復制到遠程機器中
ssh-copy-id -i demouser@192.168.1.1

按提示輸入一次密碼,ssh-copy-id就會自動將剛才生成的公鑰id_rsa.pub追加到遠程主機的~/.ssh/authorized_keys后面了,以后的 ssh 以及 sftp 連接,都不用輸入密碼了。

至此,我們只要輸入ssh demousersftp 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/

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容