根据您是否在本地网络中更改行为

时间:2016-09-14 07:35:04

标签: bash

我正在制作像这样的bash脚本

if [ "if I am in local "]; then
  ssh myuser@192.168.11
else
  ssh myuser@myserver.com
fi

如果我在当地,我怎么能得到?

2 个答案:

答案 0 :(得分:1)

一种可能性是测试192.168.11是否可以ping通:

if ping -qc1 192.168.11 >/dev/null; then
  ssh myuser@192.168.11
else
  ssh myuser@myserver.com
fi

如果ping收到来自192.168.11的响应,则退出并返回代码为0(成功),并执行then子句。如果未返回任何响应,则执行else子句。

选项-c1告诉ping仅发送一个数据包。如果您的本地网络不可靠(不太可能),您可能需要发送多个数据包。

-q选项告诉ping稍微安静一点,但这并不重要,因为我们将其输出转储到/dev/null

请注意,IP地址通常使用4个值写入,而不是3:192.168.11中可能缺少一个数字。

文档

来自man ping

  

如果ping没有收到任何回复数据包,它将退出   代码1.如果指定了数据包计数和截止日期,则更少   在截止日期到来之前收到的数据包数量,   它也将以代码1退出。在其他错误上,它将退出代码   2.否则它以代码0退出。这使得可以使用退出代码来查看主机是否存活。

答案 1 :(得分:1)

这适用于假设,然后以10,127,197,172开头的IP地址是专用网络的保留IP。

myIp=$(hostname -I) # or i based on your version. 
echo $myIp |grep -q -P '(^127\.)|(^10\.)|(^172\.1[6-9]\.)|(^172\.2[0-9]\.)|(^172\.3[0-1]\.)|(^192\.168\.)'

if [ "$?" -eq 0 ];then
  echo "Private Network"
else
  echo "Over Internet"
fi

来自Here的灵感。