fix: full sshpass support for password-based transfer; pre-flight SSH check; clear error diagnostics

This commit is contained in:
2026-05-22 23:28:27 +04:00
parent 4a1e7923de
commit 7d45d1f8c0
3 changed files with 78 additions and 49 deletions
+13 -6
View File
@@ -381,9 +381,16 @@ def do_transfer_offer():
from transfer.transfer import do_transfer
do_transfer()
else:
# Пользователь отказался от ключа — очищаем старый ssh_key из state
state.set_stage("TRANSFER", target_host=host, target_user=user, target_port=port_int, ssh_key=None)
warn("SSH-ключ не настроен. Автоматическая передача невозможна (scp с BatchMode=yes не поддерживает пароль).")
success(f"Архив оставлен в: {_ARCHIVE_DIR}")
info("Перенесите вручную через rsync/scp с паролем, или запустите заново и сгенерируйте ключ.")
state.set_stage("DONE")
# Нет SSH-ключа — спрашиваем пароль и пробуем sshpass
password = prompt(f"Введите пароль для {user}@{host} (или Enter для отмены)")
if not password:
state.set_error("ssh_key_setup", "", "Пароль не введён", suggestion="Запустите docker-migrate --resume или настройте SSH-ключ")
raise RuntimeError("Пароль не введён. Установите SSH-ключ или введите пароль.")
# Проверяем/устанавливаем sshpass
from transfer.ssh import ensure_sshpass
if not ensure_sshpass():
state.set_error("ssh_key_setup", "", "sshpass не найден и не удалось установить", suggestion="Установите sshpass: apt-get install -y sshpass")
raise RuntimeError("sshpass не найден. Установите: apt-get install -y sshpass")
state.set_stage("TRANSFER", target_host=host, target_user=user, target_port=port_int, ssh_key=None, ssh_password=password)
from transfer.transfer import do_transfer
do_transfer()