我有这个 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
并且eth1
已eth0
连接到您的 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 地址。