それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

.ssh/config でSSH設定を活用する方法。

~/.ssh/config ファイルを書くことでサーバー毎に接続設定を変えることが出来る.と言う話を前に書きました。 .ssh/config はイロイロ便利なので,もう一度まとめて見ました。

ホスト毎にユーザー名を変える

~/.ssh/config 記述例
Host 192.168.2.5
	User takuya_1st

この記述で

ssh takuya_1st@192.168.2.5 

ssh 192.168.2.5 

が同じになります,。ユーザー名が省略出来ました。

ホスト名を省略する

Host s0
	Hostname 192.168.2.5

この記述で

ssh s0

ssh 192.168.2.5

と同等になります.IP省略できるし /etc/hostsの書換えも要らない。楽ちんです!!

サーバー毎に鍵を変える

SSH秘密鍵をサーバー毎に変える場合.

Host 192.168.2.5
	IdentifyFile /home/share/keys/id_rsa.fs

と書けば接続先で鍵を変えることが出来るようになります.

ssh host01 -i /path/to/key/id_rsa

ssh host01

に省略されます

ポート番号

サーバー毎のポート番号を指定できます

Host 192.168.2.5
	Port 10020


これで、接続時にポート番号指定を省略できます。まいかいポート指定しなくて良いですものね。

先ほどのホスト名指定と組み合わせて

Host my_host01
   Hostname takuya.example.com
   Port 10220

とすれば、まとめて設定できて便利

ワイルドカード

IPアドレスの設定にワイルドカードが使える

Host 192.168.2*
	User takuya_1st


と書けば 192.168.2.0/24 のサーバーに接続する全て適用されます.

ワイルドカードドメイン頭にも

Host *.test.example.jp
	User test_admin


などと頭につけても大丈夫

SSH接続がブチブチ切れるのを防止する

接続先のルーターTCPをすぐに切断する系の場合。全体の設定でKeepAliveするのもばからしいので。

Host 192.168.2.5
  ServerAliveInterval 15

と書けば,15秒に一回,SSHクライアント側TCPキープアライブを送ります。
TCPKeepalive はデフォルトがYesなので keepalive はデフォルト有効です.

TCPキープアライブをOFF

TCPキープアライブをOFFにしておけば地下鉄などで瞬間的に接続切れても無くてもじっと待ってくれるので少し嬉しい.

どうしても切断されてしまうなら,次のサイトが参考になるかも。

ログイン先で定期的に何かを出力するプログラムを実行する

端末を取得する場合のみ有効な方法ですが、 一定時間おきに何かの文字列を出力するようなプロセスを バックグラウンド実行しておけば その文字列がコネクション上を流れますので、 接続を維持できます。

また、ポートフォワーディングが主目的の場合など、 ping -i 300などとリモートで実行する例がよく見られます。

問題点は、他のプロセスの出力と混ざってしまうことです。 リモートログインしてEmacsなどの端末制御を行うアプリケーションを実行すると、 このバックグラウンドプロセスの出力が画面を乱してしまいます。 ビープ(0x0a)を出力すれば画面が乱れることはありませんが、 うるさいのでイマイチだと思います。

KeepAliveが期待通り動くようにOSのTCP設定を変更する

前述したように、ただssh_configでKeepAlive yesとしただけではこの問題は解決しません。 KeepAliveオプションはTCPソケットを作るときにSO_KEEPALIVEを有効にするものですが、 これは一定時間何もパケットの流れないコネクションに対し、 接続が生きているかどうかを確認するためのパケットを流すものです。 このkeepaliveメッセージを送るまでの時間は、手元のLinuxだと2時間の設定ですので、 とっくに切れているくらいの時間が経過してようやく接続断をOSが認識するわけです。 筆者にはこのあたりのレイヤーの話は全くわからないのですが、 多分そういうものなのでしょう。

Linuxの場合は /proc/sys/net/ipv4/tcp_keepalive_time などをいじってこの設定を5分などと変更すれば 問題は解決するようですが、心理的に抵抗があります。

「Programming UNIX Sockets in C - Frequently Asked Questions」の記述からしても、アプリケーションレベルで対処すべき問題のように思います。

http://www.geocities.co.jp/AnimeComic/1098/documents/unixmemo/ssh-keepalive.html

それでも切れるならHeartbeatパッチを適用したSSHコマンド使用を考えると良いかも・

詳しくは man ssh_cofig

SSHの設定適用順
/etc/ssh/ssh_config : システム全体
~/.ssh/config       :ユーザー固有


の順に解釈される.