有没有一种优雅的方法可以在 BASH 脚本中测试 IP 地址?我可以执行 ifconfig 并使用 sed/awk 缩小 IP 范围,但我认为有一个更简单的解决方案。
我的应用程序基本上是在我进入内部网络时使用 SSH/SCP 脚本,而在我不在内部网络时也是如此。因此,我想要这种类型的流程
if IP=192.168.1.1
then do this
else
then do that
答案1
您可以修改一些相当简单的东西来满足您的需要:
ip addr show dev eth0 | fgrep -q 'inet 192.168.1.1'
if [ $? -eq 0 ]; then
echo 'IP found'
else
echo 'IP not found'
fi
编辑:忘记了 fgrep :)
答案2
如果要区分您是否已连接到 Intranet,
您可以对已知的内部服务器 IP 进行快速简短 ping 或 arp 尝试。
如果 IP 没有响应,则您可能位于 Intranet 之外。
可能会出现轻微故障(例如服务器暂时停机)。
这些可以允许(您错误地切换到 Internet 模式),
或者通过多次检查(针对不同的内部资源)进行进一步测试。
答案3
这更像是对 mikeB 答案的评论,但评论不允许代码,因此我将其作为答案发布:
您可以使用 grep 之类的工具来查找所需内容,例如
ip addr show dev eth0 | fgrep -q 'inet 192.168.1.1'
if [ $? -eq 0 ]; then
echo 'IP found'
else
echo 'IP not found'
fi
这实际上可以简化,摆脱退出状态上的测试( [ 是测试的别名),因为 if 已经直接检查退出状态,这就是测试与 if 通信的方式:
if
ifconfig | fgrep -q 'inet 192.168.1.1'
then
echo "IP Found"
else
echo "IP Not found"
fi
您还可以通过使用大多数 Bourne Shell 内置的正则表达式搜索(使用 case 语句)来进一步简化此操作:
case $(ifconfig)
in
*"inet 192.168.1.1"*)
echo "IP found"
;;
*)
echo "IP not found"
;;
esac
答案4
ip addr show <DEVICE> | grep inet | grep -v inet6 | awk '{print $2}'
希望这样可以输出您的 IP。可能有更优雅的方法,但无论优雅与否,这种方法都能完成任务。