Назад | Перейти на главную страницу

Убить SSH-туннель через X минут, даже если он все еще используется?

Я настраиваю фоновый SSH-туннель для некоторых процедур резервного копирования. Однако меня беспокоит, что процесс ssh просто сидит без дела. В конце своего скрипта я убиваю PID, но что, если что-то случится с моим скриптом, и он не завершится. Я хочу что-нибудь посильнее.

Есть ли способ заставить туннель SSH убить себя через X секунд / минут?

Сейчас я начинаю вот так

ssh -f -N -L 14880:internalserver:3306 gateway.example.com

А затем с помощью lsof получить PID, который открыл этот порт.

Посмотри на это:

ssh -f -L 14880:internalserver:3306 gateway.example.com sleep 3m

Это настроит туннель и позволит вам подключиться за 3 минуты. Если вы подключитесь, он будет доступен, пока не перейдет в режим ожидания. Однако это не остановит запущенный процесс резервного копирования (я надеюсь, что это то, что вам нужно).

Пакет expect содержит команду timeout в качестве одного из примеров. Вы можете обернуть весь свой скрипт вызовом этого.

Или что-то вроде:

ssh -f -N -L 14880:internalserver:3306 gateway.example.com &
PID=$!
nohup "sleep 600; kill $PID" &

Вот более чистый способ, который предлагался ранее:

ssh -f -N -L 14880:internalserver:3306 gateway.example.com &
PIDSSH=$!
( sleep 600 ; echo "Timeout." ; kill $PIDSSH ) &
PIDSLEEP=$!
wait $PIDSSH
kill $PIDSLEEP && echo "Session ended before timeout"
wait

Однако вы не получаете код ошибки от ssh, но это можно исправить.

Другой способ сделать это - установить для сеанса значение тайм-аута простоя. Это может быть сделано на сервере в sshd_config со значением «IdleTimeout» или пользователем в файле authorized_keys как «idle-timeout = 6m ... key ...». Или часы. Или секунды. Раздел 8.2.7 в книге Oreilly "SSSH The Secure Shell". После указанного количества бездействия (без ввода) ваши процессы будут остановлены. Насколько это чисто, зависит от того, насколько хорошо они реагируют на сообщения :)