У нас есть подключение к одному из наших серверов с внешней стороны. Эта сторона входит в систему с помощью sftp и загружает некоторые файлы. Сеансы не закрываются этой стороной, и они не знают, как это сделать (это сервер Windows, и, похоже, сценарии, которые они используют, не поддерживают его).
На прошлой неделе сервер вышел из строя из-за нехватки памяти. После некоторого поиска я обнаружил, что было 2500 подключений SSH (некоторым пару месяцев). Каждый из них занимал совсем немного памяти, но вместе это приводило к сбою сервера. Я убил их всех, и теперь все работает нормально.
Как я могу предотвратить повторение этого? Я бы хотел, чтобы все сеансы были убиты через пару часов. Возможно ли это со стороны сервера, или я должен сам создать для этого сценарий?
О тайм-аутах SSH написано много, но все решения на стороне клиента.
РЕДАКТИРОВАТЬ: На данный момент я создал этот сценарий, который запускается каждую ночь: count = $ (ps aux | grep [USERNAME] | wc -l) echo "Найдено процессов $ count";
for i in $(seq $count)
do
echo "kill $i"
kill -9 $(ps aux | grep [USERNAME] | grep -v grep | head -n 1 | tr -s ' ' | cut -f 2 -d ' ')
done
service ssh restart
Вам необходимо заменить [USERNAME] на зарегистрированного пользователя. Это убьет все процессы этого пользователя, но в моем случае для этого пользователя работают только SSH-соединения.
Отредактируйте файл конфигурации вашего SSH-сервера, включив в него
ClientAliveInterval 600
ClientAliveCountMax 0
Это отключит всех неактивных клиентов через 10 минут (600 секунд).
Цитата из руководства:
ClientAliveCountMax
Устанавливает количество живых сообщений клиента (см. Ниже), которые могут быть отправлены без получения sshd (8) каких-либо сообщений от клиента. Если этот порог будет достигнут во время отправки сообщений «живые клиенты», sshd отключит клиента, завершив сеанс. [...]
Значение по умолчанию - 3. Если для ClientAliveInterval (см. Ниже) установлено значение 15, а для ClientAliveCountMax оставить значение по умолчанию, неотвечающие клиенты SSH будут отключены примерно через 45 секунд. Эта опция применима только к версии протокола 2.
ClientAliveInterval
Устанавливает интервал тайм-аута в секундах, по истечении которого, если от клиента не было получено никаких данных, sshd (8) отправит сообщение через зашифрованный канал, чтобы запросить ответ от клиента. По умолчанию - 0, что означает, что эти сообщения не будут отправлены клиенту. Эта опция применима только к версии протокола 2.