Netcat не работает (по крайней мере, не так, как я могу судить)

Вопрос или проблема

В прошлую ночь я обнаружил, что netcat ведет себя… мягко говоря, странно. Когда я вызывал его (я не использовал флаги, просто базовый “netcat [hostname] [port number]”), он делал одно из двух в зависимости от того, что его использует. То есть, он вел себя немного по-разному, если я запускал bash-скрипт, который использует netcat, в отличие от использования его в командной строке. Скрипт, который также использовал echo для отправки HEAD-запроса на порту 80, запрашивал ввод пользователя как обычно. Однако сразу после нажатия Enter, скрипт сразу заканчивался и возвращал меня к командной строке. В командной строке, однако, вызов netcat с именем хоста и номером порта начинал новую строчку без командной строки. Через несколько секунд он переходил к следующей строке, и я снова получал командную строку. Долгая история коротко: я попытался исправить это, используя sudo, чтобы удалить файлы netcat из /bin/ (сейчас думаю, не знаю, почему я думал, что это поможет), прежде чем сразу осознать, что я screwed up и ни разу не сделал резервную копию, поэтому я переустановил виртуальную машину, что вернуло netcat в рабочий порядок. По крайней мере, до только что, потому что он снова делает то же самое. Могу ли я что-то сделать, чтобы устранять неполадки?
ИЗМЕНЕНИЕ: Я не осознавал, что все еще использую 13.04, что может (надеюсь) иметь отношение к тому, что netcat не работает. Как только у меня будет версия 14.04, я посмотрю, работает ли netcat снова, а затем снова отредактирую вопрос, чтобы поделиться результатами. Если это сработает, я также подожду один или два дня, чтобы увидеть, появится ли проблема снова. Если нет, я добавлю ответ.
ИЗМЕНЕНИЕ: Теперь я очень запутался. Netcat все еще вел себя так же после обновления до 14.04. Что еще хуже, проблема не была решена, даже временно, переустановкой 14.04 через .iso. Если кто-то может помочь мне исправить это, я был бы чрезвычайно благодарен.

Ваш пример, INPUT=hostname; echo -e "HEAD / HTTP/1.1\nhost: $INPUT\n\n" | nc $INPUT 80, работает в командной строке (показывает нормальный результат от сервера), но не работает, когда помещен в скрипт, содержащий только эту строку (показывает ошибку плохого запроса от сервера).

Это вызвано хитрой несовместимостью оболочек, связанной с dash:

Вы запускаете скрипт оболочки с минималистичной оболочкой /bin/dash – которая также связана как /bin/sh, оболочка по умолчанию. Она используется, когда нет строки “shebang”, или #!/bin/sh.

Проблема вызвана встроенной командой echo в dash, которая не поддерживает опцию -e. Опция -e буквально передается как часть HTTP-запроса, что вызывает ошибку от сервера “400 Bad Request”.

Чтобы исправить это, используйте bash вместо dash, например, добавив первую строку скрипта #!/bin/bash.

Ответ или решение

Сетевые Утилиты: Решение Проблем с Netcat

Ваша ситуация с утилитой netcat действительно оставляет много вопросов, однако в этой статье мы рассмотрим ключевые аспекты, которые помогут вам устранить возникшие проблемы. Netcat (или "nc") является мощным инструментом для работы с сетевыми соединениями, однако непредвиденные ошибки могут привести к неправильной работе. Рассмотрим возможные причины и решения по порядку.

1. Основные Симптомы Проблемы

Вы упомянули, что при запуске netcat с командной строки он не выполняется должным образом, и вы наблюдали следующие симптомы:

  • Вызов из командной строки – netcat стартует, но затем просто возвращает управление в командную строку.
  • Вызов из скрипта – выполнение завершается преждевременно, причем с ошибкой "400 Bad Request".

2. Влияние Версии Установленного ПО

Вы отметили, что используете Ubuntu 13.04 и впоследствии обновились до версии 14.04. Обратите внимание, что более ранние версии программного обеспечения могут содержать ошибки и несовместимости, которые были устранены в более поздних релизах. Однако, несмотря на обновление, проблема не исчезла.

3. Проблема с Линейной Скриптовой Обработкой

Как вы уже выяснили, проблема может быть связана с поведением утилиты echo в оболочке /bin/dash, которая является оболочкой по умолчанию для скриптов в вашей системе. Эта минималистичная оболочка не поддерживает флаг -e, который необходим для обработки специальных символов, таких как переводы строки (\n).

Решение: Использование Bash

Чтобы исправить данную проблему, вам следует указать оболочку bash в начале вашего скрипта. Это можно сделать, добавив следующую строку в начало вашего скрипта:

#!/bin/bash

Это обеспечит использование оболочки bash, где флаг -e будет интерпретироваться корректно.

4. Проверка Работы Netcat

После внесения изменений в скрипт, обязательно протестируйте его еще раз. Запустите ваш скрипт с измененной оболочкой и проверьте результат, если все прошло без ошибок, вы можете получить правильный ответ от сервера.

5. Дополнительные Шаги Тестирования

Если после этих изменений вы все еще сталкиваетесь с проблемами, вот несколько дополнительных шагов, которые могут помочь:

  • Проверка Сетевых Соединений: Убедитесь, что указанный вами hostname и port number доступны и не блокируются брандмауэром или другими сетевыми политиками.

  • Логирование: Включите ведение журнала для вашей скриптовой программы, чтобы отслеживать, какое именно сообщение отправляется и какие ошибки возвращает сервер.

  • Обновление Netcat: Убедитесь, что у вас установлена последняя версия утилиты netcat, так как возможны релизы с исправлениями для известных ошибок.

Заключение

Проблема, с которой вы столкнулись, может быть вызвана рядом факторов — от версий и несовместимостей до особенностей написания скриптов. Использование правильной оболочки должно решить проблемы с интерпретацией команд. Если предложенные шаги не помогут, возможно, стоит обратиться за консультацией к специалистам по сетям или IT, чтобы провести более глубокую диагностику вашего окружения.

Если у вас есть дополнительные вопросы или вам требуется помощь с другим аспектом использования netcat, не стесняйтесь обращаться!

Оцените материал
Добавить комментарий

Капча загружается...