【问题标题】:Change the behaviour depending on whether you are in local network or not根据您是否在本地网络中更改行为
【发布时间】:2017-01-21 22:22:27
【问题描述】:

我正在制作这样的 bash 脚本

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

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

【问题讨论】:

    标签: bash


    【解决方案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 退出。这使得可以使用退出代码来查看主机是否处于活动状态。

    【讨论】:

      【解决方案2】:

      这适用于假设以 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 的灵感。

      【讨论】:

      • 主机名似乎没有'-i'选项并且主机名返回真实的只是一个'主机名'而不是IP地址
      • 试试hostname -I , I 大写
      猜你喜欢
      • 1970-01-01
      • 2016-01-31
      • 2023-02-07
      • 1970-01-01
      • 2017-09-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-25
      相关资源
      最近更新 更多