在 Bash 上获取并使用服务器 IP 地址?

在 Bash 上获取并使用服务器 IP 地址?

我有这个 Bash 文件,可以在我部署的每个系统上完美运行,但它需要将服务器 IP 放入命令中,这样它才能工作,并且我确实在每个服务器上手动输入它,但我在想是否有一种方法可以自动化此过程?例如,假设我需要这个命令:

mycli serve --host x.x.x.x &

我想要一个 Bash 文件来自动检索服务器 IP 并使用该 IP 运行该命令,而不是在每台服务器上替换 xxxx?

答案1

在设置 IP 地址的脚本开头设置一个变量,然后在脚本运行的实际命令中使用该变量。

我突然想到,

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

然后在脚本中,只需使用$IPADDR您要放置 IP 的位置即可。

这只能在具有单个 IP 和单个环回 127.0.0.1 的服务器上正常工作,并且可能有更好的方法来做到这一点。

答案2

假设“主机”有一个 IP 地址,您可以执行以下操作:

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

答案3

假设您的系统有 2 个以太网设备,eth0并且eth1eth0连接到您的 LAN,例如 IP 192.168.1.X,并且您的eth1设备已连接到您的 ISP (WAN),您将需要使用以下ifconfig命令来获取您的 IP广域网一侧。

笔记:第 2 种方法假设您在一台具有 2 个以太网设备的计算机上运行它们,并且其中一个连接到您的 ISP(电缆调制解调器和/或 DSL 调制解调器)。在这种情况下,以太网设备 (eth1) 将使用您在互联网上的 IP 地址 (WAN IP) 进行配置。

第一种方式

                          +------------------------+
  +--------+    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

第二种方式

如果您需要从仅位于 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

第三种方式

如果您无法 ssh 进入具有 WAN 访问权限的盒子,并且您使用的是家庭路由器/交换机,例如 Linksys 或 Netgear 盒子。您可以通过 HTTP 状态页面从该设备获取 IP。我过去也这样做过,与本文中描述的类似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。

第四种方式

向外部互联网站点发送查询,该站点将报告您的 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 地址

参考

相关内容