reach(.py)
📝 PythonNot sure if it is something to be proud about. But I was working on my 32-bit machine and you know what, no audio. Sad. No agentic system would want to work on a 32-bit machine and my own rescue harness became accidentally a frontier agent system beating Grok (can happen often) so i was fucked.
So, I made a script like below (this one is obviously vibed) to connect to a machine with port forwarding and a stream back so Claude can go hard on repairing my machine.
It worked in one time. Feels good.
Wat felt less good, it was just the volume on certain level. Failure.
Python
#!/usr/bin/env python3
# retoor <retoor@molodetz.nl>
import base64
import getpass
import os
import subprocess
import sys
import tempfile
DEFAULT_PORT = 2222
GATEWAY = "retoor@molodetz.nl"
TOHOME = """\
import subprocess, sys
port, user = sys.argv[1:3]
sys.exit(subprocess.call(["ssh", "-p", port, "%s@localhost" % user]))
"""
TOTHERE = """\
import shlex, subprocess, sys
port, payload, gateway, user = sys.argv[1:5]
remote = "f=$(mktemp); trap 'rm -f $f' EXIT; echo %s | base64 -d > $f; python3 $f %s %s" % (payload, port, shlex.quote(user))
command = ["sudo", "ssh", "-t", "-o", "ExitOnForwardFailure=yes", "-o", "ServerAliveInterval=30",
"-o", "ServerAliveCountMax=3", "-R", "%s:127.0.0.1:22" % port, gateway, remote]
sys.exit(subprocess.call(command))
"""
USAGE = """\
reach [poort | -h | --help]
Zet op deze computer een reverse tunnel naar molodetz (standaard poort 2222) en
opent daar een sessie terug naar deze computer. Zolang reach draait is deze
computer vanaf molodetz bereikbaar via: ssh -p 2222 user@localhost
Hierin is user de gebruikersnaam waarmee reach op deze computer draait.
Alle commando's hieronder voer je op molodetz uit, in een tweede terminal.
Gebruiksvoorbeelden
1. Interactief herstel
reach
De sessie die reach opent is een shell op deze computer.
2. Supersnelle backup van veel bestanden (tar-stroom, geen overhead per bestand)
ssh -p 2222 user@localhost 'tar -cf - -C /home/user . | zstd -T0 -3' > backup.tar.zst
Zonder zstd: vervang zstd -T0 -3 door gzip -1.
3. Incrementele synchronisatie met behoud van rechten
rsync -aHAX --info=progress2 -e 'ssh -p 2222' user@localhost:/home/user/ ./kopie/
4. Directe prompt naar een LLM met live data van deze computer
ssh -p 2222 user@localhost 'journalctl -k -n 200' \\
| jq -Rs '{model: "x-ai/grok-4.3", messages: [{role: "user", content: ("Analyseer deze kernellog:\\n" + .)}]}' \\
| curl -s https://openrouter.ai/api/v1/chat/completions \\
-H "Authorization: Bearer $OPENROUTER_API_KEY" -H "Content-Type: application/json" -d @- \\
| jq -r '.choices[0].message.content'
5. Eenmalige diagnose zonder interactieve sessie
ssh -p 2222 user@localhost 'lspci -nnk; aplay -l; amixer -c 0 scontents; dmesg | tail -50'
6. Bestanden verplaatsen
scp -P 2222 ./bestand user@localhost:/tmp/
scp -P 2222 user@localhost:/var/log/syslog ./syslog.remote
7. Een webinterface of dienst op deze computer lokaal openen
ssh -p 2222 -N -L 8080:localhost:80 user@localhost
Daarna is de dienst bereikbaar op http://localhost:8080 op molodetz.
8. Schijfimage maken (vereist sudo zonder wachtwoord op deze computer)
ssh -p 2222 user@localhost 'sudo dd if=/dev/sda bs=4M status=none | gzip -1' > schijf.img.gz
9. Beheer en updates op afstand
ssh -p 2222 user@localhost 'sudo apt-get update && sudo apt-get -y upgrade'
10. Grote bestanden hervatbaar overzetten
rsync -P --partial -e 'ssh -p 2222' user@localhost:/pad/groot.iso ./
11. Meerdere computers in een keer controleren
for poort in 2222 2223 2224; do ssh -p $poort user@localhost hostname; done
Start dan op elke computer reach met een eigen poort, bijvoorbeeld reach 2223.
12. Vrije shell, zelf bepalen wat je doet
ssh -p 2222 user@localhost
Je komt direct in een volledige shell op deze computer terecht. Dit is
dezelfde verbinding die reach zelf opent, dus je kunt er ook met sudo
werken en alles uitvoeren wat nodig is.
"""
def parse_port():
if len(sys.argv) < 2:
return DEFAULT_PORT
try:
port = int(sys.argv[1])
except ValueError:
raise SystemExit("Poort moet een getal zijn: %s" % sys.argv[1])
if not 1024 <= port <= 65535:
raise SystemExit("Poort moet tussen 1024 en 65535 liggen")
return port
def encode(source):
return base64.b64encode(source.encode()).decode()
def main():
if len(sys.argv) > 1 and sys.argv[1] in ("-h", "--help"):
print(USAGE, end="")
return 0
port = parse_port()
with tempfile.TemporaryDirectory() as directory:
path = os.path.join(directory, "tothere")
with open(path, "w") as handle:
handle.write(TOTHERE)
command = ["python3", path, str(port), encode(TOHOME), GATEWAY, getpass.getuser()]
return subprocess.call(command)
if __name__ == "__main__":
sys.exit(main())
Comments
No comments yet. Start the discussion.