Nhìn vào mã nguồn, có vẻ như s_client chỉ đọc từ bảng điều khiển hoặc thiết bị TTY chứ không phải từ bất kỳ stdin nào.
Bạn có thể giải quyết vấn đề đó bằng cách xen kẽ một chương trình bao bọc TTY (giả) xung quanh lệnh.
màn hình
có thể làm điều đó, nhưng nó hơi khó, đôi khi tôi sử dụng ssh
lừa.
Ngoài ra còn có goto cho các chương trình bảng điều khiển tương tác (mong đợi): https://linux.die.net/man/1/expect, nhưng chưa bao giờ thử điều đó.
với SSH
echo -e 'GET / HTTP/1.0\nHost: www.example.com\n\n' | ssh -tt user@localhost 'openssl s_client -crlf -servername www.example.com -brief -connect www.example.com:443'
-tt buộc phân bổ TTY, điều mà ssh theo mặc định sẽ không thực hiện nếu nó phát hiện ra một đường ống.
Bất lợi là bạn phải đặt kết nối SSH loopback này để đăng nhập tự động để sử dụng nó trong tập lệnh.
Đây KHÔNG phải là an toàn nhị phân. Đối với ASCII đơn giản, nó sẽ làm được.
có màn hình
Khó hơn một chút, nhưng trừ rắc rối khi đăng nhập.
chuẩn bị một tập tin truy vấn
với các dòng để nhập vào máy chủ.
Ví dụ:
NHẬN/HTTP/1.0
Máy chủ: www.example.com
Tạo một màn hình tách rời với tên màn hình của tôi
và lưu đầu ra vào ./out.log
màn hình -d -m -S myscreen -L -Logfile ./out.log
Gửi lệnh kết nối openssl (-thứ X) đến cửa sổ đầu tiên (-p 0) của màn hình có tên màn hình của tôi
(-S màn hình của tôi) và sau đó gửi ngay dữ liệu từ tệp ./truy vấn
. Lưu ý rằng việc thay thế quy trình $(cat..) sẽ cắt bất kỳ dòng mới nào trong tệp ./truy vấn
và lệnh openssl PHẢI có -crlf trong trường hợp giao thức HTTP. Dữ liệu truy vấn PHẢI được gửi không lâu sau khi mở kết nối, nếu không s_client sẽ hết thời gian chờ.
màn hình -S myscreen -p 0 -X thứ "openssl s_client -crlf -servername www.example.com -brief -connect www.example.com:443^M";screen -S myscreen -p 0 -X thứ "$( con mèo ./query)^M^M"
Cuối cùng thoát ra khỏi màn hình, để xóa màn hình của tôi
phiên (Điều này giả định rằng truy vấn trước đó đã khiến máy chủ ngắt kết nối và s_client tự thoát):
màn hình -S myscreen -p 0 -X thứ "thoát^M"
Đầu ra bao gồm truy vấn và thoát và đầu ra s_client hiện ở trong ./out.log
Nếu s_client không thoát sau truy vấn, trước tiên bạn có thể gửi tín hiệu ngắt.
màn hình -S myscreen -p 0 -X thứ "^C"