คำถาม (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 -a
0
55710
เป็นพอร์ตชีพจรเพราะผลตอบแทนpactl -s localhost:55710 stat
0
(มันจะพิมพ์ชื่อโฮสต์ของลูกค้าของฉันด้วย!)
(ในการทำ substraction I sort -u
และเก็บเอาท์พุทจากบรรทัดคำสั่งด้านบนและใช้comm
ในการทำ substraction)
Pulseaudio ช่วยให้ฉันระบุลูกค้าและสำหรับทุกเจตนารมณ์และวัตถุประสงค์นี้อาจทำหน้าที่เป็นจุดยึดเพื่อแยกเซสชัน SSH ที่ต้องแยก แต่ผมยังไม่ได้พบวิธีที่จะผูก41273
, 55710
และ6010
เดียวกันsshd
กระบวนการ netstat
จะไม่เปิดเผยข้อมูลนั้นแก่ผู้ใช้ที่ไม่ใช่รูท ฉันเพิ่งได้รับ-
ในPID/Program name
คอลัมน์ที่ฉันต้องการอ่าน2339/54
(ในตัวอย่างนี้) เฉียดฉิว ...
netstat
จะไม่แสดง PID สำหรับกระบวนการที่คุณไม่ได้เป็นเจ้าของหรือที่เป็นพื้นที่เคอร์เนล ตัวอย่างเช่น