Перенаправление stdout / stderr не работает для предотвращения ошибок перенаправления /dev/tcp/host/port

Вероятная причина заключалась в том, что исходящий трафик проходил через соединение с несколькими глобальными сетями. Для обычных подключений, таких как HTTP, это было нормально, но для UDPopenvp сервер, вероятно, не мог отправить ответный эхо-запрос, и сервер запускал перезагрузку.

Недостаточно доказано.

2
05.02.2020, 08:49
1 ответ

Ошибка выводится в то время, когда 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), что делает его немного более интуитивным, а также позволяет больше вещей, таких как соединения на стороне сервера.

4
28.04.2021, 23:24

Теги

Похожие вопросы