
HTTP-запити без curl: трюк із bash /dev/tcp у контейнері
Розробник, у чиєму контейнері не було ні curl, ні wget, перевірив доступність сервісу у внутрішній мережі Docker через bash-редирект /dev/tcp, написавши HTTP-запит вручну самими лише засобами оболонки.
Розробникові, якому потрібно було перевірити, чи один контейнер бачить інший у внутрішній мережі Docker, бракувало звичного інструмента: образ застосунку був максимально обрізаний і не містив ні curl, ні wget, ні будь-чого іншого для відкриття сокета. Рішення, описане в короткій нотатці, спирається на вбудовану можливість bash — псевдопристрій /dev/tcp: оболонка сама відкриває TCP-сокет, а HTTP-запит можна написати вручну.
HTTP-запит, написаний вручну
Підхід не потребує нічого, крім уже наявної оболонки. Файловий дескриптор відкривається на потрібний хост і порт — exec 3<>/dev/tcp/service/8642, — після чого printf записує мінімальний запит: рядок запиту, заголовок Host і Connection: close. Команда cat <&3 виводить усе, що поверне сервер: рядок статусу, заголовки й тіло. Щоб додати заголовок Authorization: Bearer, достатньо вставити ще один рядок, завершений CRLF, перед порожнім рядком, який закриває запит.
/dev/tcp не існує на диску
Найбільше дивує те, що /dev/tcp — не справжній файл: ls /dev/tcp нічого не знайде, а cat з іншої оболонки просто поверне помилку. Це внутрішній редирект bash: оболонка виконує DNS-пошук і виклик connect(2), а потім видає сокету файловий дескриптор. Назви обрали саме тому, що в жодній реальній системі Unix немає ієрархії /dev/tcp, тож конфлікт неможливий. Оскільки це можливість bash, а не POSIX, вона не працює в dash чи zsh, і скрипт має викликати bash напряму.
Чого цей метод не вміє
Автор наголошує: це не HTTP-клієнт. Він не розбирає відповіді, не обробляє переспрямування, chunked-кодування, стиснення, повторні спроби й TLS — сокет лише для відкритого тексту, тож для https знадобиться openssl s_client. Якщо пропустити заголовок Connection: close, сервер залишить з'єднання відкритим, і cat чекатиме вічно на байти, які не надійдуть; від цього рятує обгортка timeout 6 bash -c '...'. Сама можливість вмикається під час компіляції (--enable-net-redirections): більшість сучасних збірок її мають, але Debian роками постачав її вимкненою. Висновок незмінний: для щоденної роботи curl залишається правильним інструментом, але в навмисно мінімальному контейнері цей трюк дає швидку перевірку без встановлення пакетів.
SiTech — веброзробка з підтримкою AI
Створюємо швидкі та сучасні сайти й інтегруємо AI у бізнес-процеси. Маєте проєкт чи запитання? Із задоволенням допоможемо.