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
我有一个 R 脚本可以通过
获取 public IPsystem("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/orping -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