RLB

Just sharing knowledge

sshコマンドで手軽にログイン

前置き

1にssh、2にssh.... とりあえずリモートログインコマンドであるsshを実行する機会は非常に多いかと思います。 個人的にはインフラやバックエンド寄りの仕事が多いため、とにかく使用頻度が高い。 それを簡単に手軽にログインできる方法をまとめてみました。

つい最近lvsを組むことがあったので、以下を具体例として解説します。

hostname : lvs
対象DIR  : /etc/keepalived
接続先IP : 192.168.1.123
username : rksz

1. 公開鍵でsshパスワードなしログイン

まずは定番テクニック。 接続元ローカルマシンで以下のコマンドを発行して、全部Enterしておきましょう。

$ ssh-keygen

すると~/.ssh配下に以下のようはファイルができるはず

Ricky@localhost $ ll ~/.ssh
-rw-------  1 Ricky  staff  1675  6 29  2008 id_rsa
-rw-r--r--  1 Ricky  staff   401  6 29  2008 id_rsa.pub

中身はハッシュ文字列とhosts名などが記載されています。 id_rsa.pubに書かれている内容を接続したいサーバのknown_hostsに登録しましょう。

ローカルPC

$ scp id_rsa.pub rksz@192.168.101.1:/var/tmp

リモート先(rksz@192.168.101.1)

$ cat /var/tmp/id_rsa.pub >>~/.ssh/authorized_keys

~/.ssh/authorized_keysがない場合は、ディレクトリ含めて自分で作成します。(ssh-keyegenコマンドを発行すると.sshフォルダが出来るので良いとおもいます) あと、authorized_keysファイルのパーミッションは必ず600に設定します。

こうすれば、公開鍵を登録した先のマシンに対して晴れてパスワードなしログインができます。

$ ssh rksz@192.168.101.1

余談: いちいち鍵の設定するのが、面倒なあなたに朗報です。FreeBSD系, Fedora系(CentOSなど)※追加訂正(2013/05/17)ではssh-copy-idコマンドが用意されてるので、活用しちゃいましょう。

ssh-copy-id -i ~/.ssh/id_rsa.pub rksz@192.168.1.123

これで勝手にauthorized_keysの末尾に自分のpubkeyを追加してくれます。

まぁ特に上のコマンドが無ければ普通に以下でも実は可能です。

$ cat ~/.ssh/id_rsa.pub | ssh rksz@192.168.1.123 'cat >>~/.ssh/authorized_keys'

2. ssh configを活用

こちらを利用することで、host名を省略することができます。

$ ~/.ssh/config

その中に以下のファイルを作りましょう

Host p.123 p.lvs
  HostName 192.168.1.123
  User rksz
  Port 22

これでsshに絡むコマンドの際は以下だけで接続出来ます。

ssh p.lvs
ssh p.123

個人的に、Host名の所はp.s.などで統一しています。理由としてproductionサーバとstagingサーバを明確に区別するためです。p.(IPの末尾)やp.(HOSTNAME)という風にして追加しています。

3. zsh/bashのaliasを活用

基本的には上のssh configでも結構便利ですが、よく接続するサーバには"ssh ~"とコマンド打つこと自体無駄だと思いますので、bash aliasでショートカットを設定しましょう。

~/.bashrcに以下を追加します。

alias 'lvs'='ssh root@192.168.1.123'

こうすることで、lvsと文字を叩きこむだけで、sshコマンドが実行可能になります。 鍵を設定しておけば、それだけでログイン可能です。

私はログイン先で256系TERMが使えるところは利用したいとおもってるので、以下までalias設定しています。

alias 'lvs'='TERM=xterm-256color ssh root@192.168.1.123'

これでlvsと文字を打てば、自動でカラフルな接続先の誕生です!

もちろんここのalias指定の所で(2)で実施したssh aliasの設定も利用可能です。ただし、個人的にはconfig同士の結合度が高まってしまうため、独立して取り扱うようにしています。

4. sshしたあとにcdまで同時にやる

実際それぞれのサーバに対する用途って決まっていたりします。 dbであれば、/var/lib/mysql行きたかったりなど。 毎回ssh終わったあとにcdするのは無駄なので、これも勿論組み込んでしまいましょう。

.zshrcか.bashrcに以下のaliasを設定します。

alias 'lvs'='ssh root@192.168.1.123 -t "cd /etc/keepalived; bash --login"'

cdコマンドを発行した結果をbashでログインシェルとして利用しています。その結果を擬似端末(pseudo tty)利用できるようにsshの-tオプションを付加します。 tオプションを付けないと、ログインはしてるけど端末が割り当てられていない暗闇ダンジョン状態になるので、ヒマな時のみにしておきましょう。

5. mobile-shellを利用する

テスト環境などではmobile-shellもよくつかってます。かなり便利です。sshの代わりにmoshと打ってサーバに接続します。

#接続先サーバとローカルの両方にインストール
yum -y install mosh

「ローミングができる」「接続が切れても平気」「高速なローカルエコー」といった割りと至れりつくせりです。moshに関してはUDPのport60000周辺が必要なので、共用サーバに勝手にインストール・・・という訳にはいきませんが、自分の環境であれば全部入れてしまってよいと思います。ターミナルもデフォルトで地味に256color対応になっていたりと、ssh人であれば嬉しくなる機能満載です。

さらに

mysqlで本番サーバ直接参照できないから不便だなあ・・・sshでトンネル作れば余裕です。

#-N:リモートコマンド実行しない、-f:Background移行、-L:トンネル作成
ssh -N -f -L 9999:localhost:3306 rksz@192.168.1.124

#これでlocal port9999を指定するとリモートの3306に接続してくれる。
mysql -uroot --port 9999 -h 127.0.0.1

もちろんmysql(3306)じゃなくてもOK。ほかにもProxyCommandなど便利なものがあり、踏み台にして多段ログインなどもできます。

逆にいえば、ssh connectionさえ確立出来ればなんでも出来てしまうということです。もしネットワーク管理者で自社にVPNでリモートログイン出来るようにする際には、リモートデスクトップ(3389)系のポートのみ開放して、それ経由でsshなどしてもらうといいと思います。(さらに言えば、適当にグローバルからSSH出来るサーバを用意して、逆にリモート側から逆ポートフォワーディング(-Rオプション)をするとLAN同士をトンネル出来るので、結局、詳しい人には気休め程度にしかならない可能性はあり)

最後に

もっとssh力を付けたい場合は以下の資料がおすすめです。

さらにSSH力をつけねば。