最後にSSHリモートアクセスしたIP

自分しか使わないプライベートクラウドサーバを用意するときの安全性について考えると、Dynamic DNSを使って名前解決をする方法は使いたくありません。自分以外からの問い合わせにも応えて、名前解決をしてしまうため、外部からアタックをかけられるリスクが高まるからです。しかし、名前解決ができないと、外出したときに、プライベートクラウドサーバへアクセスできません。プライベートクラウドサーバのIPアドレスを取得するには、どういった方法があるでしょう。

プライベートクラウドサーバを持っているような人は、インターネット上にもSSHアクセス可能なサーバ(SSHサーバ)を持っている人がほとんどでしょう。ですから、プライベートクラウドサーバから、インターネット上のSSHサーバへ定期的にSSHログインや、HTTPアクセスをして、プライベートクラウドサーバのIPアドレスをSSHサーバへ記録しておくという方法があります。

SSHでログインしたときのログはlastコマンドで取得できますから、ここでは定期的にSSHログインをしているという前提で、lastコマンドから最後にSSHリモートアクセスしたIPを取得する方法を紹介します。

いま、プライベートクラウドサーバはexample.comにあるとして、そこから定期的にserver.example.jpへusernameというアカウントでSSHログインしていたとします。lastログにはプロバイダが提供しているホスト名が記録されているとします。ここにIPアドレスが直接ある場合は、それを使えばよいのですが、筆者の環境ではホスト名になっていて、このホスト名がプロバイダによってしばしば変更されています。そして、このホスト名が途中で切れてしまっていることがあります。ここではexampleでgrepすれば、プライベートクラウドサーバのホストが特定できるとします。

以上の条件であれば、次のようなシェルスクリプトで、IPアドレスを取得することができます。

#!/bin/sh
domain="example.com"
line=`ssh -A server.example.jp last | grep username | grep example | head -1`
host=`echo ${line} | awk '{print $3}' | awk 'BEGIN { FS="\."; } { print $1; }'`
ip=`dig ${host}.${domain} | grep ${host} | grep -v "^;" | awk '{print $5}'`
echo ${ip}

最初の行で、line変数へ hostname.example.c のような文字列が入ります。これから .example.c を取り除き、host変数へ hostname という文字列を入れています。host変数とdomain変数を使って、FQDNを作り、これから dig コマンドでIPアドレスを確定しています。

このスクリプトでは、awkを使って、ある列にある文字列を取得しています。Linuxでは、こういったちょっとしたコマンドを組み合わせることで、やりたいことがすぐにできるので重宝しています。

同じタグの記事: AWK
同じタグの記事: grep
同じタグの記事: SSH
同じカテゴリの記事: Linux
関連書籍: AWK