외부 ioaddress를 가져와 SSH 구성 파일 끝에서 바꾸는 스크립트가 필요합니다.
나는 지금까지
#!/bin/sh
IP=$(wget http://ipecho.net/plain -qO-)
변수의 경우 에코할 수 있지만 아래와 같이 SSH 구성에서 현재 외부 IP를 새 IP로 바꾸는 방법이 필요합니다.
Host $IP
User UserName
Port 22
IdentityFile ~/.ssh/id_rsa
Host home
HostName 192.168.0.1
Host away
HostName 97.113.55.62
떠나는 것은 외부적이다
그래서 내가 필요한 것은 내 SSH 구성 ex에서 외부 IP를 교체하는 것입니다. 호스트 이름 192.168.0.1(기존 IP) 호스트 이름 192.168.0.2(새 IP)
답변1
또한 OLDIP를 교체하려고 하므로 이를 식별해야 합니다.
OLDIP=`grep -w away -A 1 /etc/ssh/ssh_config | awk '/Hostname/ {print $2}'`
여기의 호스트 이름 줄은 이 줄 바로 아래에 있어야 합니다 . 그렇지 않으면 로 Host away
조정해야 합니다 .-A 1
-A 2
-w away
"away"라는 단어가 포함된 행과 일치합니다.
-A 1
이전에 일치한 줄 뒤에 줄을 표시합니다.
awk '/Hostname/ {print $2}'
이전 일치 행에서 호스트 이름 행만 유지하고 두 번째 열만 유지합니다.
그런 다음 OLDIP를 IP로 바꾸기 위해 sed를 실행합니다.
sed -i "s/$OLDIP/$IP/g" /etc/ssh/ssh_config
구멍은 다음과 같습니다.
#!/bin/sh
IP=$(wget http://ipecho.net/plain -qO-)
OLDIP=`grep -w away -A 1 /etc/ssh/ssh_config | awk '/Hostname/ {print $2}'`
sed -i "s/$OLDIP/$IP/g" /etc/ssh/ssh_config
답변2
내 사용 사례는 Amazon EC2 인스턴스에서 새 IP를 가져오려는 점에서 약간 다릅니다. 또한 bash 대신 Python으로 스크립트를 작성했습니다. 그러나 나는 이해하고, 적응하고, 유지하는 것이 쉽다는 것을 알게 될 것이라고 생각합니다.
#!/usr/bin/env python2
# -*- coding: utf-8 -*-
"""
Script to automatically update the SSH host name when
an AWS EC2 instance changes IP after reboot.
Call it like this:
$ ~/repos/scripts/update_aws_hostname.py i-06bd23cd0514c2c7d windows
"""
# Built-in modules #
import sys, argparse
from os.path import expanduser
# Third party modules #
import sshconf, boto3
# Constants #
ec2 = boto3.client('ec2')
###############################################################################
class UpdateHostnameFromEC2(object):
"""A singleton. EC2 is provided by Amazon Web Services."""
def __init__(self, instance_id, ssh_shortcut):
self.instance_id = instance_id
self.ssh_shortcut = ssh_shortcut
def __call__(self):
# Read SSH config #
self.config = sshconf.read_ssh_config(expanduser("~/.ssh/config"))
# Get new DNS #
self.response = ec2.describe_instances(InstanceIds=[self.instance_id])
self.new_dns = self.response['Reservations'][0]['Instances'][0]['PublicDnsName']
self.tags = self.response['Reservations'][0]['Instances'][0]['Tags']
self.instance_name = [i['Value'] for i in self.tags if i['Key']=='Name'][0]
# Substitute #
self.config.set(self.ssh_shortcut, Hostname=self.new_dns)
# Write SSH config #
self.config.write(expanduser("~/.ssh/config"))
# Success #
message = "Updated the ssh config host '%s' for '%s'."
message = message % (self.ssh_shortcut, self.instance_name)
print(message)
###############################################################################
if __name__ == "__main__":
# Parse the shell arguments #
parser = argparse.ArgumentParser(description=sys.modules[__name__].__doc__)
parser.add_argument("instance_id", help="ID of the instance to update from EC2", type=str)
parser.add_argument("ssh_shortcut", help="The ssh config host name (shortcut)", type=str)
args = parser.parse_args()
# Create the singleton and run it #
update_config = UpdateHostnameFromEC2(args.instance_id, args.ssh_shortcut)
update_config()