Вероятная причина заключалась в том, что исходящий трафик проходил через соединение с несколькими глобальными сетями. Для обычных подключений, таких как HTTP, это было нормально, но для UDP
openvp сервер, вероятно, не мог отправить ответный эхо-запрос, и сервер запускал перезагрузку.
Недостаточно доказано.
Ошибка выводится в то время, когда bash
обрабатывает перенаправление > /dev/tcp/localhost/22
, и в этот момент stderr еще не был перенаправлен. Просто измените порядок этих двух перенаправлений:
if 2> /dev/null > /dev/tcp/127.0.0.1/22; then
echo open
else
echo closed
fi
Обратите внимание, что эти /dev/tcp/host/port
не являются реальными файлами.bash
(или ksh
, откуда эта функция )обнаруживает тот факт, что вы пытаетесь перенаправить на эти специальные файлы (, вы заметите, что если вы измените его на /dev/./tcp
или /dev//tcp
, это больше не работает )и вместо открытия этих файлов создает сокет TCP и пытается connect()
его на хосте и порту. И когда connect
дает сбой, bash
сообщает об ошибке.
zsh
имеет встроенную команду ztcp
вместо (в модуле zsh/net/tcp
), что делает его немного более интуитивным, а также позволяет больше вещей, таких как соединения на стороне сервера.