实现两台linux服务器互相传递ip
背景
实验室机器经常重启之后会变ip, 然后自己又不想固定ip,所以期望能够再机器重启后立马就能知道机器的ip
实现
#!/bin/bash
# 功能:两台服务器来回传递ip,防止一台机器重启后,ip不知道了
# 1. 设置remote_user/ip, 目标主机地址
# 2. 设置device,当前机器网卡名
# 3. 设置ssh免密登录 ,ssh-copy-id user@host
# 4. 加入crontab 定时启动
# */1 * * * * /bin/bash /home/user/send_ip.sh
source /etc/profile
remote_user="xxx"
remote_ip="x.x.x.x"
user=$USER
device="eth0"
ip=`ifconfig "$device"|grep "inet addr:"|awk -F":" '{print $2}'|awk '{print $1}'`
filename="$user"@"$ip".txt
echo "$ip" > "$filename"
rsync -avu --progress ./"$filename" "$remote_user"@"$remote_ip":~/remote_ip/
crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=""
*/1 * * * * /bin/bash /home/ubuntu/send_ip.sh
python实现(optional)
"""python
#desc:用于两个服务器相互联通访问ip是否可用
#TODO: 未来可以做成master/slaver的形式,确保机器重启后ip保持不变
"""
from threading import Thread,Lock
from configparser import ConfigParser
import socket
import os
import time
import sys
config_file = "config.ini"
if not os.path.join(config_file):
assert FileNotFoundError(config_file)
config = ConfigParser()
config.read(config_file)
lock = Lock()
def write_config_remote(ip,config_file):
config.set("remote","ip",ip)
with open(config_file,"w") as fp:
config.write(fp)
class ConnectServer(object):
def __init__(self,port=7776):
self.server = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
print(config.getint("my","port"))
self.server.bind(("0.0.0.0",config.getint("my","port")))
self.recv_th = Thread(target=self.receive_data)
self.send_th = Thread(target=self.send_data)
def start(self):
self.recv_th.start()
self.send_th.start()
self.recv_th.join()
self.send_th.join()
def receive_data(self):
while True:
try:
print("等待接受ip")
data, addr = self.server.recvfrom(1024)
print(data,addr)
if isinstance(data,bytes):
data = str(data,encoding="utf-8")
# write_data(data,file_path)
write_config_remote(data,config_file)
except InterruptedError:
exit()
except Exception as e:
pass
def send_data(self):
while True:
try:
my_ip = socket.gethostbyname(socket.gethostname()).encode()
self.server.sendto(my_ip,(config.get("target","ip"),config.getint("target","port")))
time.sleep(10)
except InterruptedError:
exit()
except Exception as e:
pass
if __name__ == "__main__":
server = ConnectServer()
server.start()
配置文件config.ini
[my]
ip = 0.0.0.0
port = 7771
name = zanghu
[target]
ip = 8.8.8.8
port = 7770
[remote]
ip = 1.1.1.1
参考
https://www.iteye.com/blog/happyqing-2352837