Я настраиваю фоновый 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". После указанного количества бездействия (без ввода) ваши процессы будут остановлены. Насколько это чисто, зависит от того, насколько хорошо они реагируют на сообщения :)