有没有一种优雅的方法可以在 BASH 脚本中测试 IP 地址?我可以执行 ifconfig 并使用 sed/awk 缩小 IP,但我认为有一个更简单的解决方案。
当我在 Intranet 中和不在时,我的应用程序基本上使用 SSH/SCP 脚本。所以,我想要这种类型的流程
if IP=192.168.1.1
then do this
else
then do that
有没有一种优雅的方法可以在 BASH 脚本中测试 IP 地址?我可以执行 ifconfig 并使用 sed/awk 缩小 IP,但我认为有一个更简单的解决方案。
当我在 Intranet 中和不在时,我的应用程序基本上使用 SSH/SCP 脚本。所以,我想要这种类型的流程
if IP=192.168.1.1
then do this
else
then do that
一些相当简单的东西,您可以修改以满足您的需求:
编辑:忘记了 fgrep :)
如果要区分您是否在 Intranet 中连接,
您可以通过快速短 ping 或 arp 尝试检查已知的内部服务器 IP。
如果 IP 没有响应,你很可能在 Intranet 之外。
可能会有轻微的故障(比如服务器暂时关闭)。
这些可以被允许(您错误地切换到 Internet 模式),
或者,通过多次检查(通过不同的内部资源)进一步测试。
这更像是对 mikeB 答案的评论,但评论不允许代码,所以我将其作为答案发布:
您可以使用 grep 之类的东西来查找您要查找的内容,例如
这实际上可以简化为摆脱退出状态的测试( [ 是 test 的别名),因为 if 已经直接检查退出状态,这就是 test 与 if already 通信的方式:
您可以通过使用 case 语句使用大多数 bourne shell 中内置的正则表达式搜索来进一步简化此操作:
一种(IMO,更复杂,更容易失败)方法是配置您的 dhcp 客户端,将分配的 IP 地址保存到某个方便的文件中。
例如,使用 dhclient,您只需将脚本放入 /etc/dhcp3/dhclient-enter-hooks.d/ 即可将当前 IP 保存到文件中,例如 /var/run/current-IP.txt
然后您的其他脚本可以只对该文件进行分类以获取当前 IP。
这样做的问题是它只告诉你最后一次由 dhcp 分配的IP 地址是什么。它实际上并没有告诉您您现在的 IP 地址是什么。它们可能相同,也可能不同。
ip addr show <DEVICE> | grep inet | grep -v inet6 | awk '{print $2}'
希望这应该输出您的IP。可能有一种更优雅的方式来做到这一点,但不管优雅如何,这都能完成工作。