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

Туннель порта SSH отключается с "select: Invalid argument"

Я подключаюсь к удаленному серверу для доступа к частному API. Я использую следующую команду (введя ее в Терминал) для перенаправления одного порта: ssh -L $local_port:$host:$port -v. Пробовал много разных локальных портов (9000, 9001 и т. Д.).

Я могу без проблем использовать api прямо из браузера или проксировать через nginx в течение нескольких часов. При доступе к нему из приложения playframework сеанс ssh печатает «select: Invalid argument» и закрывает соединение.

Вот как выглядит журнал, когда это происходит:

debug1: channel 1016: free: direct-tcpip: listening port 9001 for ec2-xxx.compute-1.amazonaws.com port 9000, connect from 127.0.0.1 port 65349, nchannels 1
select: Invalid argument
Connection to ec2-xxx.compute-1.amazonaws.com closed.
Transferred: sent 243904, received 64728 bytes, in 87.8 seconds
Bytes per second: sent 2778.0, received 737.2
debug1: Exit status -1

Приложение для воспроизведения использует AsyncHttpClient для выполнения запросов GET localhost: $ local_port.

Есть ли решение этой проблемы со стороны подключения? например заставить ssh игнорировать ошибку и продолжить подключение?

Я только что заметил, что в вашем отладочном сообщении указан канал 1016. Я подозреваю, что у вас заканчиваются файловые дескрипторы. Я только что проверил на своем ноутбуке с Linux, и ulimit -a показывает мне максимум 1024. Итак, я полагаю, вы тоже это делаете. Идеальное решение - выяснить, как вы используете столько одновременных файловых дескрипторов, и как-то уменьшить их.

Альтернативный вариант - просто увеличить максимальное количество открытых файловых дескрипторов:

 (useful debug commands here)
 lsof -p <pid>    should show you the open filedescriptors in use by a process, btw.
 ulimit -a     should show you your soft limits in this specific shell
 ulimit -aH    should show you the hard limits in this specific shell
 cat /proc/<pid>/limits     should show you the limits in effect on a specific process.

Чтобы увеличить пределы fd, вам нужно отредактировать /etc/security/limits.conf на обеих машинах, включив в него следующие строки:

*       hard    nofile    4096
*       soft    nofile    4096
root    hard    nofile    4096
root    soft    nofile    4096

Эти недавно перенастроенные ограничения вступят в силу только после повторного входа в систему. Я часто использую ssh на localhost, чтобы проверить такие вещи, но на вашем месте я бы перезагрузился, если это возможно.

Если вы не можете перезагрузить удаленную машину, я бы хотя бы перезапустил sshd. Прежде чем снова использовать ssh, используйте ulimit -a, чтобы подтвердить, что максимальное количество открытых файлов или файловых дескрипторов составляет 4096.

Когда вы подключитесь по ssh к удаленному компьютеру, запустите ulimit -n, чтобы убедиться, что он говорит 4096.

Удачи.

Предыдущие ответы, скорее всего, будут правильными, но если увеличение количества дескрипторов файлов не помогает, вы можете проверить свои файлы входа (.bashrc, .bash_profile, .login, / etc / login и т. Д.) На предмет неправильного использования встроенная функция bash "select" - дополнительную информацию см. в man bash.