Puncte:1

Există vreo modalitate de a obține openssl s_client să citească din stdin?

drapel cn

Vreau să fac un script care să creeze o listă de e-mailuri returnate pe un cont de Gmail. Știu că mă pot conecta folosind:

openssl s_client -crlf -connect imap.gmail.com:993

Inițial am încercat ceva de genul:

openssl s_client -crlf -connect imap.gmail.com:993 <<!
o autentificare [email protected] Apa55w0rd
a selecta INBOX
o căutare pe 4-oct-2021
!

Totuși, tot ce primesc este răspunsul inițial de la conectarea la server, nimic din comenzi; în mod clar nu citește stdin. Există vreo modalitate de a face s_client să citească comenzi dintr-un fișier (de preferință stdin)?

Editați | ×

Am încercat sugestia din postarea legată de Gerald Schneider (https://stackoverflow.com/questions/13707092/openssl-pass-first-few-lines-from-script-then-read-from-stdin), dar nu pare să funcționeze - cel puțin, nu produce rezultatul pe care îl urmăresc:

db1 root: cat <<! | openssl s_client -crlf -connect imap.gmail.com:993
o conectare [email protected] Apa55w0rd
a selecta INBOX
o căutare pe 4-oct-2021
!

CONECTAT(00000003)
adâncime=2 C = SUA, O = Google Trust Services LLC, CN = GTS Root R1
verifica returnarea:1
adâncime=1 C = SUA, O = Google Trust Services LLC, CN = GTS CA 1C3
verifica returnarea:1
adâncime=0 CN = imap.gmail.com
verifica returnarea:1
---
Lanț de certificate
 0 s:/CN=imap.gmail.com
   i:/C=US/O=Google Trust Services LLC/CN=GTS CA 1C3
 1 s:/C=US/O=Google Trust Services LLC/CN=GTS CA 1C3
   i:/C=US/O=Google Trust Services LLC/CN=GTS Root R1
 2 s:/C=US/O=Google Trust Services LLC/CN=GTS Root R1
   i:/C=BE/O=GlobalSign nv-sa/OU=Root CA/CN=GlobalSign Root CA
---
Certificat de server
-----ÎNCEPE CERTIFICAT-----
MIIFUzCCBDugAwIBAgIRANYAB4MRC2TJCgAAAAD/Y6YwDQYJKoZIhvcNAQELBQAw
RjELMAkGA1UEBhMCVVMxIjAgBgNVBAoTGUdvb2dsZSBUcnVzdCBTZXJ2aWNlcyBM
TEMxEzARBgNVBAMTCkdUUyBDQSAxQzMwHhcNMjEwOTEzMDMxMTI3WhcNMjExMTIw
MDMxMTI2WjAZMRcwFQYDVQQDEw5pbWFwLmdtYWlsLmNvbTCCASIwDQYJKoZIhvcN
AQEBBQADggEPADCCAQoCggEBALRQpfQvddKjDkAtx0dNu8ifeLqzo8Lv6892Ij8O
KZBsAGcP39G9elE5UGklMH4Jzo88scMmSq+gTNW+Zss/DJ64RMfh/hBXSemdlfnF
Ro/HywsuPZ4YqHOVBvgW+7/K7YspqhfKn/oSZl5jCXz/J6qcxX7O9+phWD7nWwGS
ksrNkuwBT2fg/mA64q0sGgz+cE0k8LGwWoJSZ+B3Nosl07IKv9Jwddxu85d5cAcQ
djoEHiGTF4bluMlkHKlzQhNLh8bEiAkMV/pu/79D1HD+05z6I2EXt+f7O0Dgc8HC
hYHYGw2x2T4ZHAEH+0vG+2CTQMcNoTJ4jfITe4/OUaDm39ECAwEAAaOCAmcwggJj
MA4GA1UdDwEB/wQEAwIFoDATBgNVHSUEDDAKBggrBgEFBQcDATAMBgNVHRMBAf8E
AjAAMB0GA1UdDgQWBBQGYvnDmgImhQkT2mNBuYvWoMf2wTAfBgNVHSMEGDAWgBSK
dH+vhc3ulc09nNDiRhTzcTUdJzBqBggrBgEFBQcBAQReMFwwJwYIKwYBBQUHMAGG
G2h0dHA6Ly9vY3NwLnBraS5nb29nL2d0czFjMzAxBggrBgEFBQcwAoYlaHR0cDov
L3BraS5nb29nL3JlcG8vY2VydHMvZ3RzMWMzLmRlcjAZBgNVHREEEjAQgg5pbWFw
LmdtYWlsLmNvbTAhBgNVHSAEGjAYMAgGBmeBDAECATAMBgorBgEEAdZ5AgUDMDwG
A1UdHwQ1MDMwMaAvoC2GK2h0dHA6Ly9jcmxzLnBraS5nb29nL2d0czFjMy9mVkp4
YlYtS3Rtay5jcmwwggEEBgorBgEEAdZ5AgQCBIH1BIHyAPAAdQDuwJXujXJkD5Lj
w7kbxxKjaWoJe0tqGhQ45keyy+3F+QAAAXvdWlDzAAAEAwBGMEQCICZIv+JvLRvF
G192uY3wdMdxa7F1Cjkf4Ts++Nj+VBcTAiBTVo0coasZSSvLhfhpFFgVaYjALw1d
kjNEGOhKDfNX4gB3APZclC/RdzAiFFQYCDCUVo7jTRMZM7/fDC8gC8xO8WTjAAAB
e91aUA0AAAQDAEgwRgIhAJZ/m/XmVsCx5iuxrdiHmKWq04qmdutaRSqyG2X6wFED
AiEAwvkkC+8egz7BfGcAcsdx04FzMrDYfReDn6elgMCsBBAwDQYJKoZIhvcNAQEL
BQADggEBAD+0liFWMdNxq5xWOLiTCw1mWatA3ZdrDqi51cYN4thboxRa+iNfYUn/
AvSel4sJ+5HhdUmgSpXc98x/OFybrYyLXg/Tk3R1hgZmRsgUTrGMP6H6bkrA1du9
qt23JMScvB2P5pmGMoXdKh1dGaigaIEErixhjlALztEvrWUVSzmpg6A4yx0O/9lw
iHgXY0XNcjtZJ/2tta0nizTMKn2NJbjAW2Pdi0GDZUV9DRcicdvhB9uFd/RFEU2o
muPY4eRc/P4n6NE7TH2S3aEGxD74hwZSmb1Jo/g7L8Ta1caomqHIEFBBU4G+8x0h
8XQpI2zZhTJ82wPjEz7GrVdJt/KDwy0=
-----CERTIFICAT FINAL-----
subiect=/CN=imap.gmail.com
emitent=/C=US/O=Google Trust Services LLC/CN=GTS CA 1C3
---
Nu s-au trimis nume de CA de certificat de client
Rezumat peer signing: SHA256
Cheie Temp Server: X25519, 253 de biți
---
SSL handshake a citit 4870 de octeți și a scris 261 de octeți
Verificare: OK
---
Nou, TLSv1.2, Cipher este ECDHE-RSA-CHACHA20-POLY1305
Cheia publică a serverului este de 2048 biți
Este acceptată renegocierea sigură
Compresie: NIMIC
Extindere: NIMIC
Nu s-a negociat ALPN
Sesiune SSL:
    Protocol: TLSv1.2
    Cifr: ECDHE-RSA-CHACHA20-POLY1305
    ID sesiune: FA01523E2366640CFAA49BFA681D23F7118556474A67072E09F188D42B4FCDAB
    ID-ul sesiunii-ctx:
    Cheie principală: F26BDF82C66AE5B7D08847C29D786E382212B8017292EEE7A826D2085FC6F73877441EDC72EDFF2A66342EDE147EB2EE
    Identitate PSK: Niciuna
    Sugestie de identitate PSK: Niciuna
    Nume de utilizator SRP: niciunul
    Sugestie pentru durata de viață a biletului de sesiune TLS: 100800 (secunde)
    Tichet sesiune TLS:
    0000 - 01 d9 8f a9 94 2e 5a 89-e0 93 18 8f 99 fc 66 63 ......Z.......fc
    0010 - c3 b5 cb 58 7b ba ae 67-d4 4d c6 6b e9 56 f5 48 ...X{..g.M.k.V.H
    0020 - b3 c7 21 b6 39 84 c5 f0-77 3b 74 95 c3 84 9a 1e ..!.9...w;t.....
    0030 - 6a 18 f9 a0 73 41 99 f4-b4 fb c8 4f 32 64 bc 4e j...sA.....O2d.N
    0040 - 70 64 b8 de 50 27 7d 34-b1 c9 a0 e1 9c c4 8d e6 pd..P'}4........
    0050 - cb cf 09 92 a3 5c 9e 09-75 27 e0 f4 d0 fc 75 06 .....\..u'....u.
    0060 - f0 7e 1b 37 f7 6d 74 b3-d9 cb 24 32 a9 fd d0 aa .~.7.mt...$2....
    0070 - a2 9e 7d e0 58 1d 70 83-e8 a3 f0 5c 1c eb ce 09 ..}.X.p....\....
    0080 - 08 92 d0 de 28 84 6e 14-51 3a 99 a7 20 f3 5c b5 ....(.n.Q:.. .\.
    0090 - 98 9e b5 6a 62 d4 da 45-42 52 70 2b 21 49 46 0e ...jb..EBRp+!IF.
    00a0 - 87 ca b3 90 a2 d8 5a b8-1d c4 8a 55 e2 57 88 20 ......Z....U.W.
    00b0 - 5f a1 3d 7e d0 84 53 51-d0 a7 c4 e1 f3 30 69 2c _.=~..SQ.....0i,
    00c0 - 68 16 18 3f 29 28 d5 42-fa cd d2 11 da 2d b2 c2 h..?)(.B.....-..
    00d0 - 9e e3 ef 50 b9 dc b6 97-fa 66 4e 71 6d 02 6a 6e ...P.....fNqm.jn
    00e0 - 91 3b .;

    Ora de începere: 1633347887
    Timeout: 7200 (sec)
    Verificați codul de returnare: 0 (ok)
    Secret principal extins: da
---
TERMINAT
drapel in
https://stackoverflow.com/questions/13707092/openssl-pass-first-few-lines-from-script-then-read-from-stdin
j4nd3r53n avatar
drapel cn
deci, `openssl s_client` poate citi doar din stdin dacă se află la capătul de recepție al unei conducte?
j4nd3r53n avatar
drapel cn
@GeraldSchneider Am urmat linkul, dar nu merge pentru mine - vezi editarea
Puncte:1
drapel cn

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”

j4nd3r53n avatar
drapel cn
+1 pentru asta - uitasem de aștept. Din anumite motive, nu se găsește nicăieri în Debian 11 sau Ubuntu 20.04, dar trucul ssh ar fi potrivit pentru mine, cred.
Gerrit avatar
drapel cn
Pentru Ubuntu 20.04 ar trebui să includeți depozitele _universe_. https://packages.ubuntu.com/focal/expect
Puncte:0
drapel cn

s_client citește din stdin, dar implicit se oprește de îndată ce stdin se închide, încercați să utilizați -ign_eof.

Vezi de asemenea Cum transformi „echo” în „openssl”?

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.