Глядя на исходный код, кажется, что s_client читает только с консоли или устройств TTY, а не просто с любого стандартного ввода.
Вы можете обойти это, вставив программу, которая оборачивает (псевдо)TTY вокруг команды.
экран
могу это сделать, но это немного усложняет задачу, я иногда использую ssh
обманывать.
Также есть переход для интерактивных консольных программ (ожидается): https://linux.die.net/man/1/ожидание, но так никогда не пробовал.
с SSH
echo -e 'GET / HTTP/1.0\nХост: www.example.com\n\n' | ssh -tt user@localhost 'openssl s_client -crlf -servername www.example.com -brief -connect www.example.com:443'
-tt принудительно выделяет TTY, чего ssh по умолчанию не будет делать, если обнаружит канал.
Недостатком является то, что вы должны настроить это петлевое соединение SSH для автоматического входа в систему, чтобы использовать его в сценарии.
Это НЕ бинарно безопасно. Для простого ASCII подойдет.
с экраном
Несколько сложнее, но без проблем с входом в систему.
Подготовить файл запрос
со строками для ввода на сервер.
Например:
ПОЛУЧИТЬ/HTTP/1.0
Хост: www.example.com
Сделать отдельный экран с именем мой экран
и сохранить вывод в ./out.log
screen -d -m -S myscreen -L -Logfile ./out.log
Отправьте команду подключения openssl (-X вещи) в первое окно (-р 0) экрана с именем мой экран
(-S мой экран), а затем сразу отправить данные из файла ./запрос
. Обратите внимание, что подстановка процесса $(cat..) уничтожит все завершающие символы новой строки в файле. ./запрос
и команда openssl ДОЛЖНА иметь -crlf в случае протокола HTTP. Данные запроса ДОЛЖНЫ быть отправлены вскоре после открытия соединения, иначе s_client истечет время ожидания.
screen -S myscreen -p 0 -X stuff "openssl s_client -crlf -servername www.example.com -brief -connect www.example.com:443^M";screen -S myscreen -p 0 -X stuff "$( кот ./запрос)^М^М"
Наконец, выйдите из экрана, чтобы стереть мой экран
сеанс (предполагается, что предыдущий запрос заставил сервер уже разорвать соединение, а s_client вышел сам):
экран -S мой экран -p 0 -X материал "выход^M"
Вывод, включая запрос, выход и вывод s_client, теперь находится в ./out.log
Если s_client не завершается после запроса, вы можете сначала отправить сигнал прерывания.
экран -S мой экран -p 0 -X материал "^C"