fix: target-mode now runs with capture=False (interactive), so user sees prompts and can respond

This commit is contained in:
2026-05-23 00:16:54 +04:00
parent 80bb196d24
commit c8bef6b41a

View File

@@ -57,7 +57,7 @@ def do_transfer():
scp_opts_common += " -o BatchMode=yes" scp_opts_common += " -o BatchMode=yes"
info("Пробуем ключевую аутентификацию (BatchMode)") info("Пробуем ключевую аутентификацию (BatchMode)")
# Вспомогательная функция: выполнить SSH-команду # Вспомогательная функция: выполнить SSH-команду (capture=True, для скриптов)
def ssh_cmd(remote_cmd, timeout=30): def ssh_cmd(remote_cmd, timeout=30):
if password: if password:
full = f"sshpass -p '{password}' ssh {ssh_opts_common} {user}@{host} '{remote_cmd}'" full = f"sshpass -p '{password}' ssh {ssh_opts_common} {user}@{host} '{remote_cmd}'"
@@ -65,6 +65,14 @@ def do_transfer():
full = f"ssh {ssh_opts_common} {user}@{host} '{remote_cmd}'" full = f"ssh {ssh_opts_common} {user}@{host} '{remote_cmd}'"
return run(full, check=False, timeout=timeout) return run(full, check=False, timeout=timeout)
# Интерактивный SSH (capture=False, для target-mode и другого интерактивного ввода)
def ssh_cmd_interactive(remote_cmd, timeout=300):
if password:
full = f"sshpass -p '{password}' ssh {ssh_opts_common} {user}@{host} '{remote_cmd}'"
else:
full = f"ssh {ssh_opts_common} {user}@{host} '{remote_cmd}'"
return run(full, check=False, capture=False, timeout=timeout)
# Вспомогательная функция: выполнить scp # Вспомогательная функция: выполнить scp
def scp_cmd(src, dst, timeout=60): def scp_cmd(src, dst, timeout=60):
if password: if password:
@@ -152,9 +160,9 @@ def do_transfer():
warn("Не удалось передать скрипт на новый сервер.") warn("Не удалось передать скрипт на новый сервер.")
success(f"Архив передан. Запустите на новом сервере: python3 core/main.py --mode=target --remote-dir={remote_dir}") success(f"Архив передан. Запустите на новом сервере: python3 core/main.py --mode=target --remote-dir={remote_dir}")
else: else:
# 3. Распаковываем и запускаем # 3. Распаковываем и запускаем (интерактивно, т.к. target-mode спрашивает у пользователя)
ssh_cmd(f"mkdir -p /opt/docker-migrate-tool && tar xzf {tool_remote} -C /opt/docker-migrate-tool") ssh_cmd_interactive(f"mkdir -p /opt/docker-migrate-tool && tar xzf {tool_remote} -C /opt/docker-migrate-tool")
ssh_cmd(f"cd /opt/docker-migrate-tool && python3 core/main.py --mode=target --remote-dir={remote_dir}", timeout=300) ssh_cmd_interactive(f"cd /opt/docker-migrate-tool && python3 core/main.py --mode=target --remote-dir={remote_dir}", timeout=600)
else: else:
success(f"Архив передан. Запустите на новом сервере: python3 core/main.py --mode=target --remote-dir={remote_dir}") success(f"Архив передан. Запустите на новом сервере: python3 core/main.py --mode=target --remote-dir={remote_dir}")