从文件动态更新主机文件
dynamically update hosts file from file
我爸爸家里有一个 Raspberry Pi 用作 "Hive"(Heating/Water 对照)。
我爸爸有一个由他的 ISP 提供的动态 IP,当它改变时,Pi 会更新我服务器上的一个文本文件(通过 ssh)。然后我使用它通过 SSH 登录,他使用它通过我的域“/cleres”上的 URL 访问网络 UI。
目前我有一个丑陋的 bash 脚本,它将我的整个主机文件复制到一个临时文件,除了最后一行(他的 ip),从文本文件中获取新的 IP,并更新主机文件附加
XXX.XXX.XXX.XXX dad
我觉得这不是最好的方法,但是每个 post(我发现)关于动态主机文件更新似乎都是人们用他们自己的本地 DHCP 地址更新它。我不想使用 dyndns 或 noip 因为这是不必要的。我已经有了 IP,我只需要一种在我的服务器上为其设置别名的方法。
TLDR 我想知道是否有比复制整个文件并附加新 IP 和主机更好的方法来更新我的主机文件。
如果有人感兴趣,我的域名是 here。
---丑陋的BASH脚本---
ip="$(cat /media/dad/dadextip.txt)"
check="$(cat /etc/hosts | grep $ip | sed -e 's/\< Dad\>//g')"
if [[ $check != *[^0-9]* ]]; then
cat /etc/hosts | grep -v Dad > /tmp/tmphosts
cat /tmp/tmphosts > /etc/hosts
echo "$ip Dad" >> /etc/hosts
cat /tmp/tmphosts > /var/spool/postfix/etc/hosts
echo "$ip Dad" >> /var/spool/postfix/etc/hosts
cat /etc/webmin/servers/1448542326.serv | grep -v host > /tmp/tmphosts
cat /tmp/tmphosts > /etc/webmin/servers/1448542325.serv
echo "host=$ip" >> /etc/webmin/servers/1448542326.serv
exit 0
elif [ $check != $ip ]; then
cat /etc/hosts | grep -v Dad > /tmp/tmphosts
cat /tmp/tmphosts > /etc/hosts
echo "$ip Dad" >> /etc/hosts
cat /tmp/tmphosts > /var/spool/postfix/etc/hosts
echo "$ip Dad" >> /var/spool/postfix/etc/hosts
cat /etc/webmin/servers/1448542326.serv | grep -v host > /tmp/tmphosts
cat /tmp/tmphosts > /etc/webmin/servers/1448542326.serv
exit 0
else
exit 0
fi
GNU sed
可以进行文件内替换 (sed -i "s/<regex>/replacement/" /etc/hosts
)。显然你想先测试正则表达式替换部分 没有 -i
选项直到它工作......
我爸爸家里有一个 Raspberry Pi 用作 "Hive"(Heating/Water 对照)。
我爸爸有一个由他的 ISP 提供的动态 IP,当它改变时,Pi 会更新我服务器上的一个文本文件(通过 ssh)。然后我使用它通过 SSH 登录,他使用它通过我的域“/cleres”上的 URL 访问网络 UI。
目前我有一个丑陋的 bash 脚本,它将我的整个主机文件复制到一个临时文件,除了最后一行(他的 ip),从文本文件中获取新的 IP,并更新主机文件附加
XXX.XXX.XXX.XXX dad
我觉得这不是最好的方法,但是每个 post(我发现)关于动态主机文件更新似乎都是人们用他们自己的本地 DHCP 地址更新它。我不想使用 dyndns 或 noip 因为这是不必要的。我已经有了 IP,我只需要一种在我的服务器上为其设置别名的方法。
TLDR 我想知道是否有比复制整个文件并附加新 IP 和主机更好的方法来更新我的主机文件。
如果有人感兴趣,我的域名是 here。
---丑陋的BASH脚本---
ip="$(cat /media/dad/dadextip.txt)"
check="$(cat /etc/hosts | grep $ip | sed -e 's/\< Dad\>//g')"
if [[ $check != *[^0-9]* ]]; then
cat /etc/hosts | grep -v Dad > /tmp/tmphosts
cat /tmp/tmphosts > /etc/hosts
echo "$ip Dad" >> /etc/hosts
cat /tmp/tmphosts > /var/spool/postfix/etc/hosts
echo "$ip Dad" >> /var/spool/postfix/etc/hosts
cat /etc/webmin/servers/1448542326.serv | grep -v host > /tmp/tmphosts
cat /tmp/tmphosts > /etc/webmin/servers/1448542325.serv
echo "host=$ip" >> /etc/webmin/servers/1448542326.serv
exit 0
elif [ $check != $ip ]; then
cat /etc/hosts | grep -v Dad > /tmp/tmphosts
cat /tmp/tmphosts > /etc/hosts
echo "$ip Dad" >> /etc/hosts
cat /tmp/tmphosts > /var/spool/postfix/etc/hosts
echo "$ip Dad" >> /var/spool/postfix/etc/hosts
cat /etc/webmin/servers/1448542326.serv | grep -v host > /tmp/tmphosts
cat /tmp/tmphosts > /etc/webmin/servers/1448542326.serv
exit 0
else
exit 0
fi
GNU sed
可以进行文件内替换 (sed -i "s/<regex>/replacement/" /etc/hosts
)。显然你想先测试正则表达式替换部分 没有 -i
选项直到它工作......