綺麗に死ぬITエンジニア

macOSとzsh(Prezto)で快適なSSHクライアント環境を作る

2017-01-24

Windowsでは、SSHでリモートのサーバーに接続する際、「Tera Term」等のSSHクライアントアプリケーションをインストールして利用するかと思います。

ですが、macOSの場合はUNIXなので、アプリケーション等のインストール不要で、ターミナルからsshコマンドで接続することができます。そのままscpコマンド等でファイルを簡単にダウンロードすることもでき、非常に便利なのですが、初期状態だといちいちサーバーの接続情報を入力したり、秘密鍵のパスを指定したりするのが面倒だったりします。

そこで今回は、高機能シェル「zsh」と、zshの設定ファイル群である「Prezto」を用いて、快適にSSHが利用できる環境を構築する方法を紹介します。

~/.ssh/configの設定

まず、zshがなくてもできることとして、~/.ssh/configの設定があります。

複数のリモートサーバーを管理できるSSHデフォルトの機能で、普段のSSHコマンドの利用を簡素化させてくれます。

通常、sshコマンドは以下のように利用します。

ssh ユーザー名@ホスト名 -i 秘密鍵のパス -p ポート番号

ここで、以下のような~/.ssh/configを用意します。

Host 任意の接続名
    HostName ホスト名
    User ユーザー名
    Port ポート番号
    IdentityFile 秘密鍵のパス

すると、

ssh 任意の接続名

で、サーバーに接続できるようになります。

つまり、

ssh my-user@mail.example.com -i ~/.ssh/mail-server.key
ssh www-user@www.example.com -i ~/.ssh/www-server.key -p 10022

が、

Host mail
    HostName mail.example.com
    User my-user
    IdentityFile ~/.ssh/mail-server.key
Host www
    HostName www.example.com
    User www-user
    Port 10022
    IdentityFile ~/.ssh/www-server.key

と記述された~/.ssh/configを設置すると、

ssh mail
ssh www

で接続できるようになります。

普段、様々なサーバーへSSHする方にとっては、必須の機能かと思います。

まずは、普段使うサーバーの接続情報を、~/.ssh/configへ記述しましょう。

Preztoのインストール

macOSにはデフォルトでzshがインストールされていますので、改めてzshをインストールする必要はありません。(最新版を利用したい方は、brewコマンド等でインストールしてください。)

なので、早速Preztoをインストールしていきます。

まず、ターミナルを開き、シェルをzshに変更します。

zsh

Preztoを取得します。

git clone --recursive https://github.com/sorin-ionescu/prezto.git "${ZDOTDIR:-$HOME}/.zprezto"

取得した設定ファイルのリンクを設置します。

setopt EXTENDED_GLOB
for rcfile in "${ZDOTDIR:-$HOME}"/.zprezto/runcoms/^README.md(.N); do
  ln -s "$rcfile" "${ZDOTDIR:-$HOME}/.${rcfile:t}"
done

zshをデフォルトで利用するシェルに変更します。

chsh -s /bin/zsh

以上で、zsh及びPreztoがインストールされます。一度ターミナルを開き直してみてください。正しくインストールされていれば、見た目が変わっているかと思います。

sshコマンドの利用

これで準備は完了です。あとは利用するのみです。

ssh[スペース][タブキー]と入力することで、sshコマンドの補完機能が動作するようになります。

~ ❯❯❯ ssh 
 -- login name --
root                                      user                      
 -- domain --
mail.example.com                          www.example.com                         
 -- host --
mail                                      www
 -- ip address --
xxx.xxx.xxx.x        xxx.xxx.xx.x         xxx.xx.xxx.xxx       xx.xxx.xx.xxx      

上記のように、今まで接続したことのあるサーバーや、~/.ssh/configに記述してあるサーバーが一覧で表示され、さらにタブキーを連打することで、選択することができます。

もちろん、ssh ma[タブキー]のように、ホストが確定されるところでタブキーを押すと、ssh mailといったように補完してくれます。

一覧で表示してくれるようになると、「あれ、あのサーバーのホスト名なんだっけ?」となった時にもいちいち確認する手間が省けるので、非常に快適になります。

scpコマンドの利用

sshコマンドのみならず、scpコマンドも快適に利用できるようになります。個人的にはこちらの方がよく使います。

scpは、sshを利用してセキュアにファイルをダウンロード/アップロードするコマンドです。

以下のように利用します。

scp コピー元ファイルパス コピー先パス

コピー元ファイルパスやコピー先パスの指定は、ローカルの場合はそのままパスで記述します。リモートサーバーの場合は、ホスト名:パスという形式で記述します。

例えば、ローカルの~/Documents/index.htmlを先ほど設定したホストwww/var/www/htmlへアップロードしたい場合は以下のようにします。

scp ~/Documents/index.html www:/var/www/html

コマンド自体は簡単ですが、通常のシェルを利用していると、アップロード先のディレクトリ構成や、本当に/var/www/htmlディレクトリが存在しているか等を確認する手間が発生します。

しかし、zsh及びPreztoを導入したことで、これも補完できるようになります。上のコマンドでいうところの/var/www/htmlの部分も補完できるということです。

実際にscp ~/Documents/index.html www:/var/[タブキー]と入力すると、以下のようになります。

~ ❯❯❯ scp ~/Documents/index.html www:/var/
 -- remote file --
account/        games/          lock/           nis/            spool/                        
cache/          kerberos/       log/            opt/            tmp/                          
db/             lib/            mail/           preserve/       www/                          
empty/          local/          run/            yp/                           

そのパスの続きの候補を、実際のサーバーに接続して確認してくれるのです。ローカルのファイルを探すのと同じような感覚でリモートのファイルを探せるので、非常に捗ります。

まとめ

macOSのSSH関連の環境を整備することで、sshコマンドやscpコマンドの補完が効くようになり、効率的に作業ができるようになりました。

特にscpコマンドは、リモートのファイルの参照までできるようになるので、非常に便利です。私なんかはこれを利用するようになって以来、GUIのSFTPソフトを使う機会がゼロになりました。

今回紹介したPreztoには、これ以外にも様々な機能がありますので、これを機にターミナル環境を超快適にして、作業を爆速化させてみてはいかがでしょうか。

筆者について

「もりやませーた」として活動している、フリーランスエンジニアです。1992年生まれ、神奈川県在住、既婚。

筆者のTwitterはこちら。記事に関するご意見等はTwitterの方へお寄せください。

その他業務に関するお問い合わせは、こちらのページをご覧ください。

Linux Apple