實現兩臺linux服務器互相傳遞ip

實現兩臺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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章