web-dev-qa-db-ja.com

BashでサーバーのIPアドレスを取得して使用しますか?

展開する各システムで完全に問題なく動作するこのBashファイルがありますが、コマンドにサーバーIPを入力する必要があるため、機能し、各サーバーで手動で入力しますが、このプロセスを自動化する方法があると考えていました?たとえば、次のコマンドが必要だとします。

mycli serve --Host x.x.x.x &

各サーバーでx.x.x.xを置き換える代わりに、サーバーIPを自動的に取得し、そのIPでそのコマンドを実行するBashファイルが必要ですか?

3
Mini

スクリプトの先頭にIPアドレスを設定する変数を設定し、スクリプトが実行している実際のコマンドでその変数を使用します。

私の頭の上から

IPADDR=$(ip addr show |grep 'inet '|grep -v 127.0.0.1 |awk '{print $2}'| cut -d/ -f1)

その後、スクリプトで$IPADDRIPを配置する場所。

これは、単一のIPと127.0.0.1の単一のループバックを持つサーバーでのみ正しく機能します。おそらくそれを行うためのより良い方法があります。

1
Kefka

「ホスト」が単一のIPアドレスを持っていると仮定すると、次のようなことができます。

MYHOSTIP=$(Host `hostname` | head -n 1 | awk '{ print $NF; }') mycli servie --Host $MYHOSTIP
0
KevinO

システムに2つのイーサネットデバイスがあるとすると、eth0およびeth1およびeth0はLANに接続されています。たとえば、IP192.168.1.Xとeth1デバイスがISP(WAN)に接続されている場合は、次のifconfigコマンドを使用して、WAN側のIPを取得します。

注:最初の2つの方法は、イーサネットデバイスが2つあるコンピューターに対してそれらを実行しており、そのうちの1つがISPに接続されていることを前提としています(ケーブルモデムおよび/またはDSLモデム)。このシナリオでは、イーサネットデバイス(eth1)は、インターネット上のIPアドレス(WAN IP)で構成されます。

第1の方法

                          +------------------------+
  +--------+    WAN IP    |   Computer that wants  |  LAN IP
  |Internet|--------------|     to know WAN IP     |------------
  +--------+  54.234.1.33 | +------+      +------+ | 192.168.1.1
                          +-| eth1 |------| eth0 |-+
                            +------+      +------+

% ifconfig eth1 | awk '/inet / { print $2 }' | sed -e s/addr://
54.234.1.33

ipコマンドを使用することもできます。

% ip -4 addr show eth1 | awk '/inet/ {print $2}' | sed 's#/.*##'
54.234.1.33

2番目の方法

LAN上にのみ存在するシステムからこれを見つける必要がある場合は、パスフレーズのないsshキーを設定し、それをLANマシンのアカウントに追加して、WANのようなアクセス。

                                                            +----------------+
  +--------+    WAN IP      +-------------+      LAN IP     | Computer that  |
  |Internet|----------------|remote-server|-----------------| wants to know  |
  +--------+  54.234.1.33  +----+-----+----+  192.168.1.x  +----+ WAN IP     |
                           |eth1|     |eth0|               |eth0|------------+
                           +----+     +----+               +----+

% ssh ruser1@remote-server "ifconfig eth1 | awk '/inet / { print \$2 }' | sed -e s/addr://"
54.234.1.33

第3の道

WANアクセス権のあるボックスにSSHで接続できず、LinksysまたはNetgearボックスなどのホームルーター/スイッチを使用している場合。IPをHTTPステータスページを介してそのデバイスを使用します。これも過去に行ったことがありますが、これは whatismyip.comフォーラムの投稿 で説明されている内容に似ています。

                                                               192.168.1.2
                                                            +----------------+
  +--------+    WAN IP      +-------------+      LAN IP     | Computer that  |
  |Internet|----------------|router/switch|-----------------| wants to know  |
  +--------+  54.234.1.33   +-------------+   192.168.1.x  +----+ WAN IP     |
                              192.168.1.1                  |eth0|------------+
                                                           +----+

# something like this....

% wget -q -O - http://<username>:<password>@192.168.1.1/Status_Router.asp | grep "ipaddress" | cut -d" " -f2

注:このアプローチは、Linksys、Netgearなどのブランドであるかどうかにかかわらず、使用しているルーター/スイッチに大きく依存します。それぞれに、WAN IPが記載された独自のページがあります。

4番目の方法

WAN IPアドレスを報告する外部インターネットサイトに対してクエリを送信します。

注:元の質問で、このアプローチの代替案を探していると述べられていたのは承知していますが、この回答が得られるようにここに入れていますすべての拠点をカバーしています。

                                                        +---------------+
  +-------------+   +--------+   +------+     LAN IP    | Computer that |
  |whatsmyip.com|---|Internet|---|router|---------------| wants to know |
  +-------------+   +--------+   +------+  192.168.1.x +----+ WAN IP    |
you're 54.234.1.33                                     |eth0|-----------+
                                                       +----+

# 1st server
% wget -qO - ipv4bot.whatismyipaddress.com
54.234.1.33

# 2nd server
% curl 'https://api.ipify.org?format=json'

{"ip":"54.234.1.33"}
% curl 'https://api.ipify.org?format=txt'
54.234.1.33

# 3rd server
% curl -s checkip.dyndns.org | sed 's#.*Address: \(.*\)</b.*#\1#'
54.234.1.33

追加情報はここにあります: HOWTO:コマンドラインから外部IPアドレスを確認してください

参考文献

0
slm