เมื่อดูซอร์สโค้ดดูเหมือนว่า s_client อ่านจากคอนโซลหรืออุปกรณ์ TTY เท่านั้นไม่ใช่จาก stdin ใด ๆ
คุณสามารถแก้ไขได้โดยการแทรกโปรแกรมที่ล้อมรอบ (หลอก) TTY รอบคำสั่ง
หน้าจอ
ทำได้ แต่มันค่อนข้างยาก บางครั้งฉันใช้ จุ๊ๆ
เล่ห์เหลี่ยม.
นอกจากนี้ยังมี goto สำหรับโปรแกรมคอนโซลแบบโต้ตอบ (คาดหวัง): https://linux.die.net/man/1/expectแต่ไม่เคยลองเลย
กับ สสส
echo -e 'GET / HTTP/1.0\nโฮสต์: www.example.com\n\n' | ssh -tt user@localhost 'openssl s_client -crlf -ชื่อเซิร์ฟเวอร์ www.example.com -brief -connect www.example.com:443'
-tt บังคับการจัดสรร TTY ซึ่งโดยค่าเริ่มต้น ssh จะไม่ทำ หากตรวจพบไปป์
ข้อเสียคือคุณต้องตั้งค่าการเชื่อมต่อ SSH แบบย้อนกลับให้เข้าสู่ระบบโดยอัตโนมัติเพื่อใช้ในสคริปต์
นี่ไม่ใช่ไบนารีที่ปลอดภัย สำหรับ ASCII อย่างง่ายจะทำ
ด้วยหน้าจอ
ค่อนข้างยาก แต่ลบความยุ่งยากในการเข้าสู่ระบบ
เตรียมไฟล์ สอบถาม
พร้อมบรรทัดสำหรับป้อนข้อมูลไปยังเซิร์ฟเวอร์
ตัวอย่างเช่น:
เก็ท / HTTP/1.0
โฮสต์: www.example.com
สร้างหน้าจอเดี่ยวพร้อมชื่อ หน้าจอของฉัน
และบันทึกเอาต์พุตไปที่ ./out.log
หน้าจอ -d -m -S myscreen -L -Logfile ./out.log
ส่งคำสั่งเชื่อมต่อ openssl (-X สิ่ง) ไปที่หน้าต่างแรก (-p 0) ของหน้าจอชื่อ หน้าจอของฉัน
(-S มายสกรีน) แล้วส่งข้อมูลจากไฟล์ทันที ./สอบถาม
. โปรดทราบว่าการแทนที่กระบวนการ $(cat..) จะทำให้การขึ้นบรรทัดใหม่ต่อท้ายในไฟล์ล้มเหลว ./สอบถาม
และคำสั่ง opensl ต้องมี -crlf ในกรณีของโปรโตคอล HTTP ต้องส่งข้อมูลแบบสอบถามไม่นานหลังจากเปิดการเชื่อมต่อ มิฉะนั้น s_client จะหมดเวลา
หน้าจอ -S myscreen -p 0 -X สิ่งที่ "openssl s_client -crlf -ชื่อเซิร์ฟเวอร์ www.example.com -brief -เชื่อมต่อ www.example.com:443^M";screen -S myscreen -p 0 -X สิ่งที่ "$( แมว ./query)^M^M"
สุดท้ายออกจากหน้าจอเพื่อลบ หน้าจอของฉัน
เซสชัน (ซึ่งถือว่าการสืบค้นก่อนหน้านี้ทำให้เซิร์ฟเวอร์หยุดการเชื่อมต่อแล้วและ s_client ออกจากตัวเอง):
หน้าจอ -S myscreen -p 0 -X สิ่งที่ "ออก ^ M"
เอาต์พุตรวมถึงแบบสอบถามและทางออกและเอาต์พุต s_client อยู่ในตอนนี้ ./out.log
หาก s_client ไม่ออกหลังจากการสืบค้น คุณสามารถส่งสัญญาณขัดจังหวะก่อนได้
หน้าจอ -S myscreen -p 0 -X สิ่ง "^C"