made cssh also work with ssh config host ids

eg
```sh
cssh monitoring.tunnel
```
fixes [https://bugzilla.ipr.univ-rennes.fr/show_bug.cgi?id=4405]
This commit is contained in:
Guillaume Raffy 2026-06-25 12:35:24 +02:00
parent 863e08606b
commit 4d6a14f4e2
1 changed files with 107 additions and 3 deletions

View File

@ -1,11 +1,13 @@
#!/usr/bin/env python3
import logging
from typing import Optional, List
from typing import Optional, List, Dict
import argparse
import re
import subprocess
import abc
import atexit
from pathlib import Path
import os
class RgbColor():
@ -354,16 +356,118 @@ def get_host_real_fqdn(host_id: HostId) -> HostId:
assert is_valid_host_fqdn(host_real_fqdn), f'invalid host name: {host_real_fqdn}'
return host_real_fqdn
class SshHostConfig():
'''
Host flique-macpro6.tunnel
hostname flique-macpro6.ipr.univ-rennes1.fr
user francois
ProxyCommand ssh graffy@tunnel1.ipr.univ-rennes1.fr nc %h %p 2> /dev/null
Host physix-frontal.ipr.univ-rennes1.fr
hostname physix-frontal.ipr.univ-rennes1.fr
user graffy
IdentityFile ~/.ssh/homekey
Host gpgpu
hostname physix58.ipr.univ-rennes1.fr
ProxyCommand ssh -i ~/.ssh/homekey graffy@physix.ipr.univ-rennes1.fr nc %h %p 2> /dev/null
IdentityFile ~/.ssh/homekey
Host gpu-p100
hostname physix90.ipr.univ-rennes1.fr
ProxyCommand ssh -i ~/.ssh/homekey graffy@physix.ipr.univ-rennes1.fr nc %h %p 2> /dev/null
IdentityFile ~/.ssh/homekey
Host cloud.tunnel
hostname cloud.ipr.univ-rennes.fr
ProxyCommand ssh graffy@tunnel1.ipr.univ-rennes.fr nc %h %p 2> /dev/null
Host adminpod-1.tunnel
hostname adminpod-1.ipr.univ-rennes.fr
ProxyCommand ssh graffy@tunnel1.ipr.univ-rennes1.fr nc %h %p 2> /dev/null
Host mazinger.tunnel
hostname mazinger.ipr.univ-rennes.fr
ProxyCommand ssh graffy@tunnel1.ipr.univ-rennes1.fr nc %h %p 2> /dev/null
# git.ipr.univ-rennes.fr
Host vmipr-p1 git
hostname vmipr-p1.univ-rennes.fr
User graffy
IdentityFile ~/.ssh/id_ed25519
'''
names: List[SshHostConfigId] # eg ['vmipr-p1', 'git']
attrs: Dict[SshHostConfigAttr, str] # eg {'hostname': 'vmipr-p1.univ-rennes.fr', 'User': 'graffy', 'IdentityFile': '~/.ssh/id_ed25519'}
def __init__(self):
self.names = []
self.attrs = {}
class SshConfig():
host_configs = List[SshHostConfig]
def __init__(self):
self.host_configs = []
def get_host_name(self, host_config_id) -> Optional[str]:
host_name = None
for host_conf in self.host_configs:
if host_config_id in host_conf.names:
host_name = host_conf.attrs['hostname']
break
return host_name
def parse_ssh_config(ssh_config_file_path) -> SshConfig:
ssh_config = SshConfig()
with open(ssh_config_file_path, 'rt', encoding='utf8') as f:
for line in f.readlines():
logging.debug('line = %s', line)
# skip comments
if re.match(r'^\s*#.*$', line):
continue
match = re.match(r'^\s*(?P<attr_name>[^\s]+)\s+(?P<attr_value>.*)$', line)
if match:
# Host vmipr-p1 git
# hostname vmipr-p1.univ-rennes.fr
# User graffy
# IdentityFile ~/.ssh/id_ed25519
attr_name = match['attr_name'].lower()
attr_value = match['attr_value']
logging.debug('attr_name = %s', attr_name)
if attr_name == 'host':
host_config_ids = attr_value.split(' ')
ssh_config.host_configs.append(SshHostConfig())
ssh_config.host_configs[-1].names = host_config_ids
else:
ssh_config.host_configs[-1].attrs[attr_name] = attr_value
continue
return ssh_config
def main():
logging.basicConfig(level=logging.INFO)
logging.basicConfig(level=logging.DEBUG)
arg_parser = argparse.ArgumentParser('cssh (colored ssh) opens a terminal window with a background color that depends on the fully qualified domain name of the target machine')
arg_parser.add_argument('ssh_target', help='eg root@alambix50.ipr.univ-rennes.fr')
args = arg_parser.parse_args()
logging.debug(args)
ssh_target = SshTarget(args.ssh_target) # eg 'root@alambix50.ipr.univ-rennes.fr'
ssh_target.host_id = get_host_real_fqdn(ssh_target.host_id)
ssh_config_file_path: Path = Path(os.getenv('HOME')) / '.ssh' / 'config'
host_real_name = ssh_target.host_id
if ssh_config_file_path.exists():
ssh_config = parse_ssh_config(ssh_config_file_path)
hn = ssh_config.get_host_name(ssh_target.host_id)
if hn:
host_real_name = hn
logging.debug('host_real_name = %s', host_real_name)
ssh_target.host_id = get_host_real_fqdn(host_real_name)
logging.debug('ssh_target.host_id = %s', ssh_target.host_id)
# AS_ROOT='false'
# if [ "$(echo $@ | grep '^root@' > /dev/null)" ]