bash: output/write/append 带有时间戳和 public IP 的 csv 文件

bash: output/write/append a csv file with timestamp and public IP

我有一个 R 脚本可以通过

获取 public IP
system("curl ifconfig.me",intern = T )

然后 writes/appends 它在 CSV 文件中

write.table(data.frame(start.script=start.time, runtime=round(Sys.time()-start.time,4), ip=myip), append = T, file = "/home/eic/ip.report.csv", row.names = F,sep = ",", col.names = !file.exists("/home/eic/ip.report.csv"))

脚本每分钟用 cron 运行一次。

不过,我会运行它在一个小树莓派Zero中,R的安装差不多有500MB

是否可以用 bash 做到这一点?

输出应创建或附加一个 CSV 文件(时间和 public IP 作为字符串)。如果无法访问互联网,则应输出“无法访问互联网”。它不一定非要 curl ifconfig.me 检查互联网连接。在 8.8.8.8 检查 ping 也是一个选项。但是它应该输出 public IP。

谢谢

#!/bin/bash
ip=$(curl --max-time 2 ifconfig.me 2>/dev/null) #Curl outputs some data on stderr. 2>/dev/null will remove that
hasInternet=$? #will be 0 if there was no error, make sure this line is directly after the curl line
curdate=$(date)
csvfile="file.csv" #right now this is a relative path to your working directory. For cron maybe better to use a absolute path

if [ $hasInternet -eq 0 ]; then
  echo "${curdate},${ip}" >> $csvfile #>> will add a new line to the file
else
  echo "${curdate},No internet" >> $csvfile
fi

我认为这是您脚本的良好开端。可能与您原来的不完全一样,但我认为您应该能够进行必要的更改。

msg=$(curl -s --max-time 3 icanhazip.com) ||
msg='Internet unreachable'

echo "$(date '+%Y-%m-%d %T %Z'),${msg:-Unkown}" >> /home/eic/ip.report.csv

每一行看起来像:

2022-02-21 14:59:59,12.123.123.12 UTC
  • 显然,“Internet 无法访问”意味着“icanhazip.com 无法访问”。未能 ifconfig.me、and/or ping -c 1 -W 3 google.com 记录连接,但不记录 IP,可能值得减少嵌入式设备的维护。
  • 我什至可以使用 5 秒超时(而不是 3 秒),用于非常慢的连接,如坏卫星、代理等。
  • ${msg:-Unkown} 将空响应替换为 Unkown
  • 您可以更改日期格式:man date
  • 如果您不想让 cron 记录它可能产生的错误(例如,如果互联网中断),请将 2>/dev/null 添加到 curl。
  • 有关从 shell 检查互联网连接的更多信息:https://unix.stackexchange.com/questions/190513/shell-scripting-proper-way-to-check-for-internet-connectivity