先把自己的 public key 送過去 (user charles-chang)。設定好 ssh 免 password.
準備 service file:
xeontitan:/etc/systemd/system# cat reportip.service [Unit] Description=send my ip address file to rdsuper Afteter=network-online.target [Service] User=charles-chang WorkingDirectory=/home/charles-chang ExecStart=/home/charles-chang/reportip.sh [Install] WantedBy=multi-user.targetcharles-chang 自己的 shell script:
cat /home/charles-chang/reportip.sh #!/bin/bash while true do ping -c 1 rdsuper if [ $? -eq 0 ] then break fi sleep 10 done ip addr > $HOSTNAME-ip scp $HOSTNAME-ip rdsuper:~/enable & start
systemctl daemon-reload systemctl enable reportip.service systemctl start reportip.service
改用 python 做,用 socket 直接 update /etc/hosts 的話: 叫 chatgpt 寫...
為了測試,先改 /etc/hosts_u 系統測試 OK 再改 /etc/hosts..
~$ cat updatehosts.py
import socket
def update_hosts_file(ip, hostname):
# Read the current contents of /etc/hosts
with open('/etc/hosts_u', 'r') as file:
lines = file.readlines()
# Check if the hostname already exists in the file
exists = False
for i, line in enumerate(lines):
if hostname in line:
# Update the existing entry
lines[i] = f"{ip} {hostname}\n"
exists = True
break
# If the hostname does not exist, add a new entry
if not exists:
lines.append(f"{ip} {hostname}\n")
# Write the updated contents back to /etc/hosts
with open('/etc/hosts_u', 'w') as file:
file.writelines(lines)
def start_server(port):
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(('0.0.0.0', port))
server_socket.listen(5)
print(f"Listening on port {port}...")
while True:
client_socket, client_address = server_socket.accept()
print(f"Connection from {client_address}")
data = client_socket.recv(1024).decode('utf-8')
if data:
ip, hostname = data.split(',')
update_hosts_file(ip, hostname)
print(f"Updated /etc/hosts with IP: {ip}, Hostname: {hostname}")
client_socket.close()
if __name__ == "__main__":
start_server(61234)
然後 systemd service file:
$ cat updatehosts.service [Unit] Description=Sender Python Service After=network-online.target Wants=network-online.target [Service] Type=simple ExecStart=/usr/bin/python3 /home/charles-chang/updatehosts.py Restart=on-failure [Install] WantedBy=multi-user.target
至於 sender 端,因為要等 dhcp ready...
要注意 nic interface name 是不是 eno1,不一定是。
要依照自己的系統修改。
$ cat sender_updatehosts.py
import socket
import time
import netifaces
SERVER_IP = '192.168.147.182'
SERVER_PORT = 61234
def get_ip_address(interface):
try:
ip_address = netifaces.ifaddresses(interface)[netifaces.AF_INET][0]['addr']
except (ValueError, KeyError):
ip_address = None
hostname = socket.gethostname()
return ip_address, hostname
def send_data(ip, hostname):
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.connect((SERVER_IP, SERVER_PORT))
message = f"{ip},{hostname}"
s.sendall(message.encode('utf-8'))
response = s.recv(1024)
print('Received', repr(response))
def main():
interface = 'eno1'
while True:
ip, hostname = get_ip_address(interface)
if ip:
break
print("Waiting for valid IP address...")
time.sleep(5)
send_data(ip, hostname)
if __name__ == "__main__":
main()
沒有留言:
張貼留言