Вопрос или проблема
Я пытаюсь заставить curl и socat работать вместе.
Ситуация следующая:
- Я отправляю XML для входа в систему.
- Сообщение ответа содержит токен аутентификации.
- Я отправляю последующие запросы с токеном. Предупреждение: если соединение прервано, токен истекает, поэтому я не могу просто использовать обычный 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-сертификаты для безопасного обмена данными, а также уменьшить риски перехвата токенов.
Заключение
Каждый из предложенных методов позволяет вам работать с постоянными соединениями и токенами аутентификации без необходимости постоянно пересоздавать соединение. Выберите подходящий способ в зависимости от ваших требований и окружения. Если возникнут дополнительные вопросы, не стесняйтесь обращаться.