first commit
This commit is contained in:
commit
3fb78dcafb
6 changed files with 570 additions and 0 deletions
108
add_host.py
Normal file
108
add_host.py
Normal file
|
@ -0,0 +1,108 @@
|
|||
import os
|
||||
import subprocess
|
||||
|
||||
class Colors:
|
||||
GREEN = "\033[0;32m"
|
||||
RED = "\033[0;31m"
|
||||
YELLOW = "\033[1;33m"
|
||||
CYAN = "\033[0;36m"
|
||||
BOLD = "\033[1m"
|
||||
RESET = "\033[0m"
|
||||
|
||||
def print_error(message):
|
||||
print(f"{Colors.RED}{Colors.BOLD}[✖] {Colors.RESET}{message}")
|
||||
|
||||
def print_warning(message):
|
||||
print(f"{Colors.YELLOW}{Colors.BOLD}[⚠] {Colors.RESET}{message}")
|
||||
|
||||
def print_info(message):
|
||||
print(f"{Colors.GREEN}{Colors.BOLD}[✔] {Colors.RESET}{message}")
|
||||
|
||||
def add_host(CONF_DIR):
|
||||
"""
|
||||
Interactive prompt to create a new SSH host in ~/.ssh/conf/<label>/config.
|
||||
Offers to generate a new SSH key pair (ed25519) quietly (-q),
|
||||
and then prompt to copy that key to the remote server via ssh-copy-id.
|
||||
"""
|
||||
print_info("Adding a new SSH host...")
|
||||
|
||||
host_label = input("Enter Host label (e.g. myserver): ").strip()
|
||||
if not host_label:
|
||||
print_error("Host label cannot be empty.")
|
||||
return
|
||||
|
||||
hostname = input("Enter HostName (IP or domain): ").strip()
|
||||
if not hostname:
|
||||
print_error("HostName cannot be empty.")
|
||||
return
|
||||
|
||||
user = input("Enter username (default: 'root'): ").strip() or "root"
|
||||
port = input("Enter SSH port (default: 22): ").strip() or "22"
|
||||
|
||||
# Create subdirectory: ~/.ssh/conf/<label>
|
||||
host_dir = os.path.join(CONF_DIR, host_label)
|
||||
if os.path.exists(host_dir):
|
||||
print_warning(f"Directory {host_dir} already exists; continuing anyway.")
|
||||
else:
|
||||
os.makedirs(host_dir, mode=0o700, exist_ok=True)
|
||||
print_info(f"Created directory: {host_dir}")
|
||||
|
||||
config_path = os.path.join(host_dir, "config")
|
||||
if os.path.exists(config_path):
|
||||
print_warning(f"Config file already exists: {config_path}; it will be overwritten/updated.")
|
||||
|
||||
# Ask about generating an SSH key
|
||||
gen_key_choice = input("Generate a new ed25519 SSH key for this host? (y/n): ").lower().strip()
|
||||
identity_file = ""
|
||||
|
||||
if gen_key_choice == 'y':
|
||||
key_path = os.path.join(host_dir, "id_ed25519")
|
||||
if os.path.exists(key_path):
|
||||
print_warning(f"{key_path} already exists. Skipping generation.")
|
||||
identity_file = key_path
|
||||
else:
|
||||
# Generate a new SSH key (quietly, suppressing randomart)
|
||||
cmd = ["ssh-keygen", "-q", "-t", "ed25519", "-N", "", "-f", key_path]
|
||||
try:
|
||||
subprocess.check_call(cmd)
|
||||
print_info(f"Generated new SSH key at {key_path}")
|
||||
identity_file = key_path
|
||||
|
||||
# Prompt to copy the key to the server
|
||||
copy_key = input("Would you like to copy this key to the server now? (y/n): ").lower().strip()
|
||||
if copy_key == 'y':
|
||||
ssh_copy_cmd = ["ssh-copy-id", "-i", key_path]
|
||||
if port != "22":
|
||||
ssh_copy_cmd += ["-p", port]
|
||||
ssh_copy_cmd.append(f"{user}@{hostname}")
|
||||
try:
|
||||
subprocess.check_call(ssh_copy_cmd)
|
||||
print_info("Key successfully copied to remote server.")
|
||||
except subprocess.CalledProcessError as e:
|
||||
print_error(f"Error copying key to server: {e}")
|
||||
except subprocess.CalledProcessError as e:
|
||||
print_error(f"Error generating SSH key: {e}")
|
||||
else:
|
||||
# If not generating a new key, optionally ask for an existing path
|
||||
existing_key = input("Enter existing IdentityFile path (or leave empty to skip): ").strip()
|
||||
if existing_key:
|
||||
identity_file = os.path.expanduser(existing_key)
|
||||
|
||||
# Build the config lines
|
||||
config_lines = [
|
||||
f"Host {host_label}",
|
||||
f" HostName {hostname}",
|
||||
f" User {user}",
|
||||
f" Port {port}"
|
||||
]
|
||||
if identity_file:
|
||||
config_lines.append(f" IdentityFile {identity_file}")
|
||||
|
||||
# Write (or overwrite) the config
|
||||
try:
|
||||
with open(config_path, "w") as f:
|
||||
for line in config_lines:
|
||||
f.write(line + "\n")
|
||||
print_info(f"Created/updated config at: {config_path}")
|
||||
except Exception as e:
|
||||
print_error(f"Failed to write config to {config_path}: {e}")
|
Loading…
Add table
Add a link
Reference in a new issue