外部 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}'
前の一致行では、ホスト名の行のみを保持し、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()