在ubuntu中寻找动态公共IP地址的shell脚本不显示任何输出。

问题描述 投票:0回答:1

我写了下面的脚本来找到我的动态公共IP地址,并保存它变化的频率。

#!/usr/bin/env bash
ip=0
change=0
for ((count = 10000; count != 0, change == 10; count--)); do

    fetch="$(dig +short myip.opendns.com @resolver1.opendns.com)"
    dig +short myip.opendns.com @resolver1.opendns.com >>/home/nik/Desktop/file.txt
    if [ $ip == 0 ]; then
        ip=fetch
    elif [ $ip != "$fetch" ]; then
        change++
        echo $ip 
        echo " changed to "
        echo "$fetch"
        echo " at "
        echo date
    else
        echo ""
    fi
    echo "123"
    sleep 13
    (( count--))
done

我将文件保存为script.sh,并使用以下方法修改了它的可执行权限

chmod +x script.sh

当我在终端中单独运行dig命令(下一行)或直接运行echo命令时,它们都能顺利地将输出记录到文件中。

 dig +short myip.opendns.com @resolver1.opendns.com>>/home/nik/Desktop/file.txt

但当我运行这个脚本时,它没有显示任何输出,也没有将任何东西记录到文本文件中。

bash shell ubuntu ip-address tee
1个回答
0
投票

你有 change=0 在文件的开头,然后依靠 change == 10 在你的for循环的条件表达式中。

我想你应该先检查一下你的代码 :-)


0
投票

追踪公共IP地址变化的脚本可以从这个家伙开始。

#!/usr/bin/env bash

CURRENT_IP="$(timeout 5 dig +short myip.opendns.com @resolver1.opendns.com 2>/dev/null)"
num_changes=0
while [ 1 ]
do
    NEW_IP="$(timeout 5 dig +short myip.opendns.com @resolver1.opendns.com 2>/dev/null)"
    if echo "${CURRENT_IP}" | grep -q "${NEW_IP}"
    then
        echo "IP is the same" > /dev/null
    else
        let num_changes++
        echo "${num_changes}:  ${CURRENT_IP}   ->   ${NEW_IP}"
        CURRENT_IP="${NEW_IP}"
    fi
done
  • 有两个变量被使用: CURRENT_IPNEW_IP
  • 它们的更新方式都是一样的 timeout 5 dig +short ... 2>/dev/null
  • 超时的作用是确保我们的脚本不会永远挂起。
  • 2>/dev/null 作用是过滤掉错误信息
  • num_changes 变量跟踪IP改变的次数。
  • 只有当你的地址发生变化时,这个脚本才会打印任何信息。

示例输出。[NUM_CHANGES].[LAST ADDRESS] -> [NEW ADDRESS]: 最后一个地址] -> [新地址]。

1:75.72.13.89->74.76.77.88 2:75.72.13.88->74.76.77.87 3:75.72.13.87->74.76.77.86

© www.soinside.com 2019 - 2024. All rights reserved.