Privind codul sursă se pare că s_client citește doar de pe consolă sau dispozitive TTY și nu de pe orice stdin.
Puteți rezolva asta prin interpunerea unui program care include un (pseudo)TTY în jurul comenzii.
ecran
pot face asta, dar îngreunează un pic, uneori folosesc ssh
truc.
De asemenea, există și opțiunea pentru programele de consolă interactivă (se așteaptă): https://linux.die.net/man/1/expect, dar nu am încercat niciodată asta.
cu SSH
echo -e „GET / HTTP/1.0\nGazdă: www.example.com\n\n” | ssh -tt user@localhost 'openssl s_client -crlf -servername www.example.com -brief -connect www.example.com:443'
-tt forțează alocarea TTY, ceea ce ssh în mod implicit nu ar face, dacă detectează o conductă.
Dezavantajul este că trebuie să setați această conexiune SSH loopback să se conecteze automat pentru a o utiliza într-un script.
Acest lucru NU este sigur binar. Pentru ASCII simplu va fi bine.
cu ecran
Oarecum mai greu, dar minus problemele de conectare.
Pregătiți un fișier interogare
cu linii de intrare pe server.
De exemplu:
GET / HTTP/1.0
Gazdă: www.example.com
Faceți un ecran detașat cu nume ecranul meu
și salvați rezultatul în ./out.log
ecran -d -m -S ecranul meu -L -Fișier jurnal ./out.log
Trimite comanda de conectare openssl (-X chestii) la prima fereastră (-p 0) din ecranul numit ecranul meu
(-S ecranul meu) și apoi trimiteți imediat datele din fișier ./interogare
. Rețineți că înlocuirea procesului $(cat..) va tăia toate liniile noi din fișier ./interogare
iar comanda openssl TREBUIE să aibă -crlf în cazul protocolului HTTP. Datele de interogare TREBUIE să fie trimise la scurt timp după deschiderea conexiunii, altfel s_client va expira.
ecran -S ecranul meu -p 0 -X chestii "openssl s_client -crlf -nume server www.example.com -brief -connect www.example.com:443^M";ecran -S ecranul meu -p 0 -X chestii "$( cat ./interogare)^M^M"
În cele din urmă, ieșiți de pe ecran, pentru a șterge ecranul meu
sesiune (Acest lucru presupune că interogarea anterioară a făcut ca serverul să renunțe deja la conexiunea și s_client a ieșit singur):
ecran -S ecranul meu -p 0 -X chestii „ieșire^M”
Ieșirea, inclusiv interogarea și ieșirea și ieșirea s_client este acum în ./out.log
Dacă s_client nu iese după interogare, puteți trimite mai întâi un semnal de întrerupere.
ecran -S ecranul meu -p 0 -X chestii „^C”