Как получить доступ к 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<&- 

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

One Solution collect form web for “Как получить доступ к http-серверу из сценария bash с существующим подключением tcp?”

Инструмент, который вы ищете, – это 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-серверами, поскольку это ваш веб-сервер в конце канала, который получает все запросы.

  • инструмент командной строки для одной загрузки торрента (например, wget или curl)
  • Как объединить эти wgets?
  • Сохраните команду ../../../ в команде wget
  • Разница между «ping» и «wget» в отношении разрешения имени хоста
  • Загрузите, добавив после некоторого процентного завершения
  • wget не может разрешить адрес хоста 80% времени
  • Загрузите одну страницу html со всей необходимой графикой и связанными файлами pdf / zip
  • wget не может быть убит с помощью 'kill -9'
  • Продолжение прерывания сессии wget?
  • Загрузите с помощью wget в другой каталог, чем текущий каталог
  • Как загрузить файл на веб-странице, которая не является прямой ссылкой, но javascript click.submit ()?
  • Interesting Posts

    Команды для аудита Установленное программное обеспечение

    Как я могу перечислить второе последнее слово, найденное в последовательности операторов в awk

    Как заблокировать выполнение файлов, принадлежащих root через lighttpd?

    Установите стороннее программное обеспечение на Linux из источника

    zsh, модульность, несколько файлов .zsh и oh-my-zsh

    Перемещение данных из обычного раздела в lvm

    В сценарии bash, как я могу использовать «tr -d» для удаления введенного пользователем символа?

    расположение окна xterm

    Почему я не могу установить командира полуночи на Debian?

    Можно ли изменить, к чему подключен терминальный эмулятор?

    Как перемещать линии между шаблонами в конец файла

    Запуск Ubuntu USB-накопителя. Не удается установить беспроводной драйвер

    Как мне диагностировать, почему Ubuntu замерзает?

    Автоматически использовать сочетание клавиш в nano?

    Как определить и преобразовать текущее время в течение нескольких секунд, прошедших в течение текущего дня?

    Linux и Unix - лучшая ОС в мире.