![Bash 脚本读取并替换 ssh 配置末尾的字符串(外部 IP)](https://linux22.com/image/86335/Bash%20%E8%84%9A%E6%9C%AC%E8%AF%BB%E5%8F%96%E5%B9%B6%E6%9B%BF%E6%8D%A2%20ssh%20%E9%85%8D%E7%BD%AE%E6%9C%AB%E5%B0%BE%E7%9A%84%E5%AD%97%E7%AC%A6%E4%B8%B2%EF%BC%88%E5%A4%96%E9%83%A8%20IP%EF%BC%89.png)
我需要一个脚本来获取外部 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()