Рейтинг:1

Есть ли способ заставить openssl s_client читать со стандартного ввода?

флаг cn

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

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

Сначала я пробовал что-то вроде:

openssl s_client -crlf -connect imap.gmail.com:993 <<!
логин [email protected] Apa55w0rd
выберите ВХОДЯЩИЕ
поиск на 4-окт-2021
!

Однако все, что я получаю, - это первоначальный ответ от подключения к серверу, ничего от команд; он явно не читает стандартный ввод. Есть ли способ заставить s_client читать команды из файла (желательно стандартный ввод)?

Редактировать

Я опробовал предложение в сообщении, на которое ссылается Джеральд Шнайдер (https://stackoverflow.com/questions/13707092/openssl-pass-first-few-lines-from-script-then-read-from-stdin), но, похоже, он не работает - по крайней мере, он не дает того результата, который мне нужен:

корень db1 : кошка <<! | openssl s_client -crlf -connect imap.gmail.com:993
логин [email protected] Apa55w0rd
выберите ВХОДЯЩИЕ
поиск на 4-окт-2021
!

ПОДКЛЮЧЕН(00000003)
depth=2 C = US, O = Google Trust Services LLC, CN = GTS Root R1
проверить возврат: 1
depth=1 C = США, O = Google Trust Services LLC, CN = GTS CA 1C3
проверить возврат: 1
глубина = 0 CN = imap.gmail.com
проверить возврат: 1
---
Цепочка сертификатов
 0 s:/CN=imap.gmail.com
   i:/C=US/O=Google Trust Services LLC/CN=GTS CA 1C3
 1 с:/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
---
Сертификат сервера
-----НАЧАТЬ СЕРТИФИКАТ-----
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
LmdtYWlsLmNvbTAhBgNVHSAEGjAYMAgGBmeBDAECATAMBgorBgeEEAdZ5AgUDMDwG
A1UdHwQ1MDMwMaAvoC2GK2h0dHA6Ly9jcmxzLnBraS5nb29nL2d0czFjMy9mVkp4
YlYtS3Rtay5jcmwwggEEBgorBgEEAdZ5AgQCBIH1BIHyAPAAdQDuwJXujXJkD5Lj
w7kbxxKjaWoJe0tqGhQ45keyy+3F+QAAAXvdWlDzAAAEAwBGMEQCICZIv+JvLRvF
G192uY3wdMdxa7F1Cjkf4Ts++Nj+VBcTAiBTVo0coasZSSvLhfhpFFgVaYjALw1d
kjNEGOhKDfNX4gB3APZclC/RdzAiFFQYCDCUVo7jTRMZM7/fDC8gC8xO8WTjAAAB
e91aUA0AAAQDAEgwRgIhAJZ/m/XmVsCx5iuxrdiHmKWq04qmdutaRSqyG2X6wFED
AiEAwvkkC+8egz7BfGcAcsdx04FzMrDYfReDn6elgMCsBBAwDQYJKoZIhvcNAQEL
BQADggEBAD+0liFWMdNxq5xWOLiTCw1mWatA3ZdrDqi51cYN4thboxRa+infYUn/
AvSel4sJ+5HhdUmgSpXc98x/OFybrYyLXg/Tk3R1hgZmRsgUTrGMP6H6bkrA1du9
qt23JMScvB2P5pmGMoXdKh1dGaigaIERixhjlALztEvrWUVSzmpg6A4yx0O/9lw
iHgXY0XNcjtZJ/2tta0nizTMKn2NJbjAW2Pdi0GDZUV9DRcicdvhB9uFd/RFEU2o
muPY4eRc/P4n6NE7TH2S3aEGxD74hwZSmb1Jo/g7L8Ta1caomqHIEFBBU4G+8x0h
8XQpI2zZhTJ82wPjEz7GrVdJt/KDwy0=
-----КОНЕЦ СЕРТИФИКАТА-----
subject=/CN=imap.gmail.com
issuer=/C=US/O=Google Trust Services LLC/CN=GTS CA 1C3
---
Имена ЦС сертификата клиента не отправлены
Дайджест одноранговой подписи: SHA256
Временный ключ сервера: X25519, 253 бита
---
SSL-рукопожатие прочитало 4870 байт и записало 261 байт
Проверка: ОК
---
Новый, TLSv1.2, шифр ECDHE-RSA-CHACHA20-POLY1305.
Открытый ключ сервера 2048 бит.
Поддерживается безопасное повторное согласование IS
Сжатие: НЕТ
Расширение: НЕТ
ALPN не согласован
SSL-сессия:
    Протокол: TLSv1.2
    Шифр: ECDHE-RSA-CHACHA20-POLY1305
    Идентификатор сеанса: FA01523E2366640CFAA49BFA681D23F7118556474A67072E09F188D42B4FCDAB
    Идентификатор сеанса-ctx:
    Мастер-ключ: F26BDF82C66AE5B7D08847C29D786E382212B8017292EEE7A826D2085FC6F73877441EDC72EDFF2A66342EDE147EB2EE
    Идентификация PSK: нет
    Подсказка идентификации PSK: нет
    Имя пользователя SRP: нет
    Подсказка срока действия билета сеанса TLS: 100800 (секунд)
    Билет сеанса 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
    00е0 - 91 3б.;

    Время начала: 1633347887
    Время ожидания: 7200 (сек)
    Подтвердите код возврата: 0 (хорошо)
    Расширенный главный секрет: да
---
СДЕЛАНО
флаг in
https://stackoverflow.com/questions/13707092/openssl-pass-first-few-lines-from-script-then-read-from-stdin
j4nd3r53n avatar
флаг cn
Итак, «openssl s_client» может читать со стандартного ввода только в том случае, если он находится на принимающей стороне конвейера?
j4nd3r53n avatar
флаг cn
@GeraldSchneider Я перешел по ссылке, но она у меня не работает - см. редактирование
Рейтинг:1
флаг cn

Глядя на исходный код, кажется, что 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"

j4nd3r53n avatar
флаг cn
+1 за это - я забыл об ожидании. По какой-то причине его нигде нет в Debian 11 или Ubuntu 20.04, но я думаю, что трюк с ssh мне подойдет.
Gerrit avatar
флаг cn
Для Ubuntu 20.04 вам нужно будет включить репозитории _universe_. https://packages.ubuntu.com/focal/expect
Рейтинг:0
флаг cn

s_client читает из стандартный ввод, но по умолчанию выключается, как только стандартный ввод закрывается, попробуйте использовать -ign_eof.

Также см Как передать «эхо» в «openssl»?

Ответить или комментировать

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