一、路由器分配固定IP
1.打开路由器管理界面192.168.199.1, IP地址根据不同厂商的不同型号决定;
2.打开DHCP服务, 将树梅派MAC地址与IP绑定;
二、配置端口映射
1.极路由需要使用端口转发插件实现,其它厂商路由器一般自带端口转发功能;
2.选择超级端口转发,配置端口映射;
3.配置公网IP端口与内网IP端口映射关系,使用自定义端口提高安全性
三、实时获取公网IP
1.通过访问互联网PHP页面获取本地出口ip信息;
https://www.learntoshare.top/clientip.php
2.编写脚本将IP地址写入本地文件,且每次执行会自动删除上次记录;
#!/bin/sh
rm /tmp/getip
wget -q http://members.3322.org/dyndns/getip -P /tmp/
3.编写脚本将IP地址上传至服务器或发送邮件
#!/bin/bash
#通过scp命令上传IP文件(本地存有远端服务器的ssh秘钥才能免密码scp)
echo "=======================scp ip address================="
ip_addr=$1
echo $ip_addr
scp /tmp/getip root@host.learntoshare.top:/var/www/wordpress/getip
#!/bin/bash
#通过mutt发送邮件到邮箱
echo "=====================sending email================="
ip_addr=$1
echo $ip_addr
cat getip | mutt -s "Raspberry Pi Change IP" 719528774@qq.com
4.通过C语音编写判断语句实现IP检测功能
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
void send_mail(char* ip){
char cmd[1000] = {};
sprintf(cmd,"./sendmail \"%s\"", ip);
printf("cmd is: \"%s\"\n", cmd);
system(cmd);
}
void scp_ip(char* ip){
char cmd[1000] = {};
printf("ip is: \"%s\"\n", ip);
sprintf(cmd,"sh /mybin/scpip \"%s\"", ip);
printf("cmd is: \"%s\"\n", cmd);
system(cmd);
}
int main(){
FILE* fpRead = NULL;
char tmIP[1000] = {};
char tmIP2[1000] = {};
int ran = 0;
while(1)
{
printf("------------------------------get ip ...--------------------------\n");
system("sh /mybin/getipx");
fpRead = fopen("/tmp/getip", "r");
if(fpRead)
{
fscanf(fpRead, "%s", tmIP);
printf("get ip is: %s\n", tmIP);
if(strcmp(tmIP, tmIP2) != 0)
{
printf("ip changed to: %s , scp ip adderss...\n", tmIP);
strcpy(tmIP2,tmIP);
//send mail
//send_mail(tmIP2);
scp_ip(tmIP2);
}else{
printf("IP NO Change!\n");
}
fclose(fpRead);
}
ran = rand()%15;
ran = 20+ran;
printf("sleep %d s\n",ran );
sleep( ran);
}
return 0;
}
5.使用gcc将源码编译为可执行文件
# gcc -o postipx postipx.c
6.手动执行一次/mybin/postipx,效果如下
7.打开网页验证IP地址上传成功
https://www.learntoshare.top/getip
8.将程序加入时间计划每天早上八点运行
# crontab -e
0 8 * * * root /mybin/postipx >/dev/null &
四、实现原理
使用system()函数调用脚本获取IP地址信息,使用fopen()函数获取文件中IP地址并写入变量fpRead;若内容不为零,使用fscanf()函数将IP地址读入tmIP字符串变量中;使用strcmp()函数比较tmIP、tmIP2两个字符串,若字符串不同返回值非零,通strcpy()函数将IP地址写入tmIP2字符串变量中,并使用SCP脚本将IP地址文件上传至服务器;若字符串相同返回值为零,清空fpRead变量挂起数秒后执行循环;
ps:无限循环通过while (1)实现