Как получить доступ к 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 не загружает файлы рекурсивно
  • Могу ли я доверять статусу выхода wget, даже если он был перезапущен?
  • Объединить аргумент xargs с некоторым текстом
  • Проблема с использованием wget для создания статического архива веб-сайта
  • Необходимый инструмент для загрузки - с настраиваемыми заголовками, возобновлением, повторной попыткой, выдачей пользовательского имени файла и динамическим перенаправлением
  • WGET - проверка подлинности root и всех дочерних папок
  • Как заставить wget сохранять содержимое веб-страницы в файл?
  • wget url из моего открытого наружного wx cam
  • Ошибка Wget TLS 1.2
  • Does -q определенно отключить ведение журнала вывода wget?
  • Запись вывода wget или curl в пользовательское имя файла на основе URL-адреса
  • Linux и Unix - лучшая ОС в мире.