サーバー上で実行されるBashツールを作成しました。このツールは、特定の時間範囲(午前5時から午後3時30分まで)内の特定のIPアドレスをブロックします。
現時点では、このツールはうまく機能しますが、特定のWebサイトのIPアドレスをテキストファイルに手動で入力し、ツールに "head"と"tail"コマンドを使用してn行目に基づいてIPアドレスを抽出する必要があります。私は単一のpingがより軽くて携帯性が良いと信じているので、これをしたくありません。したがって、Googleにpingを実行すると、次のようになります。
ping google.com -c 1 -s 16
出力は次のとおりです。
Ubuntu@yokai:~# ping google.com -c 1 -s 16
PING google.com (173.194.66.138) 16(44) bytes of data.
24 bytes from qo-in-f138.1e100.net (173.194.66.138): icmp_seq=1 ttl=37 time=46.7 ms
--- google.com ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 46.748/46.748/46.748/0.000 ms
出力範囲を絞り込むコマンドは次のとおりです。
ping google.com -c 1 -s 16 | grep -o '([^ ]*' | tr -d '(44):\n'
これは私に出力を与えます:
173.19.66.113173.19.66.113ubuntu@yokai
ご覧のとおり、同じIPアドレスが重複しています。単一のIPアドレスを変数に保存し、スクリプトをcronjobとして実行できるようにsedを使用して重複を削除するにはどうすればよいですか?それとも、より良い追跡のためにtrを使用できますか?
(編集する)
ホスト名またはドメインでIPアドレスを解決する方法を既に知っています。私がここに尋ねるのはそうではありません。この質問は、特に私が作成したツールの移植性を高めるためにsedを使用してping出力を管理することです。 pingはほぼすべてのLinuxディストリビューションのデフォルト値であるためです。
(更新)一部の人々は、この質問をそれとは何の関係もない他の無駄な質問の重複としてマークしたので、英語を理解するのが難しい精神遅滞者が理解できるように十分に明確に説明します。
どのように分析するこれ「唯一の」IPアドレス~からping
出力ping
ドメイン名に使用される場合。
ドメイン名を解決するための要求ではないので、重複ではありません!
sed
(最新のアップデート)この質問で必要なことを達成するための正しいPOSIX正規表現を学んだので、元々はping出力から単一のIPインスタンスを印刷するための正規表現について質問したことを明確にする必要があります。それ以来、私はアプローチを改善し、ここで答えを使用しなくなりましたが、ここで助けを求めるすべての人の努力に感謝します。これで、特定のドメイン名解決をブロックするために、特定の時間にiptablesを設定するために作成したタイマースクリプトを使用しています。助けてくださった皆様にもよろしくお願いします。
答え1
ping
ICMP応答に基づいてホストが動作しているか無効になっているかを確認するために使用され、IPアドレスを確認するのに適したツールではなく、この目的のための特別なツールがあります。
あなたはそれを見なければなりませんdig
。host
-nslookup
あなたに最適なものは何でも良いです。
これはdig
出力です:
% dig +short google.com
123.108.243.57
123.108.243.51
123.108.243.54
123.108.243.48
123.108.243.60
123.108.243.52
123.108.243.56
123.108.243.55
123.108.243.61
123.108.243.58
123.108.243.49
123.108.243.50
123.108.243.59
123.108.243.47
123.108.243.53
参考までに、Linux上でNSSwitch(ネームサービススイッチ)を介して照会するには、データベースと共に(または)コマンドを/etc/nsswitch
使用します。例:getent
hosts
ahosts
getent hosts google.com
マイコンピュータには次のものがあります。
hosts: files mdns4 dns
そのため、順番に照会して使用するか、/etc/nsswitch.conf
名前に基づいて使用します。getent hosts
gethostbyaddr(3)
gethostbyname(3)
ahosts
getaddrinfo(3)
デフォルトでは、私の設定に従って最初にチェックし、/etc/hosts
mDNSをチェックし、最後にDNSをチェックします。
ping
and 使用にこだわったら、sed
次のようにすることができます。
% ping -c1 google.com | sed -nE 's/^PING[^(]+\(([^)]+)\).*/\1/p'
123.108.243.56
答え2
Googleで検索して別のリンクを見つけました。unix.SE投稿言及getent
- このようなプログラムがあるかどうかわからなかった。
getent
likeを使用してIPをホスト名として解決できますdig
。私のシステムにはgetent
デフォルトでインストールされていますが、そうではありませんdig
。 ipv6ホスティングが必要なahostsv4
場合ahostsv6
。
getent ahostsv4 google.com | awk '{print $1}' | head -1
正規表現/sedが良くなく、@heemaylの回答を把握できないため、この回答を追加しています。
答え3
1つの注意点は、dig
@heemaylの出力に見られるように、一部のサイトに複数のIPアドレスがある可能性があることです。ping
最初のアドレスのみが使用されるため、これらのアドレスをすべて取得するにはDNSルックアップを実行する必要があります。住所を具体的にリストするのではなく、主にリンクしたい他の項目にも当てはまります。
(また、Googleなどの場合は、現在地によって異なるIPアドレスを取得します。ここでは問題ではないかもしれませんが、注目に値します。)
もう一つは、あなたが使用したコマンドに関するものです。これは次のようになります。入力から、、、およびtr -d '(44):\n'
文字のすべてのコピーを削除します。常に文字列ではなく単一文字を見てください。得られた出力を見ると、IPアドレスの途中でこの欠落していることがわかります。文字列操作などの他のツールを使用します。(
4
)
:
\n
tr
4
sed
さまざまな色を表示するために自転車倉庫、GNU grepを使用する別の簡単な方法があります。
$ ping google.com -c1 | head -1 | grep -Eo '[0-9.]{4,}'
172.217.22.174