2011年12月16日金曜日

screenをやめてtmuxへ

どうも、俺@残業中です。

流行りモノの好きな俺はscreenをやめてtmuxへ移行することにしました。
とは言うものの、もうだいぶ前からある仮想端末ソフトみたいですが、、^^;

色んなブログを参考にしましたが、結局インストールして使ってみて、screenとtmuxとで大きな差がある感じはしません。
何よりも重宝されるdetach&attachが両方備わってる訳ですし。
tmuxだけで言うと
・コピペのバッファを複数利用できる
・画面分割がしやすい(paneという。縦横関わらず)
・動作が軽い(メモリ消費も少ないらしい)
・旬なやつ
というメリットがあります。

ではインストール、設定めもめもです。
※僕の端末はMac OSX(lion)ですので、Mac用のインストールメモも含まれてます。

まずMacな人はXcodeをインストールします。
http://developer.apple.com/xcode/
を参考に、インストール方法については省略します。

次にMacPortsをインストールします。これはMacなエンジニアにとっては結構便利なツールです。
http://www.macports.org/index.php
から自分の環境に合ったパッケージファイルをDLし、そのdmgファイルを実行して下さい。
僕はMacPorts-2-1.0.3-10.7-Lion.dmgを落としました。
あとはインストーラに従うだけです。
インストールが完了したら、ターミナルで環境設定を編集します。
僕はzshを使っているので

$ vim ~/.zshrc
--------------------------
export PATH=/opt/local/bin:/opt/local/sbin:$PATH
export MATHPATH=/opt/local/man:$MANPATH
とします。bashの人も同じですね。
設定を読み込みます。

$ source ~/.zshrc
次に設定ができたか確認します。

$ port version
Version: 2.0.3
OKです。
まずは使う前に更新を確認します。

$ sudo port selfupdate
勝手に更新してくれます。

では早速tmuxをインストールしましょう!

$ sudo port install tmux
これで勝手にインストールしてくれます。yumみたいなもんですね。
インストールが終わったら

$ tmux
と打つだけで仮想端末が立ち上がり、まるでscreenのように!!
screenと同じく
$ exit
で終了します。


$ tmux list-session
でセッション一覧が見れます。平たくdetach、attachされた端末のことです。セッション番号:ウィンドウ数や起動日時が表示されます。
セッション番号を参考にし
$ tmux attach -t セッション番号
でアタッチできます。

tmuxはデフォルトでCtrl-bがプレフィックスになっているので、何かコマンドを打つ場合はまずCtrl-bを打つことが基本です。※もちろん設定で変えられますが、僕は基本に忠実にやってます!
tmuxを起動してからは、screenと同様にウインドウ分割(pane)やコピーモードへ移行、windowの生成など色々できます。

Ctrl-b ? ショートカット一覧
Ctrl-b d デタッチ
Ctrl-b w ウィンドウ一覧
Ctrl-b c ウィンドウ生成
Ctrl-b n 次のウィンドウへ
Ctrl-b p 前のウィンドウへ
Ctrl-b : コマンドモードへ
Ctrl-b [ コピーモード開始
Ctrl-b Ctrl-Space コピーモードでのコピー開始
Ctrl-b ESC-w コピーモードでのコピー終了
Ctrl-b ] コピーデータの貼付け
Ctrl-b q ペインのインジケータ(番号?)を表示
Ctrl-b t 時計表示(いらんw)
Ctrl-b % ウインドウを左右ペインへ分割
Ctrl-b " ウインドウを上下ペインへ分割
Ctrl-b o アクティブなペインの移動(次のペインへ移動)
Ctrl-b x ペインの破棄
Ctrl-b Space ペインレイアウトの変更(左右、上下)
Ctrl-b : resize-pane -U 数字 上部ペインのサイズ変更
Ctrl-b : resize-pane -D 数字 下部ペインのサイズ変更
Ctrl-b : resize-pane -L 数字 左ペインのサイズ変更
Ctrl-b : resize-pane -R 数字 右ペインのサイズ変更
メインで使うコマンドはこのくらいでしょうか。
あとは~/.tmux.confを編集して使いやすくします。


$ vim ~/.tmux.conf
--------------------------------
# コピーモードのキーバインドをviのように
# Spaceでコピー開始、Enterでコピー終了になります
set-window-option -g mode-keys vi

# 縦分割、横分割をviのキーバインドのように
bind s split-window -v
bind v split-window -h

# 分割画面への移動をviのキーバインドのように
bind h select-pane -L
bind j select-pane -D
bind k select-pane -U
bind l select-pane -R
僕はこんな感じにしました。
tmuxを使ってみる-なんでもつくるとか参考になります。


さぁ、これで快適なtmuxライフを送れますね!

以上でぇぇえぇす。


2011年12月9日金曜日

sshを公開鍵認証にする(複数ホスト対応)

どうも、俺@仕事中です。忙しいです><

社内でもssh管理は「鍵認証にしよう!」ということで、今日はその対応方法についてめもです。
パスワード接続だとちょっと不安ですしね。

まずはサーバ上でnew_userというログインユーザを作ります。(既存のもので対応する場合は必要なし)
<サーバ>
# useradd -d /home/new_user -s /bin/zsh -g goup_name new_user


次にOPEN-SSLで鍵ファイルを作成します。公開鍵はサーバ上に、秘密鍵はクライアントに置きます。
作成する場所はどちらでも構いませんが、分かりやすいので今回はクライアント側で作ることにします。
<クライアント>
$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/username/.ssh/id_rsa):
そのままEnterでも良いが、複数ホストに対応する場合はファイル名を変えたほうが良いので今回は「id_rsa.hostA」と打ちます。
Enter passphrase (empty for no passphrase):
パスフレーズを入力(必要ない場合はそのままEnter)
Enter same passphrase again:
再度パスフレーズ入力
これでファイルが2つ生成されるはずです。
・id_rsa.hostA 秘密鍵。クライアントの.ssh以下へ置く。
・id_rsa.hostA.pub 公開鍵。サーバの.ssh以下へ置く。

では公開鍵をサーバへFTPなどで持って行き、該当のユーザ(この例ではnew_user)の.sshディレクトリ以下へ保存しておきます。説明は省略。
またその内容をauthorized_keysファイルへ追記します。
<サーバ>
$ cat id_rsa.hostA.pub >> ~/.ssh/authorized_keys
とりあえずここでSSHの鍵認証が可能です。
あとはセキュリティのため、サーバのsshd_configの設定を変更し、パスワードによるログインができなくしましょう。
<サーバ>
# cd /etc/ssh
# cp sshd_config sshd_config.bak // バックアップを取る
# vim /etc/ssh/sshd_config
---------------------------------
# 以下3つはコメントアウトのままでもデフォルトで問題ない
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
# noに変更する!
PasswordAuthentication no
これでOK。
設定を反映させます。
<サーバ>
# /etc/init.d/sshd restart
これでパスワードによるログインはできなくなり、公開鍵でのログインができるようになりました。

ちなみに接続方法は
<クライアント>
$ ssh new_user@hostA -i ~/.ssh/id_rsa.hostA
になります。鍵ファイルにパスフレーズを設定している場合は、入力を求められます。

ただしこの方法だと、管理する複数のホストで鍵認証する場合、都度「-i オプション」で鍵ファイルを明示的に指定しなければいけません。面倒です。
なので.ssh/configに設定を書いておき、楽しちゃいましょう。

<クライアント>
$ vim ~/.ssh/config
---------------------------------
Host serverA
  # HostNameはドメインまたはIPアドレス
  HostName hostA.com
  Port 22
  User new_user
  IdentityFile ~/.ssh/id_rsa.hostA

Host serverB
  HostName hostB.com
  Port 22
  User foo_user
  IdentityFile ~/.ssh/id_rsa.hostB

Host serverC
  HostName xxx.xxx.xxx.xxx
  Port 22
  User bar_user
  IdentityFile ~/.ssh/id_rsa.hostC
こんな感じです。
これであれば、例えばhostB.comへ接続する場合
<クライアント>

$ ssh serverB
と打つだけで、
・hostB.comへ
・foo_userで
・22番ポートで
・~/.ssh/id_rsa.hostBの秘密鍵を使って
接続を試みてくれます。

楽チンですねーー!以上でぇぇぇええぇす。

2011年12月1日木曜日

WebSocketも対応したリバースプロキシ!

どうも、俺@仕事中です。

どうしてもリバースプロキシ経由でNode.jsを動かしたかったのですが、ApacheやNginxだとWebSocket
をリバースプロキシしてくれない!
という訳で、解決策を探してたら簡単に見つかりました。
node-http-proxy https://github.com/nodejitsu/node-http-proxy

使い方もいたってシンプル。
インストール
$ npm install http-proxy

ソースを書く
$ vim /path/to/app.js

------------------------------
var proxy = require('http-proxy');
proxy.createServer({
  router: {
    'myserver.com': 'toserver.jp:8088'
  }
}).listen(3033);
myserver.comの3033番ポートで動くNodeプログラムです。

起動させる
$ node app.js

接続確認する
$ telnet myserver.com 3033

これでtoserver.jpの8088番ポートへ通信しにいってくれます。
もちろんWebSocketもOK!


以上デェぇぇエス。