Intereting Posts
Как вызвать скрипт KSH из другого скрипта KSH Использование `nohup` для импорта дампа MySQL на сервере Debian Как я могу поместить в конкретный каталог? azap от LinuxTV dvb-apps странное поведение сигнала с Hauppauge WinTV-HVR 950Q Как использовать inotifywait для просмотра каталога для создания файлов определенного расширения некоторые функциональные кнопки не распознаются (даже на уровне scancode) после возобновления сна Переменная, назначенная внутри команды ssh, не возвращает правильное значение Как узнать, использует ли что-то последовательный порт? Распечатайте pdf как paps, но с фактическими шрифтами? Установка программы в Linux через пакет Заголовок запроса для Cache-Control не работает Как остановить внешний жесткий диск Western Digital от спящего режима Можно ли запускать любой дистрибутив из ОЗУ из .iso, сохраненного в файловой системе NTFS? Как установить ssh для пользователя на debian? Что не так в этом скрипте bash?

Как получить доступ к http-серверу из сценария bash с существующим подключением tcp?

В командной оболочке bash я использую несколько инструментов командной строки ( wget , curl , httpie ) для проверки моего http-сервера.

При использовании, например, curl для вызова GET-запроса, я вижу, что tcp-соединение открывается на мой сервер и закрывается сразу после завершения HTTP-связи.

 $ curl http://10.5.1.1/favicon.ico -o /dev/null 

Чтобы лучше тестировать поведение моего сервера, я хочу, чтобы tcp-соединение открывалось в течение нескольких циклов HTTP-запроса / ответа.

Я могу выполнять бедные HTTP-запросы непосредственно из bash следующим образом:

 exec 3<>/dev/tcp/10.5.1.1/80 printf "GET /\r\n\r\n" >&3 while IFS= read -r -u3 -t2 line || [[ -n "$line" ]]; do echo "$line"; done exec 3>&- exec 3<&- 

Но поскольку мое тестовое общение намного сложнее (включая аутентификацию и т. Д.), Я не хочу полностью кодировать это самостоятельно в bash или другом языке сценариев, но вместо этого хочу использовать существующие инструменты. Идея заключается в том, чтобы сначала открыть tcp-сокет в bash, а затем заставить некоторые инструменты командной строки использовать это соединение вместо того, чтобы открывать свои собственные сокеты. Может быть, так;

 exec 3<>/dev/tcp/10.5.1.1/80 curl http://10.5.1.1/message.txt --use-existing-socket-fd=3 # ... do some other testing stuff ... wget http://10.5.1.1/message.txt --use-existing-socket-fd=3 # ... do some other testing stuff ... http http://10.5.1.1/message.txt --use-existing-socket-fd=3 exec 3>&- exec 3<&- 

Возможно ли это, используя вышеупомянутые инструменты или другие инструменты?

Инструмент, который вы ищете, – это socat . Поскольку вы тестируете один веб-сервер, вы можете попросить его установить постоянное соединение с этим сервером (при условии, что он не хочет закрывать его) соответственно, и как только это будет сделано, вы можете использовать соединение как туннель. Ниже приведены два способа сделать это.

Запрос через гнездо Unix

curl имеет параметр --unix-socket который позволяет отправлять HTTP-запросы и получать ответы HTTP через Unix-сокет (спасибо, thrig, за ваш просветительский комментарий)

Вы бы использовали его так:

 socat TCP:10.5.1.1:80 UNIX-LISTEN:/tmp/curl.sock,fork 

Затем, на другом терминале:

 curl --unix-socket /tmp/curl.sock http://10.5.1.1/message1.txt curl --unix-socket /tmp/curl.sock http://10.5.1.1/message2.txt ... 

Запрос через псевдо-HTTP-прокси

Вы также можете сделать свой туннель доступным как псевдопрокси, через который wget , curl , … будет подключаться. Преимущество этого решения заключается в том, что он не ограничивается curl .

На этот раз socat слушает локальный TCP-порт (скажем, 3128):

 socat TCP:10.5.1.1:80 TCP-LISTEN:3128,fork,reuseaddr 

Затем, на другом терминале:

 export http_proxy='http://localhost:3128' curl http://10.5.1.1/message.txt wget http://10.5.1.1/message.txt .... 

Обратите внимание: поскольку HTTP-клиент использует прокси-сервер, HTTP-запрос будет слегка изменен, и это может быть нежелательно.

Разумеется, ни одно из этих двух решений не предназначено для использования с несколькими HTTP-серверами, поскольку это ваш веб-сервер в конце канала, который получает все запросы.