Bash скрипт для чтения и замены строки (внешний ip) в конце ssh config

telnet не является netcat. Протокол telnet — это больше, чем обычный TCP. Помимо прочего, он может иметь ряд опций, и «шум», который вы видите, — это согласование этих опций между вашим клиентом и сервером. Когда вы указываете порт, вы не видите никакого шума, потому что согласно руководству:

При подключении к нестандартному порту telnet пропускает любой автоматический запуск опций TELNET. Когда перед номером порта стоит знак минус, выполняется начальное согласование параметров.

Таким образом, ваша реализация telnet отключает согласование параметров, когда вы указываете порт (даже если порт равен 23), и повторно включает его, когда перед портом стоит знак минус.

В более общем плане, в наши дни, как правило, можно безопасно забыть о telnet.Вместо этого используйте netcat, если вам нужен простой простой TCP-клиент (или сервер, если уж на то пошло).

1
25.03.2016, 23:03
1 ответ

Мой вариант использования немного отличается, поскольку я хотел получить новый IP-адрес от экземпляра Amazon EC2. Также я написал скрипт на питоне, а не на 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()
0
27.01.2020, 23:48

Теги

Похожие вопросы