Webseite überarbeitet und Telegram Bot funktion hinzugefügt #1
49
main.py
49
main.py
@@ -178,7 +178,7 @@ async def get_remote_info(ip, user):
|
|||||||
"""Versucht Linux/Mac-Infos zu lesen, falls fehlgeschlagen, dann Windows."""
|
"""Versucht Linux/Mac-Infos zu lesen, falls fehlgeschlagen, dann Windows."""
|
||||||
# 1. Versuch: Linux/Mac
|
# 1. Versuch: Linux/Mac
|
||||||
linux_cmd = "uname -m && (sw_vers -productName 2>/dev/null || grep PRETTY_NAME /etc/os-release 2>/dev/null | cut -d= -f2 || uname -s) && (command -v docker >/dev/null 2>&1 && echo 1 || echo 0)"
|
linux_cmd = "uname -m && (sw_vers -productName 2>/dev/null || grep PRETTY_NAME /etc/os-release 2>/dev/null | cut -d= -f2 || uname -s) && (command -v docker >/dev/null 2>&1 && echo 1 || echo 0)"
|
||||||
ssh_cmd = f"ssh -o StrictHostKeyChecking=no -o ConnectTimeout=3 {user}@{ip} \"{linux_cmd}\""
|
ssh_cmd = f"ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o ConnectTimeout=3 {user}@{ip} \"{linux_cmd}\""
|
||||||
|
|
||||||
try:
|
try:
|
||||||
output = subprocess.check_output(ssh_cmd, shell=True, stderr=subprocess.DEVNULL).decode().strip().split('\n')
|
output = subprocess.check_output(ssh_cmd, shell=True, stderr=subprocess.DEVNULL).decode().strip().split('\n')
|
||||||
@@ -194,7 +194,7 @@ async def get_remote_info(ip, user):
|
|||||||
# 2. Versuch: Windows (CMD)
|
# 2. Versuch: Windows (CMD)
|
||||||
# ver = OS Version, echo %PROCESSOR_ARCHITECTURE% = Arch, where docker = Docker Check
|
# ver = OS Version, echo %PROCESSOR_ARCHITECTURE% = Arch, where docker = Docker Check
|
||||||
win_cmd = 'ver && echo %PROCESSOR_ARCHITECTURE% && (where docker >nul 2>&1 && echo 1 || echo 0)'
|
win_cmd = 'ver && echo %PROCESSOR_ARCHITECTURE% && (where docker >nul 2>&1 && echo 1 || echo 0)'
|
||||||
ssh_cmd = f"ssh -o StrictHostKeyChecking=no -o ConnectTimeout=3 {user}@{ip} \"{win_cmd}\""
|
ssh_cmd = f"ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o ConnectTimeout=3 {user}@{ip} \"{win_cmd}\""
|
||||||
|
|
||||||
try:
|
try:
|
||||||
output = subprocess.check_output(ssh_cmd, shell=True).decode().strip().split('\n')
|
output = subprocess.check_output(ssh_cmd, shell=True).decode().strip().split('\n')
|
||||||
@@ -218,43 +218,36 @@ async def get_remote_info(ip, user):
|
|||||||
|
|
||||||
# --- ERWEITERTES NODE BOOTSTRAPPING (Inventur) ---
|
# --- ERWEITERTES NODE BOOTSTRAPPING (Inventur) ---
|
||||||
async def bootstrap_node(ip, user, password):
|
async def bootstrap_node(ip, user, password):
|
||||||
await manager.broadcast(f"🔑 Starte Kopplung für {ip}...")
|
await manager.broadcast(f"🔑 Kopple {ip}...")
|
||||||
|
|
||||||
with open(f"{SSH_KEY}.pub", "r") as f:
|
with open(f"{SSH_KEY}.pub", "r") as f:
|
||||||
pub_key = f.read().strip()
|
pub_key = f.read().strip()
|
||||||
|
|
||||||
# Dieses PowerShell-Skript ist der "Universalschlüssel" für Windows:
|
# Wir nutzen ein absolut minimalistisches Kommando.
|
||||||
# 1. Prüft ob Admin-Pfad oder User-Pfad nötig ist
|
# Es erstellt das Verzeichnis (falls nötig) und hängt den Key an.
|
||||||
# 2. Schreibt den Key
|
# Das funktioniert in der Windows CMD und der Linux Bash.
|
||||||
# 3. Entzieht allen anderen Usern die Rechte an der Datei (Wichtig!)
|
cmd_universal = f'mkdir .ssh & echo {pub_key} >> .ssh/authorized_keys'
|
||||||
ps_script = f"""
|
|
||||||
$key = '{pub_key}';
|
|
||||||
$isAdmin = (new-principal -id ((get-item -path "C:\\").GetAccessControl().Owner)).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator);
|
|
||||||
if ($isAdmin) {{
|
|
||||||
$path = "$env:ProgramData\\ssh\\administrators_authorized_keys";
|
|
||||||
}} else {{
|
|
||||||
$path = "$HOME\\.ssh\\authorized_keys";
|
|
||||||
if (!(Test-Path "$HOME\\.ssh")) {{ New-Item -ItemType Directory -Path "$HOME\\.ssh" }};
|
|
||||||
}}
|
|
||||||
$key | Out-File -FilePath $path -Encoding ascii -Append;
|
|
||||||
icacls.exe $path /inheritance:r /grant "Administrators:F" /grant "SYSTEM:F" /grant "$env:USERNAME:F";
|
|
||||||
"""
|
|
||||||
|
|
||||||
# Wir escapen das Skript für die Shell
|
# sshpass direkt mit dem simplen Befehl
|
||||||
ps_cmd = ps_script.replace('\n', ' ').strip()
|
setup_cmd = f"sshpass -p '{password}' ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null {user}@{ip} \"{cmd_universal}\""
|
||||||
setup_cmd = f"sshpass -p '{password}' ssh -o StrictHostKeyChecking=no {user}@{ip} \"powershell -Command {ps_cmd}\""
|
|
||||||
|
|
||||||
try:
|
try:
|
||||||
proc = subprocess.run(setup_cmd, shell=True, capture_output=True, text=True, timeout=20)
|
# Wir führen es aus. Das "2x Passwort"-Problem kommt oft von TTY-Anfragen.
|
||||||
|
# Wir unterdrücken das mit -o StrictHostKeyChecking=no
|
||||||
|
proc = subprocess.run(setup_cmd, shell=True, capture_output=True, text=True, timeout=15)
|
||||||
|
|
||||||
if proc.returncode == 0:
|
if proc.returncode == 0:
|
||||||
await manager.broadcast(f"✅ Key-Transfer & Rechtekorrektur auf {ip} erfolgreich.")
|
await manager.broadcast(f"✅ Key an {ip} übertragen.")
|
||||||
else:
|
else:
|
||||||
await manager.broadcast(f"⚠️ Kopplung evtl. unvollständig: {proc.stderr}")
|
# Falls 'mkdir' einen Fehler wirft (weil Ordner existiert), ist das egal,
|
||||||
|
# solange der Key danach drin ist.
|
||||||
|
await manager.broadcast(f"ℹ️ Info: {ip} antwortet (Key-Check folgt).")
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
await manager.broadcast(f"❌ Fehler: {e}")
|
await manager.broadcast(f"❌ Fehler: {e}")
|
||||||
|
|
||||||
# Danach folgt deine Inventur (OS/Arch Check)...
|
# Inventur (get_remote_info) prüft jetzt, ob es wirklich klappt
|
||||||
await manager.broadcast(f"🔍 Inventur auf {ip} wird durchgeführt...")
|
await manager.broadcast(f"🔍 Teste schlüssellosen Zugriff auf {ip}...")
|
||||||
info = await get_remote_info(ip, user)
|
info = await get_remote_info(ip, user)
|
||||||
|
|
||||||
if info:
|
if info:
|
||||||
@@ -470,7 +463,7 @@ async def chat_endpoint(websocket: WebSocket):
|
|||||||
|
|
||||||
async def run_remote_task(ip, user, cmd):
|
async def run_remote_task(ip, user, cmd):
|
||||||
await manager.broadcast(f"🚀 Task: {cmd} auf {ip}")
|
await manager.broadcast(f"🚀 Task: {cmd} auf {ip}")
|
||||||
proc = await asyncio.create_subprocess_shell(f"ssh -o StrictHostKeyChecking=no {user}@{ip} '{cmd}'", stdout=asyncio.subprocess.PIPE, stderr=asyncio.subprocess.STDOUT)
|
proc = await asyncio.create_subprocess_shell(f"ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null {user}@{ip} '{cmd}'", stdout=asyncio.subprocess.PIPE, stderr=asyncio.subprocess.STDOUT)
|
||||||
full_output = ""
|
full_output = ""
|
||||||
while True:
|
while True:
|
||||||
line = await proc.stdout.readline()
|
line = await proc.stdout.readline()
|
||||||
|
|||||||
Reference in New Issue
Block a user