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}'이전 일치 행에서 호스트 이름 행만 유지하고 두 번째 열만 유지합니다.


그런 다음 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()

관련 정보