1

У меня есть пакетный скрипт, который синхронизирует данные между локальной машиной и машиной, доступ к которой можно получить через туннель SSH. Вместо того, чтобы оставлять туннель открытым, я бы хотел, чтобы он запускался при запуске пакетного сценария и заканчивался после завершения синхронизации.

Как я могу запустить и остановить plink из пакетного сценария, выполняя команды Windows в середине, которые используют преимущества создания туннельного plink?

1 ответ1

1

Мне удалось объединить команды start и taskkill для интеграции plink в мой пакетный скрипт:

@echo off

set local_port=1580
set remote_ip=10.19.0.241
set remote_port=1580
set wait_for_tunnel_seconds=4
set ssh_host=user@example.com

min.exe

echo --- Closing any active tunnels
taskkill /f /fi "imagename eq plink.exe"

echo --- Opening tunnel from local port %local_port% to remote %remote_ip%:%remote_port%
start /min plink -T -L %local_port%:%remote_ip%:%remote_port% %ssh_host%
ping -n %wait_for_tunnel_seconds% 127.0.0.1 >nul
tcping -n 1 localhost %local_port%
IF %ERRORLEVEL% neq 0 (
    echo --- Failed to open tunnel. Canceling.
    taskkill /f /fi "imagename eq plink.exe"
    rem Use the port number as the exit code (makes it obvious in scheduled task last run result)
    EXIT /b %local_port%
)

echo --- Starting synchronization
set error_=0
sync_command.exe
set error_=%ERRORLEVEL%
if %error_% neq 0 (
    echo --- Sync completed, but with errors. Exit result: %error_%
) else (
    echo --- Sync completed
)

echo --- Closing tunnel
taskkill /f /fi "imagename eq plink.exe"

exit /b %error_%

Другие используемые инструменты:

  • MIN.EXE для немедленной минимизации командного окна (это называется запланированной задачей)
  • TCPING.EXE для проверки того, что туннель жив

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .