【问题标题】:Bash script - check how many times public IP changesBash 脚本 - 检查公共 IP 更改的次数
【发布时间】:2021-03-20 08:43:36
【问题描述】:

我正在尝试创建我的第一个 bash 脚本。此脚本的目标是检查我的公共 IP 更改的速率。这是一个相当简单的脚本。首先,它检查新地址是否与旧地址不同。如果是这样,那么它应该将旧的更新为新的,并打印出日期以及新的 IP 地址。

此时我已经创建了一个简单的脚本来完成此操作。但我有两个主要问题。

首先脚本继续打印出 IP,即使它没有改变,我已经用 CUR_IP 更新了 PREV_IP。

我的第二个问题是我希望输出直接到文件而不是输出到终端。

出于测试目的,当前间隔设置为 1 秒。这将在最终产品中更改为更高的间隔。

#!/bin/bash  
while true  
PREV_IP=00
do  
        CUR_IP=$(curl https://ipinfo.io/ip)
        if [ $PREV_IP != "$CUR_IP" ]; then
        PREV_IP=$CUR_IP
        "$(date)" 
        echo "$CUR_IP"
        sleep 1
        fi
done

我也得到了一个非常奇怪的输出。我已将我的公共 IP 编辑为 xx.xxx.xxx.xxx:

Sat 20 Mar 09:45:29 CET 2021
xx.xxx.xxx.xxx
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:-- 

【问题讨论】:

  • 请先将您的脚本粘贴到shellcheck.net,然后尝试实施那里提出的建议。
  • 顺便说一句:sh (Bourne-shell) 通常不是 bash (Bourne-again shell)。
  • 我已将其更新为 bin/bash。我会检查拼写检查器!
  • 当你说“得到一个非常奇怪的输出”时,你到底是什么意思?
  • 提示:curl -s.

标签: bash


【解决方案1】:
while true  
PREV_IP=00
do

是您在每个循环中看到 ip 的原因。与while true; PREV_IP=00; do 相同。 true; PREV_IP=00 的退出状态是最后一个命令的退出状态——赋值的退出状态是 0(成功)——所以循环会一直执行。但是PREV_IP 将在每个循环中重置为00...这是一个错字,您的意思是设置prev_ip 一次循环开始之前。

    "$(date)" 

将尝试执行date 命令的输出,作为下一个命令。所以它会打印:

$ "$(date)" 
bash: sob, 20 mar 2021, 10:57:02 CET: command not found

最后,要让curl 沉默,请先阅读man curl,然后再了解-s。我使用-sS,所以错误也是可见的。

不要在脚本中使用大写变量。首选小写变量。使用 http://shellcheck.net 检查您的脚本。引用变量扩展。

我会在每个循环中睡觉。您的脚本可能如下所示:

#!/bin/bash
prev=""
while true; do  
        cur=$(curl -sS https://ipinfo.io/ip)
        if [ "$prev" != "$cur" ]; then
            prev="$cur"
            echo "$(date) $cur"
        fi
        sleep 1
done

我希望将输出定向到文件而不是将其输出到终端。

然后研究重定向在 shell 中是如何工作的以及如何使用它。最简单的方法是重定向回显输出。

 echo "$(date) $cur" >> "a_file.txt"

出于测试目的,当前间隔设置为 1 秒。这将在最终产品中更改为更高的间隔。

连接到https://ipinfo.io/ip 所需的时间仍然有限。并来自 ipinfo.io 文档:

我们的 API 的免费使用限制为每月 50,000 个 API 请求。

最后,我编写了一个脚本,尝试使用许多公共服务,因为我发现 ,get_ip_external 用于获取外部 IP 地址。您可以使用多个公共服务来获取 ipv4 地址,并选择一个随机/循环的服务,这样速率限制就不会那么快。

【讨论】:

  • 我如何能够在我自己的脚本中执行和运行您的脚本?我试过 sh ./find_ip.sh。但它会抛出错误“find_ip.sh: 2: set: Illegal option -o pipefail”
  • 1.安装 bash。 2. 使用 bash 而不是 sh 运行脚本。你试过google the error吗?
猜你喜欢
  • 2021-12-14
  • 2020-04-11
  • 2018-07-27
  • 1970-01-01
  • 2012-03-07
  • 2022-09-23
  • 2013-01-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多