Bashスクリプトは、SSH構成(外部IP)の末尾の文字列を読み取って置き換えます。

Bashスクリプトは、SSH構成(外部IP)の末尾の文字列を読み取って置き換えます。

外部 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()

関連情報