diff --git a/deploy.py b/deploy.py index 7b3db97..ff57f1c 100644 --- a/deploy.py +++ b/deploy.py @@ -101,16 +101,43 @@ def run_command(cmd, cwd=None, timeout=120, capture=True): return False, "", str(e) +def run_ssh_args(args, timeout=30, capture=True): + """执行 ssh/scp 命令(使用列表参数,避免 Windows cmd.exe 找不到 ssh)""" + try: + if capture: + result = subprocess.run( + args, shell=False, cwd=PROJECT_DIR, + capture_output=True, text=True, encoding='utf-8', errors='replace', + timeout=timeout + ) + return result.returncode == 0, result.stdout.strip(), result.stderr.strip() + else: + result = subprocess.run( + args, shell=False, cwd=PROJECT_DIR, timeout=timeout + ) + return result.returncode == 0, "", "" + except subprocess.TimeoutExpired: + return False, "", f"命令执行超时 ({timeout}s): {' '.join(args)}" + except Exception as e: + return False, "", str(e) + + def ssh_command(cmd, timeout=30): """在远程服务器执行命令""" - full = f'ssh {SSH_OPTS} {USERNAME}@{SERVER_IP} "{cmd}"' - return run_command(full, timeout=timeout) + return run_ssh_args([ + "ssh", "-o", "BatchMode=yes", "-o", "ConnectTimeout=10", + "-o", "StrictHostKeyChecking=no", + f"{USERNAME}@{SERVER_IP}", cmd + ], timeout=timeout) def scp_file(local, remote, timeout=120): """上传文件到远程服务器""" - full = f'scp {SSH_OPTS} "{local}" {USERNAME}@{SERVER_IP}:"{remote}"' - return run_command(full, timeout=timeout) + return run_ssh_args([ + "scp", "-o", "BatchMode=yes", "-o", "ConnectTimeout=10", + "-o", "StrictHostKeyChecking=no", + local, f"{USERNAME}@{SERVER_IP}:{remote}" + ], timeout=timeout) def check_ssh():