Хорошо, у меня было то же самое, и мне потребовалось некоторое время, чтобы разобраться.
Я не могу найти способ отправить несколько строк в запросе при использовании s_client в интерактивном режиме. Он всегда отправляет запрос сразу, как только вы ввели первую строку. Если кто-то знает, как обойти это, то, пожалуйста, дайте мне знать!
Edit: Я вижу, что Вэй Хэ опубликовал способ сделать это - использовать флаг -crlf
, но оставить этот ответ здесь в качестве альтернативного метода.
В то же время, как предложил jww, вы должны использовать echo
для этого:
echo -e "GET / HTTP/1.1\r\nHost: example.com\r\n\r\n" | openssl s_client ...
Следующая проблема заключается в том, что по умолчанию openssl закрывает соединение при закрытии входного файла. Что и происходит сразу при использовании echo
таким образом. Таким образом, у вас нет времени, чтобы увидеть ответ, а вместо этого просто увидеть результат DONE! :-(
Вы можете добавить sleep
к команде echo, чтобы обойти это (обратите внимание, что скобки важны):
(echo -e "GET / HTTP/1.1\r\nHost: example.com\r\n\r\n"; sleep 10) | openssl s_client ...
Или, лучше, вы можете использовать -ign_eof
опция, чтобы оставить соединение открытым:
echo -e "GET / HTTP/1.1\r\nHost: example.com\r\n\r\n" | openssl s_client -ign_eof ...
Или еще лучше, если вас интересуют только HTTP-ответы, то используйте опцию -quite
, которая скрывает большую часть шума TLS, а также устанавливает эту опцию -ign_eof для вас:
echo -e "GET / HTTP/1.1\r\nHost: example.com\r\n\r\n" | openssl s_client -quiet ...
#!/usr/bin/env expect
# open first argument to program...
set fd [open [lindex $argv 0]]
# for each line using that file handle...
while {[gets $fd line] >= 0} {
# split on , and select the last one...
set lastcolumn [lindex [split $line ","] end]
# whoops there's some whitespace so clear that...
set ip [string trim $lastcolumn " "]
puts ">$ip<"
}