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には、これ以外にも様々な機能がありますので、これを機にターミナル環境を超快適にして、作業を爆速化させてみてはいかがでしょうか。