Bash 脚本读取并替换 ssh 配置末尾的字符串(外部 IP)

Bash 脚本读取并替换 ssh 配置末尾的字符串(外部 IP)

我需要一个脚本来获取外部 ioaddress 并在 ssh 配置文件末尾替换

我到目前为止

#!/bin/sh
IP=$(wget http://ipecho.net/plain -qO-)

对于变量,我可以 echo 但需要一种方法在 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}'从之前匹配的几行中,我们只保留主机名行,然后我们只保留第二列。


然后我们只需执行 sed 将 OLDIP 替换为 IP。

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。我还用 python 而不是 bash 编写了脚本。但我认为你会发现很容易理解、适应和维护:

#!/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()

相关内容