Публикация в сокет с использованием curl

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

Я пытаюсь заставить curl и socat работать вместе.

Ситуация следующая:

  1. Я отправляю XML для входа в систему.
  2. Сообщение ответа содержит токен аутентификации.
  3. Я отправляю последующие запросы с токеном. Предупреждение: если соединение прервано, токен истекает, поэтому я не могу просто использовать обычный curl.

В PowerShell это работает нормально: https://pastebin.com/5Jiw1fct

Тем не менее, мне нужно, чтобы это работало в Linux. Поскольку мне нужно, чтобы соединение сохранялось, я решил использовать socat.

Если я запускаю это для отправки XML:

curl http://$target_ip -d @./xml/login.xml

Я получаю ответ от системы. Но соединение закрыто, и я не могу повторно использовать токен.

Однако, если я попробую это (конечно, после socat):

curl --unix-socket /tmp/$target_ip.sock -d @./xml/login.xml

Curl жалуется, что у меня не установлен URL.

Идеи?

Спасибо, как всегда.

Curl может подключаться к Unix-сокету, но имя хоста обязательно для HTTP-запроса.

Вы пробовали настроить socat на прослушивание на 127.0.0.1 и подключение к IP-адресу (не имени) целевой системы, добавив имя хоста из URL в /etc/hosts с IP-адресом 127.0.0.1, а затем использовать немодифицированный URL в вызове curl?

У меня были некоторые проблемы в прошлом с сервисами, работающими на нестандартных портах – если у вас уже есть работающий веб-сервер, то вам нужно будет использовать сетевые пространства имен или какую-то другую магию, чтобы curl и удаленный сервер оба считали, что вы подключаетесь к нужному порту.

В качестве альтернативы вы можете использовать оригинальный URL, socat, прослушивающий на нестандартном порту на lo, и указать опцию –resolve в curl, вместо того чтобы мутить порт и/или добавлять запись в /etc/hosts (требует curl >=7.57)

Хотя это очень необычно, что у вас есть токен, связанный с TCP-сессией, это кажется еще более удивительным, что это для http, а не для https-сервиса.

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

Вопрос, который вы поднимаете, связан с использованием утилиты curl для работы с сокетами и поддержанием активного соединения для работы с токенами аутентификации. В данном ответе мы рассмотрим возможные решения вашей проблемы на Linux, используя socat, и предложим дополнительные подходы, чтобы обеспечить стабильное взаимодействие с сервером.

1. Стандартная проблема

Вы пытаетесь отправить XML для аутентификации на сервер, после чего получаете токен. Важно отметить, что этот токен связан с продолжающимся TCP-соединением, что усложняет использование стандартного curl, так как он автоматически закрывает соединение после завершения запроса, и вам нужно поддерживать его открытым.

2. Использование socat

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

Для этого можно использовать следующую команду:

socat TCP-LISTEN:8080,fork,reuseaddr TCP:$target_ip:80

Эта команда создаёт локальный TCP-сервер на порту 8080 на вашем компьютере и перенаправляет все запросы к серверу по IP-адресу $target_ip.

3. Конфигурация curl

Теперь, когда socat установлен и работает, мы можем использовать curl следующим образом:

curl http://127.0.0.1:8080 -d @./xml/login.xml

Это позволит вам отправить исходный XML на локальный сокет, который будет перенаправлять запрос на ваш целевой сервер. Обратите внимание, что при этом вам не нужно изменять /etc/hosts, так как мы используем 127.0.0.1 для легкости.

4. Использование опции –resolve

Если вы не хотите использовать socat, у вас есть новее опция в curl, которая позволяет использовать опцию --resolve для назначения IP-адресов к доменам. Например:

curl --resolve your.domain:80:$target_ip http://your.domain -d @./xml/login.xml

Это также позволяет вам поддерживать сессии, отправляя запросы на тот же адресом и портом, что уменьшает вероятность разрыва соединения.

5. Рекомендации по безопасности

Хотя ваше описание упоминает HTTP, если безопасность является приоритетом, я настоятельно рекомендую рассмотреть возможность использования HTTPS. В этом случае вы сможете использовать tls-сертификаты для безопасного обмена данными, а также уменьшить риски перехвата токенов.

Заключение

Каждый из предложенных методов позволяет вам работать с постоянными соединениями и токенами аутентификации без необходимости постоянно пересоздавать соединение. Выберите подходящий способ в зависимости от ваших требований и окружения. Если возникнут дополнительные вопросы, не стесняйтесь обращаться.

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

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