Files
2026-11-11 14:22:02 +08:00

32 lines
1.5 KiB
Python

"""Temporary deployment transport. Passwords stay in memory; host key is pinned."""
import getpass,json,sys,traceback
from pathlib import Path
sys.path.insert(0,str(Path(__file__).resolve().parent/'deploy-python'))
import paramiko
client=paramiko.SSHClient()
client.load_host_keys(str(Path(__file__).resolve().parent/'deploy-known-hosts'))
client.set_missing_host_key_policy(paramiko.RejectPolicy())
password=getpass.getpass('SSH password (not stored): ')
client.connect('39.97.232.35',username='root',password=password,look_for_keys=False,allow_agent=False,timeout=12,auth_timeout=12)
del password
print('SSH_READY',flush=True)
for line in sys.stdin:
try:
request=json.loads(line)
if request['action']=='close':break
if request['action']=='exec':
_,stdout,stderr=client.exec_command(request['command'],timeout=request.get('timeout',45))
out=stdout.read().decode('utf-8','replace');err=stderr.read().decode('utf-8','replace')
result={'exit':stdout.channel.recv_exit_status(),'out':out,'err':err}
elif request['action'] in ('upload','download'):
with client.open_sftp() as sftp:
if request['action']=='upload':sftp.put(request['local'],request['remote'])
else:sftp.get(request['remote'],request['local'])
result={'ok':True}
else:raise ValueError('Unsupported deployment action')
print(json.dumps(result,ensure_ascii=False),flush=True)
except Exception as exc:
print(json.dumps({'error':type(exc).__name__,'message':str(exc)},ensure_ascii=False),flush=True)
client.close()