คำถาม (TL; DR)
เมื่อกำหนดพอร์ตแบบไดนามิกสำหรับการส่งต่อระยะไกล ( -Rตัวเลือกaka ) สคริปต์บนเครื่องระยะไกล (ตัวอย่างเช่นที่มาจาก.bashrc) จะกำหนดว่าพอร์ตใดถูกเลือกโดย OpenSSH
พื้นหลัง
ฉันใช้ OpenSSH (ทั้งสองด้าน) เพื่อเชื่อมต่อกับเซิร์ฟเวอร์กลางของเราที่ฉันแบ่งปันกับผู้ใช้อื่น ๆ สำหรับเซสชันระยะไกลของฉัน (ตอนนี้) ฉันต้องการส่งต่อ X, ถ้วยและ pulseaudio
สิ่งที่สำคัญที่สุดคือการส่งต่อ X โดยใช้-Xตัวเลือก ที่อยู่ X ที่จัดสรรจะถูกเก็บไว้ในตัวแปรสภาพแวดล้อมDISPLAYและจากนั้นฉันสามารถกำหนดพอร์ต TCP ที่สอดคล้องกันได้ในกรณีส่วนใหญ่อย่างไรก็ตาม DISPLAYแต่ผมแทบจะไม่เคยต้องเพราะเกียรตินิยม Xlib
ฉันต้องการกลไกที่คล้ายกันสำหรับถ้วยและพูลซีดิโอ พื้นฐานสำหรับบริการทั้งสองมีอยู่ในรูปแบบของตัวแปรสภาพแวดล้อมCUPS_SERVERและPULSE_SERVERตามลำดับ นี่คือตัวอย่างการใช้งาน:
ssh -X -R12345:localhost:631 -R54321:localhost:4713 datserver
export CUPS_SERVER=localhost:12345
lowriter #and I can print using my local printer
lpr -P default -o Duplex=DuplexNoTumble minutes.pdf #printing through the tunnel
lpr -H localhost:631 -P default -o Duplex=DuplexNoTumble minutes.pdf #printing remotely
mpg123 mp3s/van_halen/jump.mp3 #annoy co-workers
PULSE_SERVER=localhost:54321 mpg123 mp3s/van_halen/jump.mp3 #listen to music through the tunnel
ปัญหามีการตั้งค่าCUPS_SERVERและPULSE_SERVERถูกต้อง
เราใช้การส่งต่อพอร์ตจำนวนมากและดังนั้นฉันต้องการการจัดสรรพอร์ตแบบไดนามิก การจัดสรรพอร์ตแบบสแตติกไม่ใช่ตัวเลือก
OpenSSH มีกลไกสำหรับการจัดสรรพอร์ตแบบไดนามิกบนเซิร์ฟเวอร์ระยะไกลโดยระบุ0เป็น bind-port สำหรับการส่งต่อระยะไกล ( -Rตัวเลือก) โดยใช้คำสั่งต่อไปนี้ OpenSSH จะจัดสรรพอร์ตสำหรับถ้วยและการส่งต่อพัลส์แบบไดนามิก
ssh -X -R0:localhost:631 -R0:localhost:4713 datserver
เมื่อฉันใช้คำสั่งนั้นsshจะพิมพ์สิ่งต่อไปนี้ไปที่STDERR:
Allocated port 55710 for remote forward to 127.0.0.1:4713
Allocated port 41273 for remote forward to 127.0.0.1:631
มีข้อมูลที่ฉันต้องการ! ในที่สุดฉันต้องการสร้าง:
export CUPS_SERVER=localhost:41273
export PULSE_SERVER=localhost:55710
อย่างไรก็ตามข้อความ "พอร์ตที่จัดสรร ... " ถูกสร้างขึ้นบนเครื่องของฉันและส่งไปยังSTDERRซึ่งฉันไม่สามารถเข้าถึงบนเครื่องระยะไกลได้ OpenSSH ผิดปกติพอดูเหมือนจะไม่มีวิธีดึงข้อมูลเกี่ยวกับการส่งต่อพอร์ต
ฉันจะดึงข้อมูลนั้นเพื่อใส่ลงในเชลล์สคริปต์เพื่อตั้งค่าอย่างเพียงพอCUPS_SERVERและPULSE_SERVERในโฮสต์ระยะไกลได้อย่างไร
ปลายตาย
สิ่งเดียวที่ฉันหาได้ง่ายคือการเพิ่มความละเอียดของsshdข้อมูลจนสามารถอ่านได้จากบันทึก สิ่งนี้ไม่สามารถใช้งานได้เนื่องจากข้อมูลนั้นเปิดเผยข้อมูลมากกว่าที่จะทำให้ผู้ใช้ที่ไม่ใช่รูทเข้าถึงได้ง่าย
ฉันกำลังคิดเกี่ยวกับการปรับปรุง OpenSSH เพื่อรองรับลำดับ escape เพิ่มเติมซึ่งพิมพ์การแสดงที่ดีของ struct ภายในpermitted_opensแต่ถึงแม้ว่านั่นคือสิ่งที่ฉันต้องการฉันยังคงไม่สามารถสคริปต์เข้าถึงไคลเอนต์ escape sequences จากฝั่งเซิร์ฟเวอร์
จะต้องมีวิธีที่ดีกว่า
วิธีการต่อไปนี้ดูเหมือนไม่เสถียรและถูก จำกัด ให้หนึ่งเซสชัน SSH ดังกล่าวต่อผู้ใช้หนึ่งราย อย่างไรก็ตามฉันต้องการเซสชันอย่างน้อยสองรายการพร้อมกันและผู้ใช้รายอื่นมากยิ่งขึ้น แต่ฉันพยายาม ...
เมื่อดวงดาวได้รับการจัดตำแหน่งอย่างเหมาะสมหลังจากเสียสละไก่สักหนึ่งหรือสองตัวฉันสามารถละเมิดความจริงที่sshdไม่ได้เริ่มต้นในฐานะผู้ใช้ของฉัน แต่ได้ลดระดับสิทธิ์หลังจากเข้าสู่ระบบสำเร็จเพื่อทำสิ่งนี้:
รับรายการหมายเลขพอร์ตสำหรับซ็อกเก็ตการฟังทั้งหมดที่เป็นของผู้ใช้ของฉัน
netstat -tlpen | grep ${UID} | sed -e 's/^.*:\([0-9]\+\) .*$/\1/'รับรายการหมายเลขพอร์ตสำหรับซ็อกเก็ตการฟังทั้งหมดที่เป็นของกระบวนการที่ผู้ใช้ของฉันเริ่มต้น
lsof -u ${UID} 2>/dev/null | grep LISTEN | sed -e 's/.*:\([0-9]\+\) (LISTEN).*$/\1/'พอร์ตทั้งหมดที่อยู่ในชุดแรก แต่ไม่ได้อยู่ในชุดที่สองมีโอกาสสูงที่จะเป็นพอร์ตการส่งต่อของฉันและแน่นอนการลบผลผลิตชุด
41273,55710และ6010; ถ้วยชีพจรและ X ตามลำดับ6010ถูกระบุว่าเป็นพอร์ต XDISPLAYโดยใช้41273เป็นท่าเรือถ้วยเพราะผลตอบแทนlpstat -h localhost:41273 -a055710เป็นพอร์ตชีพจรเพราะผลตอบแทนpactl -s localhost:55710 stat0(มันจะพิมพ์ชื่อโฮสต์ของลูกค้าของฉันด้วย!)
(ในการทำ substraction I sort -uและเก็บเอาท์พุทจากบรรทัดคำสั่งด้านบนและใช้commในการทำ substraction)
Pulseaudio ช่วยให้ฉันระบุลูกค้าและสำหรับทุกเจตนารมณ์และวัตถุประสงค์นี้อาจทำหน้าที่เป็นจุดยึดเพื่อแยกเซสชัน SSH ที่ต้องแยก แต่ผมยังไม่ได้พบวิธีที่จะผูก41273, 55710และ6010เดียวกันsshdกระบวนการ netstatจะไม่เปิดเผยข้อมูลนั้นแก่ผู้ใช้ที่ไม่ใช่รูท ฉันเพิ่งได้รับ-ในPID/Program nameคอลัมน์ที่ฉันต้องการอ่าน2339/54(ในตัวอย่างนี้) เฉียดฉิว ...
netstatจะไม่แสดง PID สำหรับกระบวนการที่คุณไม่ได้เป็นเจ้าของหรือที่เป็นพื้นที่เคอร์เนล ตัวอย่างเช่น