จะพูดคุยกับเซิร์ฟเวอร์ imap ในเชลล์ผ่าน Openssl โดยใช้การบีบอัด imap ได้อย่างไร

ฉันมีปัญหาในการทำความเข้าใจ rfc4978.
ตามที่ฉันเข้าใจ ทุกอย่างถูกบีบอัด หลังจากเซิร์ฟเวอร์ returnOK รวมถึงชื่อคำสั่ง อย่างไรก็ตาม ดูเหมือนว่าฉันเข้าใจผิดหลายประการ (เนื่องจาก[Gmail]/sfgsไม่ได้เปลี่ยนชื่อและเห็นได้ชัดว่าไม่ได้ส่งไฟล์)

 $ cat deflatecommands /dev/stdin | socat - OPENSSL:imap.googlemail.com:993,compress=none
* CAPABILITY IMAP4rev1 UNSELECT IDLE NAMESPACE QUOTA ID XLIST CHILDREN X-GM-EXT-1 UIDPLUS COMPRESS=DEFLATE ENABLE MOVE CONDSTORE ESEARCH UTF8=ACCEPT APPENDLIMIT=35882577 LIST-EXTENDED LIST-STATUS
a001 OK [email protected] authenticated (Success)
a002 OK Success
2016/04/28 21:47:03 socat[16204.25769803872] E SSL_write(): Broken pipe

โดยที่คำสั่ง deflate ประกอบด้วย:

a001 LOGIN myus.tyer mypassord
a002 COMPRESS DEFLATE
xÚK400VrõsôuUPŠvÏMÌ̉Õ/NK/VBp+@‰— Ô)

ซึ่งไม่มีการบีบอัดให้ :

a001 LOGIN myus.tyer mypassord
a002 COMPRESS DEFLATE
a003 RENAME "[Gmail]/sfgs" "[Gmail]/xxxxxxxxxxx"

แน่นอนว่าการสิ้นสุดของ coursedeflatecommandsusescrflline ทั้งในส่วนที่ไม่มีการบีบอัดและการบีบอัด deflatecommandsถูกสร้างด้วย :

$ openssl zlib a003 > a003.zlib
$ cat a001 a002 a003.zlib > defaltecommands

person user2284570    schedule 28.04.2016    source แหล่งที่มา
comment
สิ่งสุดท้ายเนื่องจากความเร็วของการเชื่อมต่อของฉัน ไม่มีการส่งสิ่งใดก่อนa002 OK Successหากพิมพ์บนหน้าจอ   -  person user2284570    schedule 28.04.2016
comment
ฉันไม่แน่ใจว่ามันจะได้ผล คำสั่งทั้งสามคำสั่งจะถูกส่งไปในแพ็กเก็ตเดียว แต่เซิร์ฟเวอร์มีแนวโน้มที่จะล้างบัฟเฟอร์อินพุตเมื่อเปิดใช้งานการบีบอัด คุณอาจจำเป็นต้องหยุดชั่วคราวระหว่างการบีบอัดและคำสั่งที่บีบอัด นอกจากนี้ หากมี CRLF ในส่วนที่ถูกบีบอัด นั่นก็จะเป็นปัญหาเช่นกัน คุณจะต้องแก้ไขไฟล์ในโหมดไบนารี่ และตรวจสอบให้แน่ใจว่าไม่มี CRLF แบบข้อความธรรมดา   -  person Max    schedule 29.04.2016
comment
@Max : ไม่มีการบีบอัด ???????? ???????????????? ina003.zlib และขอย้ำอีกครั้งว่า ไม่มีการส่งไบต์ที่บีบอัดใดๆ ก่อนที่ GImap จะส่งคืนOK Success   -  person user2284570    schedule 30.04.2016
comment
หากคุณแค่เรียกพวกเขา พวกเขาจะออกไปก่อนที่จะได้รับคำตอบ มิฉะนั้นอัปเดตคำถามของคุณด้วยสิ่งที่คุณกำลังทำ :)   -  person Max    schedule 30.04.2016
comment
@Max : ตกลง ตอนนี้ฉันใช้สคริปต์ไลเนอร์ตัวเดียวเพื่อหน่วงเวลาระหว่างคำสั่ง cat (ในขณะที่ท่อเหล็ก) แต่มันจะเพิ่มความสับสนให้กับคำถามของฉันมากเกินไป (และในความเป็นจริงแล้ว ฉันต้องการส่งข้อมูลจำนวนมากที่ต้องมีการบีบอัด ซึ่งไม่ใช่แค่คำสั่งเปลี่ยนชื่อ) จุดยังคงเป็นเซิร์ฟเวอร์ปิดการเชื่อมต่อทันทีที่ได้รับไบต์แรกที่บีบอัดด้วยopenssl zlib   -  person user2284570    schedule 30.04.2016


คำตอบ (1)


ทำไมคุณต้องพูด IMAP จากเชลล์? แม้ว่าฉันจะปรบมือให้กับตัวเลือกของคุณในการไปป์ไลน์จำนวนมากซึ่ง IMAP รองรับ แต่ก็มีข้อจำกัดสำหรับคำสั่งไปป์ไลน์ที่อนุญาต ตามทฤษฎีแล้ว LOGIN นั้นปลอดภัย แต่ฉันจะไม่เข้าคิวอะไรหลังจากนั้นเป็นการส่วนตัวโดยไม่รอผลลัพธ์ (และนี่คือช่วงเวลาที่ท่อเชลล์ไร้เดียงสาของคุณจะถึงขีดจำกัด) COMPRESS DEFLATE ไม่ ปลอดภัยต่อไปป์ไลน์ไม่ว่าด้วยวิธีใดก็ตาม เนื่องจากเซิร์ฟเวอร์ต้องเปิดการบีบอัดแบบโปร่งใส ในหลายภาษา สิ่งนี้มักจะเกี่ยวข้องกับการล้างบัฟเฟอร์เครือข่ายในเลเยอร์ต่างๆ

เหตุใดคุณจึงทำให้เรื่องทั้งหมดซับซ้อนขึ้นด้วยการเปิดใช้งานส่วนขยาย COMPRESS ไม่จำเป็น และจะไม่ช่วยให้คุณประหยัดจำนวนไบต์ที่สามารถวัดได้ในสถานการณ์เฉพาะนี้

person Jan Kundrát    schedule 30.04.2016
comment
It is by no means necessary, and it won't really save you any measurable amount of bytes in this particular scenario. ผิด! ฉันกำลังวางแผนที่จะส่งบางสิ่งที่มีขนาดใหญ่ Gb แต่จะให้ขนาด 50Mb เมื่อบีบอัดแล้ว มันใหญ่เกินกว่าจะทำได้ผ่านไคลเอนต์อีเมลแบบเดิม และจะใช้เวลามากเกินไปในการเชื่อมต่ออินเทอร์เน็ต (ความเร็วในการอัพโหลด) 243Kb/s หากไม่มีการบีบอัด โปรดอย่าคิดว่าฉันกำลังพยายามแก้ไขปัญหาที่ผิด stackoverflow.com/q/14959461/2284570 (และอันที่จริงตอนนี้ฉันใช้เชลล์สคริปต์ขนาดเล็กสำหรับการรอเซิร์ฟเวอร์ ตอบกลับก่อนดำเนินการต่อ) - person user2284570; 30.04.2016
comment
ขอให้โชคดีในการพยายามบันทึกไฟล์ขนาดใหญ่เป็น GB ลงใน GMail อย่างไรก็ตาม คุณเลือกที่จะใช้เชลล์สคริปต์ คุณจะต้องจัดการกับความเจ็บปวดที่เกิดขึ้น - person Jan Kundrát; 13.05.2016